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
}
#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): */

View 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

View 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>
@ -30,20 +30,23 @@
#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) {
if (!comma)
break;
// Advance to next option
*comma = ',';
options = ++comma;
} else break;
}
return flags;
@ -262,6 +265,7 @@ static int mount_it_now(struct mntent *mp, int vfsflags, char *filteropts)
vfsflags, filteropts);
if (!rc || (vfsflags&MS_RDONLY) || (errno!=EACCES && errno!=EROFS))
break;
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?