src/server/safs/cgi.c

changeset 120
d2eb5fd97df0
parent 119
155cbab9eefd
child 121
a881dc866e23
equal deleted inserted replaced
119:155cbab9eefd 120:d2eb5fd97df0
139 } 139 }
140 140
141 p->pid = fork(); 141 p->pid = fork();
142 if(p->pid == 0) { 142 if(p->pid == 0) {
143 // child 143 // child
144
145 // get script directory and script name
146 sstr_t script = sstr(path);
147 sstr_t parent;
148 int len = strlen(path);
149 for(int i=len-1;i>=0;i--) {
150 if(path[i] == '/') {
151 script = sstrn(path + i + 1, len - i);
152 parent = sstrdup(sstrn(path, i));
153 if(chdir(parent.ptr)) {
154 perror("cgi_start: chdir");
155 free(parent.ptr);
156 exit(-1);
157 }
158 free(parent.ptr);
159 break;
160 }
161 }
162
144 if(dup2(p->in[0], STDIN_FILENO) == -1) { 163 if(dup2(p->in[0], STDIN_FILENO) == -1) {
145 perror("cgi_start: dup2"); 164 perror("cgi_start: dup2");
146 exit(EXIT_FAILURE); 165 exit(EXIT_FAILURE);
147 } 166 }
148 if(dup2(p->out[1], STDOUT_FILENO) == -1) { 167 if(dup2(p->out[1], STDOUT_FILENO) == -1) {
153 // we need to close this unused pipe 172 // we need to close this unused pipe
154 // otherwise stdin cannot reach EOF 173 // otherwise stdin cannot reach EOF
155 close(p->in[1]); 174 close(p->in[1]);
156 175
157 // execute program 176 // execute program
158 exit(execve(path, argv, envp)); 177 exit(execve(script.ptr, argv, envp));
159 } else { 178 } else {
160 // parent 179 // parent
161 close(p->out[1]); 180 close(p->out[1]);
162 } 181 }
163 182

mercurial