vold.c
function main:
/*
这个函数主要是load vold的config文件/system/etc/vold.conf , 然后查看一下config文件里的东西有没已经mount起来
*/
volmgr_bootsrap();
{
/*
load config文件, 以volume_udisk结果为单位做成一个链表
*/
volmgr_readconfig("/system/etc/vold.conf");
/*
check mount point, 读文件/proc/mounts 与config文件的mount_point对比一下即可
读/proc/mounts 时有个sscan函数的用法要理解:就是%s 并不是遇到结束符才返回,遇到空格就可返回
*/
volume_t *v = vol_root;
while (v) {
if (_mountpoint_mounted(v->mount_point)) {
LOGW("Volume '%s' already mounted at startup", v->mount_point);
v->state = volstate_mounted;
}
v = v->next;
}
}
/*
挂载现有的mmc设备。
思路是找到设备注册的目录,在/sys/class/mmc_host/下,没有设备的情况是只有文件(event subsystem power device)
有设备的情况是 :如 /sys/class/mmc_host/mmc2/mmc2:0001
*/
mmc_bootstrap()
{
/*
构建uevent_params, 调用 simulate_uevent: MMC_TYPE= ; MMC_NAME= ; path= ;
*/
simulate_uevent("mmc", devpath, "add", uevent_params);
/*
这函数最终调用 handle_mmc_event
*/
handle_mmc_event()
{
/*
add remove 一个media
typedef struct media {
char *devpath;
char *name;
uint32_t serial;
media_type_t media_type;
blkdev_list_t *devs;
} media_t;
*/
}
/*
后面的检查分区类似
*/
}
while(1)
{
/*
接收及发送message
*/
{
········
FD_ZERO(&read_fds);//初始化文件描述集合
FD_SET(door_sock, &read_fds);//将door_sock加入文件描述集
if (door_sock > max)
max = door_sock;
FD_SET(uevent_sock, &read_fds);//将event_sock加入文件描述集
if (uevent_sock > max)
max = uevent_sock;
if (fw_sock != -1) {
FD_SET(fw_sock, &read_fds);//将fw_sock加入文件描述集
if (fw_sock > max)
max = fw_sock;
}
//当所有的文件描述符都没改变时,阻塞线程
if ((rc = select(max + 1, &read_fds, NULL, NULL, &to)) < 0) {
LOGE("select() failed (%s)", strerror(errno));
sleep(1);
continue;
}
if (!rc) {
continue;
}
//检测如果是door_sock,检测与framework的连接,并发送msg
if (FD_ISSET(door_sock, &read_fds)) {
struct sockaddr addr;
socklen_t alen;
alen = sizeof(addr);
if (fw_sock != -1) {
LOGE("Dropping duplicate framework connection");
int tmp = accept(door_sock, &addr, &alen);
close(tmp);
continue;
}
if ((fw_sock = accept(door_sock, &addr, &alen)) < 0) {
LOGE("Unable to accept framework connection (%s)",
strerror(errno));
}
LOG_VOL("Accepted connection from framework");
if ((rc = volmgr_send_states()) < 0) {
LOGE("Unable to send volmgr status to framework (%d)", rc);
}
}
//如果是fw_sock,执行framework传来的命令
if (FD_ISSET(fw_sock, &read_fds)) {
if ((rc = process_framework_command(fw_sock)) < 0) {
if (rc == -ECONNRESET) {
LOGE("Framework disconnected");
close(fw_sock);
fw_sock = -1;
} else {
LOGE("Error processing framework command (%s)",
strerror(errno));
}
}
}
//如果是uevent_sock,产生一个uevent事件
if (FD_ISSET(uevent_sock, &read_fds)) {
if ((rc = process_uevent_message(uevent_sock)) < 0) {
LOGE("Error processing uevent msg (%s)", strerror(errno));
}
}
} // while
}
/*
android 本身只支持mmc ,没有udisk, 加udisk时参考mmc.c 即可。
但应该注意是否有mmc的设备被mount起
*/