aboutsummaryrefslogtreecommitdiff
path: root/util-linux
diff options
context:
space:
mode:
authorJérémie Koenig <jk@jk.fr.eu.org>2010-03-26 19:08:53 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2010-03-26 19:08:53 +0100
commitfbedacfc8caa1ec8f14e664a881cb0a93c8f8712 (patch)
tree6c08780bbaad6320149930bdbcfbee5a2eed9f5d /util-linux
parent35fdb1bc9cb82fa5630c2d40ae49110ecd7c88ea (diff)
downloadbusybox-w32-fbedacfc8caa1ec8f14e664a881cb0a93c8f8712.tar.gz
busybox-w32-fbedacfc8caa1ec8f14e664a881cb0a93c8f8712.tar.bz2
busybox-w32-fbedacfc8caa1ec8f14e664a881cb0a93c8f8712.zip
Hurd compat fixes. Mostly dealing with absent PATH_MAX
Signed-off-by: Jérémie Koenig <jk@jk.fr.eu.org> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'util-linux')
-rw-r--r--util-linux/umount.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/util-linux/umount.c b/util-linux/umount.c
index a4b2bd087..a19f86c3a 100644
--- a/util-linux/umount.c
+++ b/util-linux/umount.c
@@ -39,6 +39,10 @@
39# define MS_RELATIME (1 << 21) 39# define MS_RELATIME (1 << 21)
40#endif 40#endif
41#include "libbb.h" 41#include "libbb.h"
42#ifndef PATH_MAX
43# define PATH_MAX (4*1024)
44#endif
45
42 46
43#if defined(__dietlibc__) 47#if defined(__dietlibc__)
44/* 16.12.2006, Sampo Kellomaki (sampo@iki.fi) 48/* 16.12.2006, Sampo Kellomaki (sampo@iki.fi)
@@ -69,7 +73,7 @@ int umount_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
69int umount_main(int argc UNUSED_PARAM, char **argv) 73int umount_main(int argc UNUSED_PARAM, char **argv)
70{ 74{
71 int doForce; 75 int doForce;
72 char *const path = xmalloc(PATH_MAX + 2); /* to save stack */ 76 char *const buf = xmalloc(PATH_MAX * 2 + 128); /* to save stack */
73 struct mntent me; 77 struct mntent me;
74 FILE *fp; 78 FILE *fp;
75 char *fstype = NULL; 79 char *fstype = NULL;
@@ -100,7 +104,7 @@ int umount_main(int argc UNUSED_PARAM, char **argv)
100 if (opt & OPT_ALL) 104 if (opt & OPT_ALL)
101 bb_error_msg_and_die("can't open '%s'", bb_path_mtab_file); 105 bb_error_msg_and_die("can't open '%s'", bb_path_mtab_file);
102 } else { 106 } else {
103 while (getmntent_r(fp, &me, path, PATH_MAX)) { 107 while (getmntent_r(fp, &me, buf, PATH_MAX * 2 + 128)) {
104 /* Match fstype if passed */ 108 /* Match fstype if passed */
105 if (!match_fstype(&me, fstype)) 109 if (!match_fstype(&me, fstype))
106 continue; 110 continue;
@@ -124,10 +128,11 @@ int umount_main(int argc UNUSED_PARAM, char **argv)
124 for (;;) { 128 for (;;) {
125 int curstat; 129 int curstat;
126 char *zapit = *argv; 130 char *zapit = *argv;
131 char *path;
127 132
128 // Do we already know what to umount this time through the loop? 133 // Do we already know what to umount this time through the loop?
129 if (m) 134 if (m)
130 safe_strncpy(path, m->dir, PATH_MAX); 135 path = xstrdup(m->dir);
131 // For umount -a, end of mtab means time to exit. 136 // For umount -a, end of mtab means time to exit.
132 else if (opt & OPT_ALL) 137 else if (opt & OPT_ALL)
133 break; 138 break;
@@ -136,10 +141,12 @@ int umount_main(int argc UNUSED_PARAM, char **argv)
136 if (!zapit) 141 if (!zapit)
137 break; 142 break;
138 argv++; 143 argv++;
139 realpath(zapit, path); 144 path = xmalloc_realpath(zapit);
140 for (m = mtl; m; m = m->next) 145 if (path) {
141 if (!strcmp(path, m->dir) || !strcmp(path, m->device)) 146 for (m = mtl; m; m = m->next)
142 break; 147 if (strcmp(path, m->dir) == 0 || strcmp(path, m->device) == 0)
148 break;
149 }
143 } 150 }
144 // If we couldn't find this sucker in /etc/mtab, punt by passing our 151 // If we couldn't find this sucker in /etc/mtab, punt by passing our
145 // command line argument straight to the umount syscall. Otherwise, 152 // command line argument straight to the umount syscall. Otherwise,
@@ -181,9 +188,13 @@ int umount_main(int argc UNUSED_PARAM, char **argv)
181 // Find next matching mtab entry for -a or umount /dev 188 // Find next matching mtab entry for -a or umount /dev
182 // Note this means that "umount /dev/blah" will unmount all instances 189 // Note this means that "umount /dev/blah" will unmount all instances
183 // of /dev/blah, not just the most recent. 190 // of /dev/blah, not just the most recent.
184 if (m) while ((m = m->next) != NULL) 191 if (m) {
185 if ((opt & OPT_ALL) || !strcmp(path, m->device)) 192 while ((m = m->next) != NULL)
186 break; 193 // NB: if m is non-NULL, path is non-NULL as well
194 if ((opt & OPT_ALL) || strcmp(path, m->device) == 0)
195 break;
196 }
197 free(path);
187 } 198 }
188 199
189 // Free mtab list if necessary 200 // Free mtab list if necessary
@@ -195,7 +206,7 @@ int umount_main(int argc UNUSED_PARAM, char **argv)
195 free(mtl); 206 free(mtl);
196 mtl = m; 207 mtl = m;
197 } 208 }
198 free(path); 209 free(buf);
199 } 210 }
200 211
201 return status; 212 return status;