]> arthur.barton.de Git - netatalk.git/blob - bin/misc/fce.c
Add fce simple test listener, use getopt in main in fce_api
[netatalk.git] / bin / misc / fce.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <errno.h>
5 #include <string.h>
6 #include <sys/types.h>
7 #include <sys/socket.h>
8 #include <netinet/in.h>
9 #include <arpa/inet.h>
10 #include <netdb.h>
11
12 #include <atalk/fce_api.h>
13
14 #define MAXBUFLEN 100
15
16 // get sockaddr, IPv4 or IPv6:
17 void *get_in_addr(struct sockaddr *sa)
18 {
19     if (sa->sa_family == AF_INET) {
20         return &(((struct sockaddr_in*)sa)->sin_addr);
21     }
22
23     return &(((struct sockaddr_in6*)sa)->sin6_addr);
24 }
25
26 int main(void)
27 {
28     int sockfd;
29     struct addrinfo hints, *servinfo, *p;
30     int rv;
31     int numbytes;
32     struct sockaddr_storage their_addr;
33     char buf[MAXBUFLEN];
34     socklen_t addr_len;
35     char s[INET6_ADDRSTRLEN];
36
37     memset(&hints, 0, sizeof hints);
38     hints.ai_family = AF_UNSPEC; // set to AF_INET to force IPv4
39     hints.ai_socktype = SOCK_DGRAM;
40 //    hints.ai_flags = AI_PASSIVE; // use my IP
41
42     if ((rv = getaddrinfo(NULL, FCE_DEFAULT_PORT_STRING, &hints, &servinfo)) != 0) {
43         fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
44         return 1;
45     }
46
47     // loop through all the results and bind to the first we can
48     for(p = servinfo; p != NULL; p = p->ai_next) {
49         if ((sockfd = socket(p->ai_family, p->ai_socktype,
50                              p->ai_protocol)) == -1) {
51             perror("listener: socket");
52             continue;
53         }
54
55         if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
56             close(sockfd);
57             perror("listener: bind");
58             continue;
59         }
60
61         break;
62     }
63
64     if (p == NULL) {
65         fprintf(stderr, "listener: failed to bind socket\n");
66         return 2;
67     }
68
69     freeaddrinfo(servinfo);
70
71     printf("listener: waiting to recvfrom...\n");
72
73     addr_len = sizeof their_addr;
74     if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
75                              (struct sockaddr *)&their_addr, &addr_len)) == -1) {
76         perror("recvfrom");
77         exit(1);
78     }
79
80     printf("listener: got packet from %s\n",
81            inet_ntop(their_addr.ss_family,
82                      get_in_addr((struct sockaddr *)&their_addr),
83                      s, sizeof s));
84     printf("listener: packet is %d bytes long\n", numbytes);
85     buf[numbytes] = '\0';
86     printf("listener: packet contains \"%s\"\n", buf);
87
88     close(sockfd);
89
90     return 0;
91 }