[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Offtopic : Need help with C program
- To: misc_(_at_)_openbsd_(_dot_)_org
- Subject: Offtopic : Need help with C program
- From: Stefan Sonnenberg-Carstens <ssc_(_at_)_coolspot_(_dot_)_de>
- Date: Sat, 20 Nov 2004 13:40:02 +0100
- Organization: coolspot AG
I saw the attached C source was removed in MARC.
So here it is again.
The problem is that the program sometimes creates zombie processes
when I do something like :
while true ; do curl http://localhost:8271/ >/dev/null ; done
And I can't see why.
Thx in advance.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <pwd.h>
int daemonize();
int serversocket_new(char *hostname,int port);
void handle_request(int clientsocket);
void session_new();
void sigchild(int signal) { wait(NULL); }
int main(int argc,char **argv) {
running = 1;
signal(SIGCHLD,sigchild);
int server = 0;
int client = 0;
int numclients = 0;
struct sockaddr_in client_addr;
int client_addr_len = sizeof(struct sockaddr_in);
daemonize();
server = serversocket_new("localhost",8271);
for(;;) {
client = accept(server,(struct sockaddr *) &client_addr,&client_addr_len);
int pid=0;
pid = fork();
if(pid < 0) {
printf("Can't fork.\n");
exit(1);
}
if(pid == 0) {
session_new();
handle_request(client);
exit(0);
}
close(client);
}
return 0;
}
void handle_request(int clientsocket) {
FILE *f;
char buf[1024];
char *msg = "Content-type: text/html\r\n\r\nTest\n";
char *status = "HTTP/1.0 200 OK\n";
f = fdopen(clientsocket,"w+");
if(f == NULL) {
printf("Can't create socket from file.\n");
exit(0);
}
memset(buf,'\0',1024);
read(clientsocket,buf,1024);
fputs(status,f);
fputs(msg,f);
fflush(f);
fclose(f);
}
void session_new() {
fclose(stdin);
fclose(stdout);
fclose(stderr);
setsid();
}
void drop_privileges() {
struct passwd *pass;
pass = getpwnam("nobody");
setgid(pass->pw_gid);
setuid(pass->pw_uid);
}
int daemonize() {
int pid = 0;
pid = fork();
if(pid<0) {
exit(pid);
}
if(pid)
exit(0);
setsid();
return 0;
}
int serversocket_new(char *hostname,int port) {
int res = 0;
int server = 0;
int ipv4addr = 0;
struct hostent *host = 0;
struct in_addr *ipaddr = 0;
struct sockaddr_in serveraddr;
server = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
if(!server) {
exit(1);
}
host = gethostbyname(hostname);
if(!host) {
exit(1);
}
ipaddr = (struct in_addr *) host->h_addr;
serveraddr.sin_addr = *ipaddr;
serveraddr.sin_port = htons(port);
res = bind(server,(struct sockaddr *) &serveraddr,sizeof(struct
sockaddr_in));
if(res) {
exit(1);
}
res = listen(server,5);
if(res) {
exit(1);
}
return server;
}
Visit your host, monkey.org