httpd: do not clear environment
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 15 Sep 2007 13:28:30 +0000 (13:28 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 15 Sep 2007 13:28:30 +0000 (13:28 -0000)
mount: mount helpers support (by Vladimir Dronnikov <dronnikov@gmail.ru>)

networking/httpd.c
util-linux/Config.in
util-linux/mount.c

index a888c242434e54f82496de6ae00d7a9436f82790..a8e5df98cb0522ade74d96c6e8f9b9acd04fbce9 100644 (file)
@@ -2089,7 +2089,13 @@ int httpd_main(int argc, char **argv)
 #endif
        }
 
-#if ENABLE_FEATURE_HTTPD_CGI
+#if 0 /*was #if ENABLE_FEATURE_HTTPD_CGI*/
+       /* User can do it himself: 'env - PATH="$PATH" httpd'
+        * We don't do it because we don't want to screw users
+        * which want to do
+        * 'env - VAR1=val1 VAR2=val2 https'
+        * and have VAR1 and VAR2 values visible in their CGIs.
+        * Besides, it is also smaller. */
        {
                char *p = getenv("PATH");
                /* env strings themself are not freed, no need to strdup(p): */
index c9108134b2178545ffe69ba7546d94a63b40dd47..107382f51189c9a134f2b82d022dca43c9699fb0 100644 (file)
@@ -360,6 +360,16 @@ config MOUNT
          NFS filesystems.  Most people using BusyBox will also want to enable
          the 'mount' utility.
 
+config FEATURE_MOUNT_HELPERS
+       bool "Support mount helpers"
+       default n
+       depends on MOUNT
+       help
+         Enable mounting of virtual file systems via external helpers.
+         E.g. mount obexfs#-b00.11.22.33.44.55 /mnt will in effect call
+         obexfs -b00.11.22.33.44.55 /mnt
+         The idea is to use such virtual filesystems in /etc/fstab
+
 config FEATURE_MOUNT_NFS
        bool "Support mounting NFS file systems"
        default n
index 91f09e15cda17952d90640a7f508199fbb3fe9d2..d391a26e19991619ea7942d661b8b3ba8acf628c 100644 (file)
@@ -18,8 +18,8 @@
    mount_it_now() does the actual mount.
 */
 
-#include "libbb.h"
 #include <mntent.h>
+#include "libbb.h"
 
 /* Needed for nfs support only... */
 #include <syslog.h>
 #include <rpc/pmap_prot.h>
 #include <rpc/pmap_clnt.h>
 
+#ifndef MS_SILENT
+#define MS_SILENT      (1 << 15)
+#endif
 
 #if defined(__dietlibc__)
 /* 16.12.2006, Sampo Kellomaki (sampo@iki.fi)
  * dietlibc-0.30 does not have implementation of getmntent_r() */
-/* OTOH: why we use getmntent_r instead of getmntent? TODO... */
 struct mntent *getmntent_r(FILE* stream, struct mntent* result, char* buffer, int bufsize)
 {
-       /* *** XXX FIXME WARNING: This hack is NOT thread safe. --Sampo */
        struct mntent* ment = getmntent(stream);
        memcpy(result, ment, sizeof(struct mntent));
        return result;
 }
 #endif
 
+#define getmntent_buf bb_common_bufsiz1
+
 
 // Not real flags, but we want to be able to check for this.
 enum {
@@ -186,11 +189,11 @@ static int parse_mount_options(char *options, char **unrecognized)
                        strcpy((*unrecognized)+i, options);
                }
 
-               // Advance to next option, or finish
-               if (comma) {
-                       *comma = ',';
-                       options = ++comma;
-               } else break;
+               if (!comma)
+                       break;
+               // Advance to next option
+               *comma = ',';
+               options = ++comma;
        }
 
        return flags;
@@ -262,8 +265,9 @@ static int mount_it_now(struct mntent *mp, int vfsflags, char *filteropts)
                                vfsflags, filteropts);
                if (!rc || (vfsflags&MS_RDONLY) || (errno!=EACCES && errno!=EROFS))
                        break;
-               bb_error_msg("%s is write-protected, mounting read-only",
-                               mp->mnt_fsname);
+               if (!(vfsflags & MS_SILENT))
+                       bb_error_msg("%s is write-protected, mounting read-only",
+                                               mp->mnt_fsname);
                vfsflags |= MS_RDONLY;
        }
 
@@ -1399,6 +1403,27 @@ static int singlemount(struct mntent *mp, int ignore_busy)
        if (mp->mnt_type && strcmp(mp->mnt_type,"auto") == 0)
                mp->mnt_type = 0;
 
+       // Might this be a virtual filesystem?
+
+       if (ENABLE_FEATURE_MOUNT_HELPERS
+        && (strchr(mp->mnt_fsname,'#'))
+       ) {
+               char *s, *p, *args[35];
+               int n = 0;
+               for (s = p = mp->mnt_fsname; *s && n < 35-3; ++s) {
+                       if (s[0] == '#' && s[1] != '#') {
+                               *s = '\0';
+                               args[n++] = p;
+                               p = s + 1;
+                       }
+               }
+               args[n++] = p;
+               args[n++] = mp->mnt_dir;
+               args[n] = NULL;
+               rc = wait4pid(xspawn(args));
+               goto report_error;
+       }
+
        // Might this be an CIFS filesystem?
 
        if (ENABLE_FEATURE_MOUNT_CIFS
@@ -1593,8 +1618,8 @@ int mount_main(int argc, char **argv)
 
                        if (!mountTable) bb_error_msg_and_die("no %s", bb_path_mtab_file);
 
-                       while (getmntent_r(mountTable, mtpair, bb_common_bufsiz1,
-                                                               sizeof(bb_common_bufsiz1)))
+                       while (getmntent_r(mountTable, &mtpair[0], getmntent_buf,
+                                                               sizeof(getmntent_buf)))
                        {
                                // Don't show rootfs. FIXME: why??
                                // util-linux 2.12a happily shows rootfs...
@@ -1657,9 +1682,9 @@ int mount_main(int argc, char **argv)
 
                // Get next fstab entry
 
-               if (!getmntent_r(fstab, mtcur, bb_common_bufsiz1
-                                       + (mtcur==mtpair ? sizeof(bb_common_bufsiz1)/2 : 0),
-                               sizeof(bb_common_bufsiz1)/2))
+               if (!getmntent_r(fstab, mtcur, getmntent_buf
+                                       + (mtcur==mtpair ? sizeof(getmntent_buf)/2 : 0),
+                               sizeof(getmntent_buf)/2))
                {
                        // Were we looking for something specific?