vold.fstab DirectVolume
16lz
2021-01-24
/etc/vold.fstab,相当于Linux下的/etc/fstab
系统启动起来,分析该配置文件,挂载相应的分区
- /**********************************************************************************
- **该函数用来解析/etc/vold.fstab配置文件,文本的处理;
- **可能不同的源码版本,有点差异;
- **strsep是字符串的分割函数,可以看出该函数是以"\t"来分割(\t前面有一空格),分割空格
- **或制表格,所以配置文件里面空格与tab键来分割都行;
- **strsep不是ANSIC的函数,但它用来取代strtok函数,strtok是线程不安全的函数。
- **********************************************************************************/
- staticintprocess_config(VolumeManager*vm){
- FILE*fp;
- intn=0;
- charline[255];
- if(!(fp=fopen("/etc/vold.fstab","r"))){
- return-1;
- }
- while(fgets(line,sizeof(line),fp)){
- char*next=line;
- char*type,*label,*mount_point;
- n++;
- line[strlen(line)-1]='\0';
- if(line[0]=='#'||line[0]=='\0')
- continue;
- if(!(type=strsep(&next,"\t"))){
- SLOGE("Errorparsingtype");
- gotoout_syntax;
- }
- if(!(label=strsep(&next,"\t"))){
- SLOGE("Errorparsinglabel");
- gotoout_syntax;
- }
- if(!(mount_point=strsep(&next,"\t"))){
- SLOGE("Errorparsingmountpoint");
- gotoout_syntax;
- }
- if(!strcmp(type,"dev_mount")){
- DirectVolume*dv=NULL;
- char*part,*sysfs_path;
- if(!(part=strsep(&next,"\t"))){
- SLOGE("Errorparsingpartition");
- gotoout_syntax;
- }
- if(strcmp(part,"auto")&&atoi(part)==0){
- SLOGE("Partitionmusteitherbe'auto'or1basedindexinsteadof'%s'",part);
- gotoout_syntax;
- }
- /**********************************************************************************
- **如果配置文件指定为auto,则为自动挂载存储设备,在实例化DirectVolume的对象,传递-1
- **进去,否则将分区序数part传进去;
- **********************************************************************************/
- if(!strcmp(part,"auto")){
- dv=newDirectVolume(vm,label,mount_point,-1);
- }else{
- dv=newDirectVolume(vm,label,mount_point,atoi(part));
- }
- while((sysfs_path=strsep(&next,"\t"))){
- /**********************************************************************************
- **将存储设备在/sys/对应的路径添加进PathCollection容器,该容器为“char*”类型;
- **在/sys/里面可以获取到存储设备的热插拔事件,所以DirectVolume类的主要工作就是针对
- **这里去获取uevent事件的;
- **DirectVolume::handleBlockEvent(NetlinkEvent*evt)函数去得到这些事件,主要还是
- **NetlinkListener类从内核捕获到的。
- **********************************************************************************/
- if(dv->addPath(sysfs_path)){
- SLOGE("Failedtoadddevpath%stovolume%s",sysfs_path,
- label);
- gotoout_fail;
- }
- }
- /**********************************************************************************
- **如果在配置文件有找到正确的挂载参数,那么就会将DirectVolume的对象添加到VolumeCollection
- **容器中,该容器存放着Volume*类型的数据,VolumeManager的对象vm是用来管理这些存储设备的;
- **一块存储设备就会实例化一个Volume对象,但对于手机来说,一般只能识别到一张SD卡。
- **********************************************************************************/
- vm->addVolume(dv);
- }elseif(!strcmp(type,"map_mount")){
- }else{
- SLOGE("Unknowntype'%s'",type);
- gotoout_syntax;
- }
- }
- fclose(fp);
- return0;
- /**********************************************************************************
- **从这个函数的出错处理可以看出,系统源码经常使用到这种高效性的goto技巧,goto在
- **系统中的出错处理用得很频繁,可以说几乎每个文件都使用到了goto跳转函数;
- **很多文章或者教材,经常反面性的批判goto的不规则,但从这些外国的开源代码可以看出,
- **那些牛人都很喜欢用goto,利用了goto来处理出错情况的技巧,显得很漂亮;
- **我觉得,要从实用性的角度来评论这些语言的优缺点,并不能用否认的说法来解释,这样才能
- **不断地进步;
- **所以,如果在出错处理非常多的情况下,使用goto是使代码更可读,减少重复的出错判断的
- **代码量。
- **********************************************************************************/
- out_syntax:
- SLOGE("Syntaxerroronconfigline%d",n);
- errno=-EINVAL;
- out_fail:
- fclose(fp);
- return-1;
- }
DirectVolume
更多相关文章
- C语言函数的递归(上)
- Android培训班(110)start_kernel函数7
- Android(安卓)StateMachine和AsyncChannel
- Android(安卓)修改默认按键不震动
- 工作笔记-code
- Android系统的开机画面显示过程分析(7)
- Android(安卓)handler src track
- Android界面设计
- WindowManager和Window添加View的区别