vold.fstab DirectVolume
来源:互联网 发布:幼儿园网络培训意义 编辑:程序博客网 时间:2024/06/10 12:36
/etc/vold.fstab,相当于Linux下的/etc/fstab
系统启动起来,分析该配置文件,挂载相应的分区
- /**********************************************************************************
- **该函数用来解析/etc/vold.fstab配置文件,文本的处理;
- **可能不同的源码版本,有点差异;
- **strsep是字符串的分割函数,可以看出该函数是以" \t"来分割(\t前面有一空格),分割空格
- **或制表格,所以配置文件里面空格与tab键来分割都行;
- **strsep不是ANSI C的函数,但它用来取代strtok函数,strtok是线程不安全的函数。
- **********************************************************************************/
- static int process_config(VolumeManager *vm) {
- FILE *fp;
- int n = 0;
- char line[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("Error parsing type");
- goto out_syntax;
- }
- if (!(label = strsep(&next, " \t"))) {
- SLOGE("Error parsing label");
- goto out_syntax;
- }
- if (!(mount_point = strsep(&next, " \t"))) {
- SLOGE("Error parsing mount point");
- goto out_syntax;
- }
- if (!strcmp(type, "dev_mount")) {
- DirectVolume *dv = NULL;
- char *part, *sysfs_path;
- if (!(part = strsep(&next, " \t"))) {
- SLOGE("Error parsing partition");
- goto out_syntax;
- }
- if (strcmp(part, "auto") && atoi(part) == 0) {
- SLOGE("Partition must either be 'auto' or 1 based index instead of '%s'", part);
- goto out_syntax;
- }
- /**********************************************************************************
- **如果配置文件指定为auto,则为自动挂载存储设备,在实例化DirectVolume的对象,传递-1
- **进去,否则将分区序数part传进去;
- **********************************************************************************/
- if (!strcmp(part, "auto")) {
- dv = new DirectVolume(vm, label, mount_point, -1);
- } else {
- dv = new DirectVolume(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("Failed to add devpath %s to volume %s", sysfs_path,
- label);
- goto out_fail;
- }
- }
- /**********************************************************************************
- **如果在配置文件有找到正确的挂载参数,那么就会将DirectVolume的对象添加到VolumeCollection
- **容器中,该容器存放着Volume*类型的数据,VolumeManager的对象vm是用来管理这些存储设备的;
- **一块存储设备就会实例化一个Volume对象,但对于手机来说,一般只能识别到一张SD卡。
- **********************************************************************************/
- vm->addVolume(dv);
- } else if (!strcmp(type, "map_mount")) {
- } else {
- SLOGE("Unknown type '%s'", type);
- goto out_syntax;
- }
- }
- fclose(fp);
- return 0;
- /**********************************************************************************
- **从这个函数的出错处理可以看出,系统源码经常使用到这种高效性的goto技巧,goto在
- **系统中的出错处理用得很频繁,可以说几乎每个文件都使用到了goto跳转函数;
- **很多文章或者教材,经常反面性的批判goto的不规则,但从这些外国的开源代码可以看出,
- **那些牛人都很喜欢用goto,利用了goto来处理出错情况的技巧,显得很漂亮;
- **我觉得,要从实用性的角度来评论这些语言的优缺点,并不能用否认的说法来解释,这样才能
- **不断地进步;
- **所以,如果在出错处理非常多的情况下,使用goto是使代码更可读,减少重复的出错判断的
- **代码量。
- **********************************************************************************/
- out_syntax:
- SLOGE("Syntax error on config line %d", n);
- errno = -EINVAL;
- out_fail:
- fclose(fp);
- return -1;
- }
DirectVolume
- vold.fstab DirectVolume
- android系统mount详情--vold.fstab (转载)
- android vold.fstab的生成过程
- vold
- --fstab--
- fstab
- fstab
- fstab
- fstab
- android vold:图解VOLD
- Android VOLD
- Android vold
- android vold
- Vold分析
- vold study
- vold分析
- vold NetlinkManager
- vold VolumeManager
- 【vim】替换(一)
- 红黑树实现(Java语言)
- 黑马程序员_java-String类
- 大数据量、高效通信及入库程序设计的关键实现技术要求
- Java泛型简明教程
- vold.fstab DirectVolume
- 简单记录ORA-15063
- Java建立URL请求
- clojure测试说明
- 在MinGW下编译ffmpeg
- 【OpenCV入门指南】第八篇 灰度直方图
- javascript 冒泡
- 简明 Vim 练级攻略
- 黑马程序员_java集合框架