~ubuntu-branches/ubuntu/dapper/sup/dapper

« back to all changes in this revision

Viewing changes to run.c

  • Committer: Bazaar Package Importer
  • Author(s): Jochen Friedrich
  • Date: 2003-12-30 22:02:24 UTC
  • Revision ID: james.westby@ubuntu.com-20031230220224-g6rzexudlhhtk3nv
Tags: 1.8-10
* Bumped standards version to 3.6.1 (no changes required).
* Fixed errno handling (Thanks to Thorsten Sauter <tsauter@debian.org>
  for the patch) (Closes: #223422).
* Corrected debian/copyright.
* Documented IPv6 options in man page.

Show diffs side-by-side

added added

removed removed

Lines of Context:
94
94
#include <stdio.h>
95
95
#include <signal.h>
96
96
#include <sys/wait.h>
97
 
#include <varargs.h>
98
 
 
99
 
static int dorun();
100
 
 
101
 
int run (name,va_alist)
102
 
char *name;
103
 
va_dcl
 
97
#include <stdarg.h>
 
98
#include <malloc.h>
 
99
 
 
100
static int dorun(char *, char **, int);
 
101
static char **makearglist(va_list);
 
102
 
 
103
static char **
 
104
makearglist(va_list ap)
 
105
{
 
106
        static size_t ns = 0;
 
107
        static char **np = NULL;
 
108
        int i = 0;
 
109
 
 
110
        do {
 
111
                if (i >= ns) {
 
112
                        ns += 20;
 
113
                        if ((np = realloc(np, ns)) == NULL)
 
114
                                return NULL;
 
115
                }
 
116
                np[i] = va_arg(ap, char *);
 
117
        }
 
118
        while (np[i++] != NULL);
 
119
        return np;
 
120
}
 
121
 
 
122
int 
 
123
run (char *name, ...)
104
124
{
105
125
        int val;
106
126
        va_list ap;
 
127
        char **argv;
107
128
 
108
 
        va_start(ap);
109
 
        val = runv (name,ap);
 
129
        va_start(ap, name);
 
130
        if ((argv = makearglist(ap)) == NULL) {
 
131
                va_end(ap);
 
132
                return -1;
 
133
        }
 
134
        val = runv (name, argv);
110
135
        va_end(ap);
111
136
        return(val);
112
137
}
113
138
 
114
 
int runv (name,argv)
115
 
char *name,**argv;
 
139
int
 
140
runv (char *name, char **argv)
116
141
{
117
142
        return (dorun (name, argv, 0));
118
143
}
119
144
 
120
 
int runp (name,va_alist)
121
 
char *name;
122
 
va_dcl
 
145
int
 
146
runp (char *name, ...)
123
147
{
124
148
        int val;
125
149
        va_list ap;
 
150
        char **argv;
126
151
 
127
 
        va_start(ap);
128
 
        val = runvp (name,ap);
 
152
        va_start(ap, name);
 
153
        if ((argv = makearglist(ap)) == NULL) {
 
154
                va_end(ap);
 
155
                return -1;
 
156
        }
 
157
        val = runvp (name, argv);
129
158
        va_end(ap);
130
159
        return (val);
131
160
}
132
161
 
133
 
int runvp (name,argv)
134
 
char *name,**argv;
 
162
int
 
163
runvp (char *name, char **argv)
135
164
{
136
165
        return (dorun (name, argv, 1));
137
166
}
138
167
 
139
 
static
140
 
int dorun (name,argv,usepath)
141
 
char *name,**argv;
142
 
int usepath;
 
168
static int
 
169
dorun (char *name, char **argv, int usepath)
143
170
{
144
171
        int wpid;
145
172
        register int pid;
146
173
        struct sigvec ignoresig,intsig,quitsig;
147
174
        union wait status;
148
 
        int execvp(), execv();
149
 
        int (*execrtn)() = usepath ? execvp : execv;
150
175
 
151
176
        if ((pid = vfork()) == -1)
152
177
                return(-1);     /* no more process's, so exit with error */
154
179
        if (pid == 0) {                 /* child process */
155
180
                setgid (getgid());
156
181
                setuid (getuid());
157
 
                (*execrtn) (name,argv);
 
182
                if (usepath)
 
183
                        execvp(name, argv);
 
184
                else
 
185
                        execv(name, argv);
158
186
                fprintf (stderr,"run: can't exec %s\n",name);
159
187
                _exit (0377);
160
188
        }