Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/pkg_install/lib Add a new library function fcexec()...



details:   https://anonhg.NetBSD.org/src/rev/ffbe208f4564
branches:  trunk
changeset: 550919:ffbe208f4564
user:      tron <tron%NetBSD.org@localhost>
date:      Mon Aug 25 10:23:41 2003 +0000

description:
Add a new library function fcexec() which allows to run a command after
changing the current directory.

diffstat:

 usr.sbin/pkg_install/lib/fexec.c |  78 +++++++++++++++++++++++++--------------
 usr.sbin/pkg_install/lib/lib.h   |   3 +-
 2 files changed, 51 insertions(+), 30 deletions(-)

diffs (139 lines):

diff -r 073a4e045720 -r ffbe208f4564 usr.sbin/pkg_install/lib/fexec.c
--- a/usr.sbin/pkg_install/lib/fexec.c  Mon Aug 25 10:23:06 2003 +0000
+++ b/usr.sbin/pkg_install/lib/fexec.c  Mon Aug 25 10:23:41 2003 +0000
@@ -47,27 +47,30 @@
 #include "lib.h"
 
 #ifndef lint
-__RCSID("$NetBSD: fexec.c,v 1.1 2003/08/24 21:10:47 tron Exp $");
+__RCSID("$NetBSD: fexec.c,v 1.2 2003/08/25 10:23:42 tron Exp $");
 #endif
 
-int
-fexec(const char *arg, ...)
+static int     vfcexec(const char *, const char *, va_list);
+
+static int
+vfcexec(const char *path, const char *arg, va_list ap)
 {
-       va_list         ap;
-       int             max, argc, status;
-       const char      **argv;
-       pid_t           child;
+       static int              max = 4;
+       static const char       **argv = NULL;
+       int                     argc, status;
+       pid_t                   child;
 
-       max = 4;
-       argv = malloc(max * sizeof(const char *));
        if (argv == NULL) {
-               warnx("fexec can't alloc arg space");
-               return -1;
+               argv = malloc(max * sizeof(const char *));
+               if (argv == NULL) {
+                       warnx("vfcexec can't alloc arg space");
+                       return -1;
+               }
        }
+
        argv[0] = arg;
        argc = 1;
 
-       va_start(ap, arg);
        do {
                if (argc == max) {
                        const char **ptr;
@@ -75,9 +78,7 @@
                        max <<= 1;
                        ptr = realloc(argv, max * sizeof(const char *));
                        if (ptr == NULL) {
-                               warnx("fexec can't alloc arg space");
-                               free(argv);
-                               va_end(ap);
+                               warnx("vfcexec can't alloc arg space");
                                return -1;
                        }
                        argv = ptr;
@@ -85,27 +86,20 @@
                arg = va_arg(ap, const char *);
                argv[argc++] = arg;
        } while (arg != NULL);
-       va_end(ap);
-
-#ifdef FEXEC_DEBUG
-       (void) printf("fexec(\"%s\"", argv[0]);
-       argc = 1;
-       while (argv[argc] != NULL)
-               (void) printf(", \"%s\"", argv[argc++]);
-       (void) printf(")\n");
-#endif
 
        child = vfork();
-       if (child == 0) {
+       switch (child) {
+       case 0:
+               if ((path != NULL) && (chdir(path) < 0))
+                       _exit(127);
+
                (void) execvp(argv[0], (char ** const)argv);
                _exit(127);
                /* NOTREACHED */
+       case -1:
+               return -1;
        }
 
-       free(argv);
-       if (child < 0)
-               return -1;
-
        while (waitpid(child, &status, 0) < 0) {
                if (errno != EINTR)
                        return -1;
@@ -116,3 +110,29 @@
 
        return WEXITSTATUS(status);
 }
+
+int
+fexec(const char *arg, ...)
+{
+       va_list ap;
+       int     result;
+
+       va_start(ap, arg);
+       result = vfcexec(NULL, arg, ap);
+       va_end(ap);
+
+       return result;
+}
+
+int
+fcexec(const char *path, const char *arg, ...)
+{
+       va_list ap;
+       int     result;
+
+       va_start(ap, arg);
+       result = vfcexec(path, arg, ap);
+       va_end(ap);
+
+       return result;
+}
diff -r 073a4e045720 -r ffbe208f4564 usr.sbin/pkg_install/lib/lib.h
--- a/usr.sbin/pkg_install/lib/lib.h    Mon Aug 25 10:23:06 2003 +0000
+++ b/usr.sbin/pkg_install/lib/lib.h    Mon Aug 25 10:23:41 2003 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lib.h,v 1.53 2003/08/24 21:10:47 tron Exp $ */
+/* $NetBSD: lib.h,v 1.54 2003/08/25 10:23:41 tron Exp $ */
 
 /* from FreeBSD Id: lib.h,v 1.25 1997/10/08 07:48:03 charnier Exp */
 
@@ -215,6 +215,7 @@
 void    restore_dirs(char *c, char *p);
 void    show_version(void);
 int    fexec(const char *, ...);
+int    fcexec(const char *, const char *, ...);
 
 /* String */
 char   *get_dash_string(char **);



Home | Main Index | Thread Index | Old Index