httpd: do not clear environment

mount: mount helpers support (by Vladimir Dronnikov <dronnikov@gmail.ru>)
This commit is contained in:
Denis Vlasenko 2007-09-15 13:28:30 +00:00
parent 32eb1f6cb9
commit 2535f12cf2
3 changed files with 57 additions and 16 deletions

View File

@ -2089,7 +2089,13 @@ int httpd_main(int argc, char **argv)
#endif #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"); char *p = getenv("PATH");
/* env strings themself are not freed, no need to strdup(p): */ /* env strings themself are not freed, no need to strdup(p): */

View File

@ -360,6 +360,16 @@ config MOUNT
NFS filesystems. Most people using BusyBox will also want to enable NFS filesystems. Most people using BusyBox will also want to enable
the 'mount' utility. 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 config FEATURE_MOUNT_NFS
bool "Support mounting NFS file systems" bool "Support mounting NFS file systems"
default n default n

View File

@ -18,8 +18,8 @@
mount_it_now() does the actual mount. mount_it_now() does the actual mount.
*/ */
#include "libbb.h"
#include <mntent.h> #include <mntent.h>
#include "libbb.h"
/* Needed for nfs support only... */ /* Needed for nfs support only... */
#include <syslog.h> #include <syslog.h>
@ -30,20 +30,23 @@
#include <rpc/pmap_prot.h> #include <rpc/pmap_prot.h>
#include <rpc/pmap_clnt.h> #include <rpc/pmap_clnt.h>
#ifndef MS_SILENT
#define MS_SILENT (1 << 15)
#endif
#if defined(__dietlibc__) #if defined(__dietlibc__)
/* 16.12.2006, Sampo Kellomaki (sampo@iki.fi) /* 16.12.2006, Sampo Kellomaki (sampo@iki.fi)
* dietlibc-0.30 does not have implementation of getmntent_r() */ * 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) 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); struct mntent* ment = getmntent(stream);
memcpy(result, ment, sizeof(struct mntent)); memcpy(result, ment, sizeof(struct mntent));
return result; return result;
} }
#endif #endif
#define getmntent_buf bb_common_bufsiz1
// Not real flags, but we want to be able to check for this. // Not real flags, but we want to be able to check for this.
enum { enum {
@ -186,11 +189,11 @@ static int parse_mount_options(char *options, char **unrecognized)
strcpy((*unrecognized)+i, options); strcpy((*unrecognized)+i, options);
} }
// Advance to next option, or finish if (!comma)
if (comma) { break;
// Advance to next option
*comma = ','; *comma = ',';
options = ++comma; options = ++comma;
} else break;
} }
return flags; return flags;
@ -262,6 +265,7 @@ static int mount_it_now(struct mntent *mp, int vfsflags, char *filteropts)
vfsflags, filteropts); vfsflags, filteropts);
if (!rc || (vfsflags&MS_RDONLY) || (errno!=EACCES && errno!=EROFS)) if (!rc || (vfsflags&MS_RDONLY) || (errno!=EACCES && errno!=EROFS))
break; break;
if (!(vfsflags & MS_SILENT))
bb_error_msg("%s is write-protected, mounting read-only", bb_error_msg("%s is write-protected, mounting read-only",
mp->mnt_fsname); mp->mnt_fsname);
vfsflags |= MS_RDONLY; 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) if (mp->mnt_type && strcmp(mp->mnt_type,"auto") == 0)
mp->mnt_type = 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? // Might this be an CIFS filesystem?
if (ENABLE_FEATURE_MOUNT_CIFS 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); if (!mountTable) bb_error_msg_and_die("no %s", bb_path_mtab_file);
while (getmntent_r(mountTable, mtpair, bb_common_bufsiz1, while (getmntent_r(mountTable, &mtpair[0], getmntent_buf,
sizeof(bb_common_bufsiz1))) sizeof(getmntent_buf)))
{ {
// Don't show rootfs. FIXME: why?? // Don't show rootfs. FIXME: why??
// util-linux 2.12a happily shows rootfs... // util-linux 2.12a happily shows rootfs...
@ -1657,9 +1682,9 @@ int mount_main(int argc, char **argv)
// Get next fstab entry // Get next fstab entry
if (!getmntent_r(fstab, mtcur, bb_common_bufsiz1 if (!getmntent_r(fstab, mtcur, getmntent_buf
+ (mtcur==mtpair ? sizeof(bb_common_bufsiz1)/2 : 0), + (mtcur==mtpair ? sizeof(getmntent_buf)/2 : 0),
sizeof(bb_common_bufsiz1)/2)) sizeof(getmntent_buf)/2))
{ {
// Were we looking for something specific? // Were we looking for something specific?