现在的位置: 首页 > 综合 > 正文

Android-vold源码分析之挂载SD卡(8)

2013年09月22日 ⁄ 综合 ⁄ 共 1364字 ⁄ 字号 评论关闭

这里续上一篇文章,讲解挂载磁盘的操作:

3.挂载磁盘。这里都有一个const char *类型的参数,这参数保存着每个磁盘的标签信息,比如sd卡的label是sdcard。

  1. int VolumeManager::mountVolume(const char *label) {  
  2.     Volume *v = lookupVolume(label);  
  3.   
  4.     if (!v) {  
  5.         errno = ENOENT;  
  6.         return -1;  
  7.     }  
  8.   
  9.     return v->mountVol();  
  10. }  


lookupVolume函数寻找与label匹配的对象:

  1. Volume *VolumeManager::lookupVolume(const char *label) {  
  2.     VolumeCollection::iterator i;  
  3.   
  4.     for (i = mVolumes->begin(); i != mVolumes->end(); ++i) {  
  5.         if (label[0] == '/') {  
  6.             if (!strcmp(label, (*i)->getMountpoint()))  
  7.                 return (*i);  
  8.         } else {  
  9.             if (!strcmp(label, (*i)->getLabel()))  
  10.                 return (*i);  
  11.         }  
  12.     }  
  13.     return NULL;  
  14. }  


如果找到,直接返回磁盘对象Volume*,挂载操作在mountVol函数里面,该函数内容有点多,贴源码:

  1. int Volume::mountVol() {  
  2.     dev_t deviceNodes[4];  
  3.     int n, i, rc = 0;  
  4.     char errmsg[255];  
  5.   
  6.     if (getState() == Volume::State_NoMedia) {  
  7.         snprintf(errmsg, sizeof(errmsg),  
  8.                  "Volume %s %s mount failed - no media",  
  9.                  getLabel(), getMountpoint());  
  10.         mVm->getBroadcaster()->sendBroadcast(  
  11.                                          ResponseCode::VolumeMountFailedNoMedia,  
  12.                                          errmsg, false);  
  13.         errno = ENODEV;  
  14.         return -1;  
  15.     } else

抱歉!评论已关闭.