-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmkserver.c
88 lines (78 loc) · 2.35 KB
/
mkserver.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
87
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <sys/un.h>
#include <sys/types.h>
#include "error.h"
#include "params.h"
#include "mkserver.h"
#include "net.h"
int mkserver(char* target, int* pproto)
{
int ret;
int server_addr_size = 0;
struct sockaddr* server_addr;
struct sockaddr_un server_addr_un;
struct sockaddr_in server_addr_in;
struct sockaddr_in6 server_addr_in6;
memset( &server_addr_un, 0, sizeof(server_addr_un) );
memset( &server_addr_in, 0, sizeof(server_addr_in) );
memset( &server_addr_in6, 0, sizeof(server_addr_in6) );
struct hostent* host;
int port = 0;
int proto = parsetarget( target, &host, &port );
if ( host == NULL )
{
fprintf( stderr, "invalid host\n" );
exit( EXIT_FAILURE );
}
int server_sock = socket( net_params[proto].m_domain, net_params[proto].m_type, net_params[proto].m_protocol );
if ( server_sock == -1 )
{
error_socket( errno );
exit( EXIT_FAILURE );
}
if ( net_params[proto].m_domain == AF_UNIX )
{
server_addr_un.sun_family = AF_UNIX;
strncpy( server_addr_un.sun_path, host->h_addr, host->h_length+1 );
server_addr = (struct sockaddr*)&server_addr_un;
server_addr_size = sizeof(server_addr_un);
}
else if ( net_params[proto].m_domain == AF_INET )
{
server_addr_in.sin_family = AF_INET;
server_addr_in.sin_port = port;
assert( sizeof(server_addr_in.sin_addr.s_addr) == host->h_length );
memcpy( &server_addr_in.sin_addr.s_addr, host->h_addr, host->h_length );
server_addr = (struct sockaddr*)&server_addr_in;
server_addr_size = sizeof(server_addr_in);
}
else if ( net_params[proto].m_domain == AF_INET6 )
{
server_addr_in6.sin6_family = AF_INET6;
server_addr_in6.sin6_port = port;
assert( sizeof(server_addr_in6.sin6_addr) == host->h_length );
memcpy( &server_addr_in6.sin6_addr, host->h_addr, host->h_length );
server_addr = (struct sockaddr*)&server_addr_in6;
server_addr_size = sizeof(server_addr_in6);
}
ret = bind( server_sock, server_addr, server_addr_size );
if ( ret != 0 )
{
error_bind( errno );
exit( EXIT_FAILURE );
}
if ( net_params[proto].m_type == SOCK_STREAM )
{
ret = listen( server_sock, p_connqueue );
if ( ret != 0 )
{
error_listen( errno );
exit( EXIT_FAILURE );
}
}
*pproto = proto;
return server_sock;
}