File: server.c

package info (click to toggle)
tsdecrypt 8.1-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 1,084 kB
  • sloc: ansic: 13,568; makefile: 248; sh: 183
file content (86 lines) | stat: -rw-r--r-- 2,075 bytes parent folder | download | duplicates (4)
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)
	freopen("/dev/null", "r", stdin);
	freopen("/dev/null", "w", stdout);
	freopen("/dev/null", "w", stderr);
}

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);
}