X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fmountd.git;a=blobdiff_plain;f=mount.c;h=bf5fbfdd2fdeaba22b6f6e1aee49b29bdb63c35c;hp=9a291d7b47dce6bdd649c23e1a8c26a309fbc754;hb=04b897f8feaca344d4d6fbefc65f1cbd10743390;hpb=bc4a6dda94adf7c2a8f4274dd5b38a13e5c2c18b;ds=sidebyside diff --git a/mount.c b/mount.c index 9a291d7..bf5fbfd 100644 --- a/mount.c +++ b/mount.c @@ -31,7 +31,22 @@ int mount_new(char *path, char *dev); -struct list_head mounts; +static struct list_head mounts; + +/** + * enum status - status of mount entry + * + * @STATUS_UNMOUNTED: currently not mounted + * @STATUS_MOUNTED: mounted & ready for usage + * @STATUS_EXPIRED: mount expired & *temporary* unmounted + * @STATUS_IGNORE: entry should be ignored and never mounted + */ +enum status { + STATUS_UNMOUNTED = 0, + STATUS_MOUNTED, + STATUS_EXPIRED, + STATUS_IGNORE, +}; struct mount { struct list_head list; @@ -41,14 +56,13 @@ struct mount { char vendor[64]; char model[64]; char rev[64]; - int mounted; - int ignore; + enum status status; char size[64]; char sector_size[64]; int fs; }; -char *fs_names[] = { +static char *fs_names[] = { "", "", "mbr", @@ -67,8 +81,8 @@ char *fs_names[] = { #define MAX_MOUNTED 32 #define MAX_MOUNT_NAME 32 -char mounted[MAX_MOUNTED][3][MAX_MOUNT_NAME]; -int mounted_count = 0; +static char mounted[MAX_MOUNTED][3][MAX_MOUNT_NAME]; +static int mounted_count = 0; extern char uci_path[32]; static void mount_dump_uci_state(void) @@ -95,7 +109,7 @@ static void mount_dump_uci_state(void) ucix_add_option(ctx, mountd, q->serial, "disc", t); ucix_add_option(ctx, mountd, q->serial, "sector_size", q->sector_size); snprintf(t, 64, "part%dmounted", atoi(&q->dev[3])); - ucix_add_option(ctx, mountd, q->serial, t, (q->mounted)?("1"):("0")); + ucix_add_option(ctx, mountd, q->serial, t, q->status == STATUS_MOUNTED ? "1" : "0"); ucix_add_option(ctx, mountd, q->serial, "vendor", q->vendor); ucix_add_option(ctx, mountd, q->serial, "model", q->model); ucix_add_option(ctx, mountd, q->serial, "rev", q->rev); @@ -106,9 +120,9 @@ static void mount_dump_uci_state(void) snprintf(t, 64, "fs%d", atoi(&q->dev[3])); ucix_add_option(ctx, mountd, q->serial, t, fs_names[q->fs]); } - if(q->mounted) + if (q->status == STATUS_MOUNTED) mounted++; - if((!q->ignore) && q->size && q->sector_size) + if ((q->status != STATUS_IGNORE) && q->size && q->sector_size) size = size + (((unsigned long long int)atoi(q->size)) * ((unsigned long long int)atoi(q->sector_size))); } ucix_add_option_int(ctx, mountd, mountd, "mounted", mounted); @@ -139,8 +153,7 @@ static void mount_add_list(char *name, char *dev, char *serial, { struct mount *mount; char tmp[64], tmp2[64]; - if(fs <= MBR || fs > LASTFS) - return; + mount = malloc(sizeof(struct mount)); INIT_LIST_HEAD(&mount->list); strncpy(mount->vendor, vendor, 64); @@ -151,18 +164,19 @@ static void mount_add_list(char *name, char *dev, char *serial, strncpy(mount->serial, serial, 64); strncpy(mount->size, size, 64); strncpy(mount->sector_size, sector_size, 64); - mount->ignore = ignore; - mount->mounted = 0; + mount->status = STATUS_UNMOUNTED; mount->fs = fs; list_add(&mount->list, &mounts); - if((!mount->ignore) && (mount->fs > MBR) && (mount->fs <= LASTFS)) - { + + if (ignore) { + mount->status = STATUS_IGNORE; + } else { log_printf("new mount : %s -> %s (%s)\n", name, dev, fs_names[mount->fs]); snprintf(tmp, 64, "%s%s", uci_path, name); snprintf(tmp2, 64, "/tmp/run/mountd/%s", dev); symlink(tmp2, tmp); - mount_new("/tmp/run/mountd/", dev); - system_printf("ACTION=add DEVICE=%s NAME=%s /sbin/hotplug-call mount", dev, name); + if (!mount_new("/tmp/run/mountd/", dev)) + system_printf("ACTION=add DEVICE=%s NAME=%s /sbin/hotplug-call mount", dev, name); } } @@ -174,7 +188,6 @@ static int mount_check_disc(char *disc) if(!fp) { log_printf("error reading /proc/mounts"); - fclose(fp); return avail; } while((fgets(tmp, 256, fp) != NULL) && (avail == -1)) @@ -221,7 +234,7 @@ int mount_new(char *path, char *dev) log_printf("request for invalid path %s%s\n", path, dev); return -1; } - if(mount->ignore || mount->mounted || mount->fs == EXTENDED) + if (mount->status == STATUS_IGNORE || mount->status == STATUS_MOUNTED || mount->fs == EXTENDED) return -1; snprintf(tmp, 256, "%s%s", path, mount->dev); log_printf("mounting %s\n", tmp); @@ -294,11 +307,13 @@ int mount_new(char *path, char *dev) pid = waitpid(pid, &ret, 0); ret = WEXITSTATUS(ret); log_printf("----------> mount ret = %d\n", ret); - if(ret && (ret != 0xff)) + if (ret && ret != 0xff) { + rmdir(tmp); return -1; + } if(mount_wait_for_disc(mount->dev) == 0) { - mount->mounted = 1; + mount->status = STATUS_MOUNTED; mount_dump_uci_state(); } else return -1; return 0; @@ -310,14 +325,14 @@ int mount_remove(char *path, char *dev) char tmp[256]; int ret; snprintf(tmp, 256, "%s%s", path, dev); - log_printf("%s has expired... unmounting\n", tmp); + log_printf("device %s has expired... unmounting %s\n", dev, tmp); ret = system_printf("/bin/umount %s", tmp); if(ret != 0) return 0; rmdir(tmp); mount = mount_find(0, dev); if(mount) - mount->mounted = 0; + mount->status = STATUS_EXPIRED; log_printf("finished unmounting\n"); mount_dump_uci_state(); return 0; @@ -452,6 +467,7 @@ static void mount_dev_add(char *dev) char sector_size[64]; FILE *fp; int offset = 3; + int fs; strcpy(name, dev); if (!strncmp(name, "mmcblk", 6)) @@ -557,28 +573,25 @@ static void mount_dev_add(char *dev) fclose(fp); } snprintf(tmp, 64, "/dev/%s", dev); - mount_add_list(node, dev, s, vendor, model, rev, ignore, size, sector_size, detect_fs(tmp)); + fs = detect_fs(tmp); + if (fs <= MBR || fs > LASTFS) { + ignore = 1; + } + mount_add_list(node, dev, s, vendor, model, rev, ignore, size, sector_size, fs); mount_dump_uci_state(); } } -static void mount_dev_del(char *dev) +static void mount_dev_del(struct mount *mount) { - struct mount *mount = mount_find(0, dev); char tmp[256]; - if(mount) - { - if(mount->mounted) - { - snprintf(tmp, 256, "%s%s", "/tmp/run/mountd/", mount->name); - log_printf("%s has dissappeared ... unmounting\n", tmp); - snprintf(tmp, 256, "%s%s", "/tmp/run/mountd/", mount->dev); - system_printf("/bin/umount %s", tmp); - rmdir(tmp); - snprintf(tmp, 64, "%s%s", uci_path, mount->name); - unlink(tmp); - mount_dump_uci_state(); - } + + if (mount->status == STATUS_MOUNTED) { + snprintf(tmp, 256, "%s%s", "/tmp/run/mountd/", mount->dev); + log_printf("device %s has disappeared ... unmounting %s\n", mount->dev, tmp); + system_printf("/bin/umount %s", tmp); + rmdir(tmp); + mount_dump_uci_state(); } } @@ -588,7 +601,7 @@ void mount_dump_list(void) list_for_each(p, &mounts) { struct mount *q = container_of(p, struct mount, list); - log_printf("* %s %s %d\n", q->name, q->dev, q->mounted); + log_printf("* %s %s %d\n", q->name, q->dev, q->status == STATUS_MOUNTED); } } @@ -607,7 +620,7 @@ char* is_mounted(char *block, char *path) return 0; } -static void mount_check_mount_list(void) +static void mount_update_mount_list(void) { FILE *fp = fopen("/proc/mounts", "r"); char tmp[256]; @@ -615,13 +628,18 @@ static void mount_check_mount_list(void) if(!fp) { log_printf("error reading /proc/mounts"); - fclose(fp); return; } mounted_count = 0; while(fgets(tmp, 256, fp) != NULL) { char *t, *t2; + + if (mounted_count + 1 > MAX_MOUNTED) { + log_printf("found more than %d mounts \n", MAX_MOUNTED); + break; + } + t = strstr(tmp, " "); if(t) { @@ -647,10 +665,8 @@ static void mount_check_mount_list(void) mounted[mounted_count][0], mounted[mounted_count][1], mounted[mounted_count][2]);*/ - if(mounted_count < MAX_MOUNTED - 1) - mounted_count++; - else - log_printf("found more than %d mounts \n", MAX_MOUNTED); + + mounted_count++; } fclose(fp); } @@ -663,8 +679,8 @@ static int dir_filter2(const struct dirent *a) return 0; } #define MAX_BLOCK 64 -char block[MAX_BLOCK][MAX_BLOCK]; -int blk_cnt = 0; +static char block[MAX_BLOCK][MAX_BLOCK]; +static int blk_cnt = 0; static int check_block(char *b) { @@ -723,11 +739,11 @@ static void mount_enum_drives(void) ctx = ucix_init("mountd"); t = ucix_get_option(ctx, "mountd", q->serial, tmp); ucix_cleanup(ctx); - if(t && !q->mounted) + if (t && q->status != STATUS_MOUNTED) { if(!strcmp(t, "0")) { - if(!q->ignore) + if (q->status != STATUS_IGNORE) del = 1; } else if(!strcmp(t, "1")) { @@ -740,16 +756,16 @@ static void mount_enum_drives(void) } if(!check_block(q->dev)||del) { - mount_dev_del(q->dev); + mount_dev_del(q); p->prev->next = p->next; p->next->prev = p->prev; p = p->next; - log_printf("removing %s\n", q->dev); - snprintf(tmp, 64, "%s%s", "/tmp/run/mountd/", q->dev); - rmdir(tmp); - snprintf(tmp, 64, "%s%s", uci_path, q->name); - unlink(tmp); - system_printf("ACTION=remove DEVICE=%s NAME=%s /sbin/hotplug-call mount", q->dev, q->name); + if (q->status == STATUS_MOUNTED || q->status == STATUS_EXPIRED) { + snprintf(tmp, 64, "%s%s", uci_path, q->name); + log_printf("unlinking %s\n", tmp); + unlink(tmp); + system_printf("ACTION=remove DEVICE=%s NAME=%s /sbin/hotplug-call mount", q->dev, q->name); + } free(q); mount_dump_uci_state(); system_printf("/etc/fonstated/ReloadSamba"); @@ -769,7 +785,7 @@ static void mount_check_enum(void) void mount_init(void) { INIT_LIST_HEAD(&mounts); - timer_add(mount_check_mount_list, 2); + timer_add(mount_update_mount_list, 2); timer_add(mount_check_enum, 1); - mount_check_mount_list(); + mount_update_mount_list(); }