/etc/vold.fstab,相当于Linux下的/etc/fstab

系统启动起来,分析该配置文件,挂载相应的分区

  1. /**********************************************************************************
  2. **该函数用来解析/etc/vold.fstab配置文件,文本的处理;
  3. **可能不同的源码版本,有点差异;
  4. **strsep是字符串的分割函数,可以看出该函数是以"\t"来分割(\t前面有一空格),分割空格
  5. **或制表格,所以配置文件里面空格与tab键来分割都行;
  6. **strsep不是ANSIC的函数,但它用来取代strtok函数,strtok是线程不安全的函数。
  7. **********************************************************************************/
  8. staticintprocess_config(VolumeManager*vm){
  9. FILE*fp;
  10. intn=0;
  11. charline[255];
  12. if(!(fp=fopen("/etc/vold.fstab","r"))){
  13. return-1;
  14. }
  15. while(fgets(line,sizeof(line),fp)){
  16. char*next=line;
  17. char*type,*label,*mount_point;
  18. n++;
  19. line[strlen(line)-1]='\0';
  20. if(line[0]=='#'||line[0]=='\0')
  21. continue;
  22. if(!(type=strsep(&next,"\t"))){
  23. SLOGE("Errorparsingtype");
  24. gotoout_syntax;
  25. }
  26. if(!(label=strsep(&next,"\t"))){
  27. SLOGE("Errorparsinglabel");
  28. gotoout_syntax;
  29. }
  30. if(!(mount_point=strsep(&next,"\t"))){
  31. SLOGE("Errorparsingmountpoint");
  32. gotoout_syntax;
  33. }
  34. if(!strcmp(type,"dev_mount")){
  35. DirectVolume*dv=NULL;
  36. char*part,*sysfs_path;
  37. if(!(part=strsep(&next,"\t"))){
  38. SLOGE("Errorparsingpartition");
  39. gotoout_syntax;
  40. }
  41. if(strcmp(part,"auto")&&atoi(part)==0){
  42. SLOGE("Partitionmusteitherbe'auto'or1basedindexinsteadof'%s'",part);
  43. gotoout_syntax;
  44. }
  45. /**********************************************************************************
  46. **如果配置文件指定为auto,则为自动挂载存储设备,在实例化DirectVolume的对象,传递-1
  47. **进去,否则将分区序数part传进去;
  48. **********************************************************************************/
  49. if(!strcmp(part,"auto")){
  50. dv=newDirectVolume(vm,label,mount_point,-1);
  51. }else{
  52. dv=newDirectVolume(vm,label,mount_point,atoi(part));
  53. }
  54. while((sysfs_path=strsep(&next,"\t"))){
  55. /**********************************************************************************
  56. **将存储设备在/sys/对应的路径添加进PathCollection容器,该容器为“char*”类型;
  57. **在/sys/里面可以获取到存储设备的热插拔事件,所以DirectVolume类的主要工作就是针对
  58. **这里去获取uevent事件的;
  59. **DirectVolume::handleBlockEvent(NetlinkEvent*evt)函数去得到这些事件,主要还是
  60. **NetlinkListener类从内核捕获到的。
  61. **********************************************************************************/
  62. if(dv->addPath(sysfs_path)){
  63. SLOGE("Failedtoadddevpath%stovolume%s",sysfs_path,
  64. label);
  65. gotoout_fail;
  66. }
  67. }
  68. /**********************************************************************************
  69. **如果在配置文件有找到正确的挂载参数,那么就会将DirectVolume的对象添加到VolumeCollection
  70. **容器中,该容器存放着Volume*类型的数据,VolumeManager的对象vm是用来管理这些存储设备的;
  71. **一块存储设备就会实例化一个Volume对象,但对于手机来说,一般只能识别到一张SD卡。
  72. **********************************************************************************/
  73. vm->addVolume(dv);
  74. }elseif(!strcmp(type,"map_mount")){
  75. }else{
  76. SLOGE("Unknowntype'%s'",type);
  77. gotoout_syntax;
  78. }
  79. }
  80. fclose(fp);
  81. return0;
  82. /**********************************************************************************
  83. **从这个函数的出错处理可以看出,系统源码经常使用到这种高效性的goto技巧,goto在
  84. **系统中的出错处理用得很频繁,可以说几乎每个文件都使用到了goto跳转函数;
  85. **很多文章或者教材,经常反面性的批判goto的不规则,但从这些外国的开源代码可以看出,
  86. **那些牛人都很喜欢用goto,利用了goto来处理出错情况的技巧,显得很漂亮;
  87. **我觉得,要从实用性的角度来评论这些语言的优缺点,并不能用否认的说法来解释,这样才能
  88. **不断地进步;
  89. **所以,如果在出错处理非常多的情况下,使用goto是使代码更可读,减少重复的出错判断的
  90. **代码量。
  91. **********************************************************************************/
  92. out_syntax:
  93. SLOGE("Syntaxerroronconfigline%d",n);
  94. errno=-EINVAL;
  95. out_fail:
  96. fclose(fp);
  97. return-1;
  98. }

DirectVolume

更多相关文章

  1. C语言函数的递归(上)
  2. Android培训班(110)start_kernel函数7
  3. Android(安卓)StateMachine和AsyncChannel
  4. Android(安卓)修改默认按键不震动
  5. 工作笔记-code
  6. Android系统的开机画面显示过程分析(7)
  7. Android(安卓)handler src track
  8. Android界面设计
  9. WindowManager和Window添加View的区别

随机推荐

  1. Android相机开发那些坑
  2. Android(安卓)jetpack Room数据库(一)基本
  3. 一个android访问http资源的便捷工具类―
  4. Android(安卓)JNI入门第一篇――HelloWor
  5. Android(安卓)访问网络连接设置界面
  6. android 使内容铺满全屏
  7. Android(安卓)studio图片ERROR: 9-patch
  8. android沉浸式状态栏实现,android沉浸式状
  9. Socket编程java[简单易懂],附带Android(
  10. gradle clean报错Could not find manifes