|
|
|
@ -85,6 +85,20 @@ static mode_t read_umask(void) {
|
|
|
|
|
return mask; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static ssize_t write_all(int fildes, const void *buf, size_t nbyte) { |
|
|
|
|
size_t rem; |
|
|
|
|
for (rem = nbyte; rem > 0;) { |
|
|
|
|
ssize_t res = write(fildes, buf, rem); |
|
|
|
|
if (-1 == res) { |
|
|
|
|
if (EINTR != errno) return res; |
|
|
|
|
} else { |
|
|
|
|
buf = res + (char const*) buf; |
|
|
|
|
rem -= res; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return nbyte; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int bind_socket(const char *addr, unsigned short port, const char *unixsocket, uid_t uid, gid_t gid, mode_t mode, int backlog) { |
|
|
|
|
int fcgi_fd, socket_type, val; |
|
|
|
|
|
|
|
|
@ -307,16 +321,24 @@ static int fcgi_spawn_connection(char *appPath, char **appArgv, int fcgi_fd, int
|
|
|
|
|
fprintf(stdout, "spawn-fcgi: child spawned successfully: PID: %d\n", child); |
|
|
|
|
|
|
|
|
|
/* write pid file */ |
|
|
|
|
if (pid_fd != -1) { |
|
|
|
|
if (-1 != pid_fd) { |
|
|
|
|
/* assume a 32bit pid_t */ |
|
|
|
|
char pidbuf[12]; |
|
|
|
|
|
|
|
|
|
snprintf(pidbuf, sizeof(pidbuf) - 1, "%d", child); |
|
|
|
|
|
|
|
|
|
write(pid_fd, pidbuf, strlen(pidbuf)); |
|
|
|
|
if (-1 == write_all(pid_fd, pidbuf, strlen(pidbuf))) { |
|
|
|
|
fprintf(stderr, "spawn-fcgi: writing pid file failed: %s\n", strerror(errno)); |
|
|
|
|
close(pid_fd); |
|
|
|
|
pid_fd = -1; |
|
|
|
|
} |
|
|
|
|
/* avoid eol for the last one */ |
|
|
|
|
if (fork_count != 0) { |
|
|
|
|
write(pid_fd, "\n", 1); |
|
|
|
|
if (-1 != pid_fd && fork_count != 0) { |
|
|
|
|
if (-1 == write_all(pid_fd, "\n", 1)) { |
|
|
|
|
fprintf(stderr, "spawn-fcgi: writing pid file failed: %s\n", strerror(errno)); |
|
|
|
|
close(pid_fd); |
|
|
|
|
pid_fd = -1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -342,7 +364,10 @@ static int fcgi_spawn_connection(char *appPath, char **appArgv, int fcgi_fd, int
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
close(pid_fd); |
|
|
|
|
|
|
|
|
|
if (-1 != pid_fd) { |
|
|
|
|
close(pid_fd); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
close(fcgi_fd); |
|
|
|
|
|
|
|
|
@ -410,14 +435,14 @@ static int find_user_group(const char *user, const char *group, uid_t *uid, gid_
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void show_version () { |
|
|
|
|
write(1, CONST_STR_LEN( |
|
|
|
|
(void) write_all(1, CONST_STR_LEN( |
|
|
|
|
PACKAGE_DESC \
|
|
|
|
|
"Build-Date: " __DATE__ " " __TIME__ "\n" |
|
|
|
|
)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void show_help () { |
|
|
|
|
write(1, CONST_STR_LEN( |
|
|
|
|
(void) write_all(1, CONST_STR_LEN( |
|
|
|
|
"Usage: spawn-fcgi [options] [-- <fcgiapp> [fcgi app arguments]]\n" \
|
|
|
|
|
"\n" \
|
|
|
|
|
PACKAGE_DESC \
|
|
|
|
@ -598,10 +623,19 @@ int main(int argc, char **argv) {
|
|
|
|
|
* to /etc/group |
|
|
|
|
*/ |
|
|
|
|
if (gid != 0) { |
|
|
|
|
setgid(gid); |
|
|
|
|
setgroups(0, NULL); |
|
|
|
|
if (-1 == setgid(gid)) { |
|
|
|
|
fprintf(stderr, "spawn-fcgi: setgid(%i) failed: %s\n", (int) gid, strerror(errno)); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
if (-1 == setgroups(0, NULL)) { |
|
|
|
|
fprintf(stderr, "spawn-fcgi: setgroups(0, NULL) failed: %s\n", strerror(errno)); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
if (real_username) { |
|
|
|
|
initgroups(real_username, gid); |
|
|
|
|
if (-1 == initgroups(real_username, gid)) { |
|
|
|
|
fprintf(stderr, "spawn-fcgi: initgroups('%s', %i) failed: %s\n", real_username, (int) gid, strerror(errno)); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -621,7 +655,10 @@ int main(int argc, char **argv) {
|
|
|
|
|
|
|
|
|
|
/* drop root privs */ |
|
|
|
|
if (uid != 0) { |
|
|
|
|
setuid(uid); |
|
|
|
|
if (-1 == setuid(uid)) { |
|
|
|
|
fprintf(stderr, "spawn-fcgi: setuid(%i) failed: %s\n", (int) uid, strerror(errno)); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (-1 == (fcgi_fd = bind_socket(addr, port, unixsocket, 0, 0, sockmode, backlog))) |
|
|
|
|