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