-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.c
86 lines (78 loc) · 2.06 KB
/
server.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
* Server functions
* Copyright (C) 2006-2010 Unix Solutions Ltd.
*
* Released under MIT license.
* See LICENSE-MIT.txt for license terms.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void daemonize(char *pidfile) {
if (!pidfile)
return;
printf("Daemonizing.\n");
pid_t pid = fork();
if (pid > 0) {
FILE *F = fopen(pidfile,"w");
if (F) {
fprintf(F,"%i\n",pid);
fclose(F);
}
exit(0);
}
// Child process continues...
setsid(); // request a new session (job control)
if (!freopen("/dev/null", "r", stdin)) return;
if (!freopen("/dev/null", "w", stdout)) return;
if (!freopen("/dev/null", "w", stderr)) return;
}
void init_server_socket(char *bind_addr, int bind_port, struct sockaddr_in *server, int *server_socket) {
char *binded;
struct hostent *host_ptr;
*server_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (*server_socket == -1) {
perror("socket(server_socket)");
exit(1);
}
int j = 1;
if (setsockopt(*server_socket, SOL_SOCKET, SO_REUSEADDR,(const char *) &j, sizeof(j))<0) {
perror("setsockopt(SO_REUSEADDR)");
exit(1);
}
memset(server, 0, sizeof(struct sockaddr_in));
if (!bind_addr) {
binded = "*";
server->sin_addr.s_addr = htonl(INADDR_ANY);
} else {
host_ptr = gethostbyname(bind_addr);
if (!host_ptr) {
fprintf(stderr,"Error can't resolve bind address: %s\n", bind_addr);
exit(1);
}
memcpy(&server->sin_addr, host_ptr->h_addr, sizeof(server->sin_addr));
binded = inet_ntoa(server->sin_addr);
}
/* Bind to server socket */
fprintf(stderr, "Binding to %s:%i\t", binded, bind_port);
if (strcmp(binded,"*")==0)
fprintf(stderr,"\t");
server->sin_family = AF_INET;
server->sin_port = htons(bind_port);
if (bind(*server_socket, (struct sockaddr *)server, sizeof(struct sockaddr_in)) < 0) {
perror("bind(server_socket)");
exit(1);
}
if (listen(*server_socket, 256) < 0) {
perror("listen()");
exit(1);
}
fputs("[OK]\n",stderr);
}