X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=mount.c;h=1d581ea2358f10c3182fb326a8e6338fa73268ea;hb=5f2c419109126ead730006366c6b4e83719523cf;hp=bf5fbfdd2fdeaba22b6f6e1aee49b29bdb63c35c;hpb=04b897f8feaca344d4d6fbefc65f1cbd10743390;p=project%2Fmountd.git diff --git a/mount.c b/mount.c index bf5fbfd..1d581ea 100644 --- a/mount.c +++ b/mount.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -11,12 +12,10 @@ #include #include #include -#include -#include +#include #include #include #include -#include #include #include "include/log.h" @@ -152,7 +151,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 tmp[64], tmp2[64]; + char dev_path[64], dev_link[64], tmp[64]; mount = malloc(sizeof(struct mount)); INIT_LIST_HEAD(&mount->list); @@ -171,10 +170,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(tmp, 64, "%s%s", uci_path, name); - snprintf(tmp2, 64, "/tmp/run/mountd/%s", dev); - symlink(tmp2, tmp); + + snprintf(dev_link, sizeof(dev_link), "%s%s", uci_path, name); + snprintf(dev_path, sizeof(dev_path), "%s%s", "/tmp/run/mountd/", dev); + /* 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 +591,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 +771,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;