summaryrefslogtreecommitdiffstats
path: root/libexec/ftpd/popen.c
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/ftpd/popen.c')
-rw-r--r--libexec/ftpd/popen.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/libexec/ftpd/popen.c b/libexec/ftpd/popen.c
index b26732e..ac0b76a 100644
--- a/libexec/ftpd/popen.c
+++ b/libexec/ftpd/popen.c
@@ -33,11 +33,14 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
+ * $Id: popen.c,v 1.7 1997/02/22 14:21:31 peter Exp $
*/
+#if 0
#ifndef lint
static char sccsid[] = "@(#)popen.c 8.3 (Berkeley) 4/6/94";
#endif /* not lint */
+#endif
#include <sys/types.h>
#include <sys/wait.h>
@@ -51,6 +54,12 @@ static char sccsid[] = "@(#)popen.c 8.3 (Berkeley) 4/6/94";
#include <unistd.h>
#include "extern.h"
+#ifdef INTERNAL_LS
+#include "pathnames.h"
+#endif
+
+#define MAXUSRARGS 100
+#define MAXGLOBARGS 1000
/*
* Special version of popen which avoids call to shell. This ensures noone
@@ -67,9 +76,9 @@ ftpd_popen(program, type)
char *cp;
FILE *iop;
int argc, gargc, pdes[2], pid;
- char **pop, *argv[100], *gargv[1000];
+ char **pop, *argv[MAXUSRARGS], *gargv[MAXGLOBARGS];
- if (*type != 'r' && *type != 'w' || type[1])
+ if (((*type != 'r') && (*type != 'w')) || type[1])
return (NULL);
if (!pids) {
@@ -83,13 +92,13 @@ ftpd_popen(program, type)
return (NULL);
/* break up string into pieces */
- for (argc = 0, cp = program;; cp = NULL)
+ for (argc = 0, cp = program; argc < MAXUSRARGS; cp = NULL)
if (!(argv[argc++] = strtok(cp, " \t\n")))
break;
/* glob each piece */
gargv[0] = argv[0];
- for (gargc = argc = 1; argv[argc]; argc++) {
+ for (gargc = argc = 1; argv[argc] && gargc < (MAXGLOBARGS-1); argc++) {
glob_t gl;
int flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE;
@@ -97,14 +106,21 @@ ftpd_popen(program, type)
if (glob(argv[argc], flags, NULL, &gl))
gargv[gargc++] = strdup(argv[argc]);
else
- for (pop = gl.gl_pathv; *pop; pop++)
+ for (pop = gl.gl_pathv; *pop && gargc < (MAXGLOBARGS-1);
+ pop++)
gargv[gargc++] = strdup(*pop);
globfree(&gl);
}
gargv[gargc] = NULL;
iop = NULL;
- switch(pid = vfork()) {
+#ifdef INTERNAL_LS
+ fflush(NULL);
+ pid = (strcmp(gargv[0], _PATH_LS) == 0) ? fork() : vfork();
+#else
+ pid = vfork();
+#endif
+ switch(pid) {
case -1: /* error */
(void)close(pdes[0]);
(void)close(pdes[1]);
@@ -125,6 +141,14 @@ ftpd_popen(program, type)
}
(void)close(pdes[1]);
}
+#ifdef INTERNAL_LS
+ if (strcmp(gargv[0], _PATH_LS) == 0) {
+ extern int optreset;
+ /* Reset getopt for ls_main() */
+ optreset = optind = optopt = 1;
+ exit(ls_main(gargc, gargv));
+ }
+#endif
execv(gargv[0], gargv);
_exit(1);
}
OpenPOWER on IntegriCloud