]> the.earth.li Git - sersniff.git/blob - tcp.c
b8f2b67064f6ca4f757d8ef22252e1767ca2bcf9
[sersniff.git] / tcp.c
1 /*
2         tcp.c - Routines to give us handles to tcp ports.
3         Copyright 1999 Project Purple. Written by Jonathan McDowell
4
5         27/11/1999 - Started writing.
6 */
7
8 #include <stdio.h>
9 #include <sys/types.h>
10 #include <sys/socket.h>
11 #include <netdb.h>
12 #include <netinet/in.h>
13 #include <fcntl.h>
14 #include <unistd.h>
15
16 int opensock(char *host, int port)
17 {
18         int sock;
19         struct sockaddr_in saddr;
20         struct hostent *hoste;
21
22         if ((hoste=gethostbyname(host))==NULL) {
23                 perror("gethostbyname()");
24                 return -1;
25         }
26
27         if ((sock=socket(AF_INET, SOCK_STREAM, 0))==-1) {
28                 perror("socket()");
29                 return -1;
30         }
31
32         saddr.sin_addr = *(struct in_addr *) hoste->h_addr;
33         saddr.sin_family = AF_INET;
34         saddr.sin_port = htons(port);
35
36         if ((connect(sock, (struct sockaddr *) &saddr, sizeof(struct sockaddr_in)))==-1) {
37                 perror("connect()");
38                 return -1;
39         }
40
41         if (fcntl(sock, F_SETFL, O_NONBLOCK)==-1) {
42                 perror("fcntl()");
43                 return -1;
44         }
45
46         return sock;
47 }
48
49 int listensock(int port)
50 {
51         int sock, newsock;
52         struct sockaddr_in saddr;
53         int saddrlen;
54         int on;
55
56         if ((sock=socket(AF_INET, SOCK_STREAM, 0))==-1) {
57                 perror("socket()");
58                 return -1;
59         }
60
61         on=1;
62         if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) {
63                 perror("setsockopt(SO_REUSEADDR)");
64                 return -1;
65         }
66
67         saddr.sin_addr.s_addr = INADDR_ANY;
68         saddr.sin_family = AF_INET;
69         saddr.sin_port = htons(port);
70         saddrlen = sizeof(saddr);
71
72         if (bind(sock, (struct sockaddr *) &saddr, saddrlen)==-1) {
73                 perror("bind()");
74                 return -1;
75         }
76
77         if (listen(sock, 0)==-1) {
78                 perror("listen()");
79                 return -1;
80         }
81
82         if ((newsock=accept(sock, (struct sockaddr *) &saddr, &saddrlen))==-1) {
83                 perror("accept()");
84                 return -1;
85         }
86
87         if (fcntl(newsock, F_SETFL, O_NONBLOCK)==-1) {
88                 perror("fcntl()");
89                 return -1;
90         }
91
92         close(sock);
93
94         return newsock;
95 }