00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "defs.h"
00022
00023
00024 int exec_path(const char *path, char *const argv[], char *newargv[])
00025 {
00026 int i;
00027
00028 execv(path, argv);
00029 if (errno == ENOEXEC) {
00030 newargv[0] = argv[0];
00031 newargv[1] = (char *)path;
00032 i = 1;
00033 do {
00034 newargv[i + 1] = argv[i];
00035 } while (argv[i++] != NULL);
00036 return execv("/bin/sh", (char *const *)newargv);
00037 }
00038 return -1;
00039 }
00040
00041 int execvp2(const char *file, char *const argv[])
00042 {
00043 char *s, *pathseq = NULL, *path = NULL, **newargv = NULL;
00044 int argc;
00045
00046 for (argc = 0; argv[argc] != NULL; argc++)
00047 ;
00048
00049 ec_null( newargv = malloc((argc + 2) * sizeof(char *)) )
00050 s = getenv("PATH");
00051 if (strchr(file, '/') != NULL || s == NULL || s[0] == '\0')
00052 ec_neg1( exec_path(file, argv, newargv) )
00053 ec_null( pathseq = strdup(s) )
00054
00055 ec_null( path = malloc(strlen(file) + strlen(pathseq) + 2) )
00056 while ((s = strtok(pathseq, ":")) != NULL) {
00057 pathseq = NULL;
00058 if (s[0] == '\0')
00059 s = ".";
00060 strcpy(path, s);
00061 strcat(path, "/");
00062 strcat(path, file);
00063 exec_path(path, argv, newargv);
00064 }
00065 errno = ENOENT;
00066 EC_FAIL
00067
00068 EC_CLEANUP_BGN
00069 free(pathseq);
00070 free(path);
00071 free(newargv);
00072 return -1;
00073 EC_CLEANUP_END
00074 }
00075
00076
00077
00078 void exectest(void)
00079 {
00080 printf("The quick brown fox jumped over ");
00081 ec_neg1( execl("/bin/echo", "echo", "the", "lazy", "dogs.", NULL) )
00082 return;
00083
00084 EC_CLEANUP_BGN
00085 EC_FLUSH("exectest");
00086 EC_CLEANUP_END
00087 }
00088
00089
00090 void forkbuf(void)
00091 {
00092 printf("Hello World!\n");
00093 ec_neg1(fork());
00094 exit(EXIT_SUCCESS);
00095 return;
00096
00097 EC_CLEANUP_BGN
00098 exit(EXIT_FAILURE);
00099 EC_CLEANUP_END
00100 }
00101
00102
00103 void junk(void)
00104 {
00105 int fd, flags;
00106 long open_max;
00107 char *path = "/bin/echo", *arg0 = "hello", *arg1 = "gillian",
00108 *arg2 = " and claire";
00109
00110
00111 errno = 0;
00112 ec_neg1( open_max = sysconf(_SC_OPEN_MAX) )
00113 printf("open_max = %ld\n", open_max);
00114 for (fd = 0; fd < open_max - 1; fd++)
00115 (void)close(fd);
00116 ec_neg1( execl(path, arg0, arg1, arg2, NULL) )
00117
00118 for (fd = 0; fd < open_max - 1; fd++) {
00119 ec_neg1( flags = fcntl(fd, F_SETFD) )
00120 ec_neg1( fcntl(fd, F_SETFD, flags | FD_CLOEXEC) )
00121 }
00122 ec_neg1( execl(path, arg0, arg1, arg2, NULL) )
00123
00124 return;
00125
00126 EC_CLEANUP_BGN
00127 EC_FLUSH("junk");
00128 EC_CLEANUP_END
00129 }
00130
00131
00132 void forktest(void)
00133 {
00134 int pid;
00135
00136 printf("Start of test\n");
00137 pid = fork();
00138 printf("Returned %d\n", pid);
00139 }
00140
00141
00142 void gp(void)
00143 {
00144
00145 char file[10];
00146 int tempfd;
00147
00148 sprintf(file, "TMP%ld", (long)getpid());
00149 if ((tempfd = open(file, O_RDWR | O_CREAT | O_TRUNC, 0666)) == -1)
00150 syserr("open");
00151
00152 }
00153
00154 int main(int argc, char *argv[])
00155 {
00156 forktest();
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 exit(EXIT_SUCCESS);
00171
00172 EC_CLEANUP_BGN
00173 exit(EXIT_FAILURE);
00174 EC_CLEANUP_END
00175 }