X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=mount.c;h=00fe91dbde9b82db2b8975f95935724ecb9ff23f;hb=aaf2743670ef230a6a8922030ac30d2303e2accd;hp=f2c15a0a16a9d4c99f1bc5a601fe32f4566b5783;hpb=76766aef149ac5b9562ab9bcca33830f80beab9d;p=project%2Fmountd.git diff --git a/mount.c b/mount.c index f2c15a0..00fe91d 100644 --- a/mount.c +++ b/mount.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -11,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -152,7 +154,7 @@ static void mount_add_list(char *name, char *dev, char *serial, char *vendor, char *model, char *rev, int ignore, char *size, char *sector_size, int fs) { struct mount *mount; - char dev_path[64], dev_link[64]; + char dev_path[64], dev_link[64], tmp[64]; mount = malloc(sizeof(struct mount)); INIT_LIST_HEAD(&mount->list); @@ -171,10 +173,20 @@ static void mount_add_list(char *name, char *dev, char *serial, if (ignore) { mount->status = STATUS_IGNORE; } else { + struct stat st; + log_printf("new mount : %s -> %s (%s)\n", name, dev, fs_names[mount->fs]); + snprintf(dev_link, sizeof(dev_link), "%s%s", uci_path, name); snprintf(dev_path, sizeof(dev_path), "%s%s", "/tmp/run/mountd/", dev); - symlink(dev_path, dev_link); + /* If link aleady exists - replace it */ + if (lstat(dev_link, &st) == 0 && S_ISLNK(st.st_mode)) { + snprintf(tmp, sizeof(tmp), "%s%s", uci_path, "tmp"); + symlink(dev_path, tmp); + rename(tmp, dev_link); + } else { + symlink(dev_path, dev_link); + } if (!mount_new("/tmp/run/mountd/", dev)) system_printf("ACTION=add DEVICE=%s NAME=%s /sbin/hotplug-call mount", dev, name); } @@ -582,17 +594,23 @@ static void mount_dev_add(char *dev) } } -static void mount_dev_del(struct mount *mount) +static int mount_dev_del(struct mount *mount) { char tmp[256]; + int err = 0; 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); + if (umount(tmp)) { + err = -errno; + umount2(tmp, MNT_DETACH); + } rmdir(tmp); mount_dump_uci_state(); } + + return err; } void mount_dump_list(void) @@ -756,17 +774,33 @@ static void mount_enum_drives(void) } if(!check_block(q->dev)||del) { - mount_dev_del(q); - p->prev->next = p->next; - p->next->prev = p->prev; - p = p->next; 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); + char dev_link[64]; + int err; + system_printf("ACTION=remove DEVICE=%s NAME=%s /sbin/hotplug-call mount", q->dev, q->name); + + err = mount_dev_del(q); + + snprintf(dev_link, sizeof(dev_link), "%s%s", uci_path, q->name); + if (err == -EBUSY) { + /* Create "tmp" symlink to non-existing path */ + snprintf(tmp, sizeof(tmp), "%s%s", uci_path, "tmp"); + symlink("## DEVICE MISSING ##", tmp); + + /* Replace old symlink with the not working one */ + rename(tmp, dev_link); + } else { + log_printf("unlinking %s\n", dev_link); + unlink(dev_link); + } } + + p->prev->next = p->next; + p->next->prev = p->prev; + p = p->next; free(q); + mount_dump_uci_state(); system_printf("/etc/fonstated/ReloadSamba"); } else p = p->next;