3 #endif /* HAVE_CONFIG_H */
10 #include <sys/types.h>
11 #include <sys/socket.h>
12 #include <netinet/in.h>
13 #include <arpa/inet.h>
16 #include <sys/types.h>
17 #include <sys/param.h>
19 #include <atalk/fce_api.h>
20 #include <atalk/util.h>
22 #define MAXBUFLEN 1024
24 static char *fce_ev_names[] = {
33 static int unpack_fce_packet(unsigned char *buf, struct fce_packet *packet)
35 unsigned char *p = buf;
37 memcpy(&packet->magic[0], p, sizeof(packet->magic));
38 p += sizeof(packet->magic);
46 memcpy(&packet->event_id, p, sizeof(packet->event_id));
47 p += sizeof(packet->event_id);
48 packet->event_id = ntohl(packet->event_id);
50 memcpy(&packet->datalen, p, sizeof(packet->datalen));
51 p += sizeof(packet->datalen);
52 packet->datalen = ntohs(packet->datalen);
54 memcpy(&packet->data[0], p, packet->datalen);
55 packet->data[packet->datalen] = 0; /* 0 terminate strings */
64 struct addrinfo hints, *servinfo, *p;
67 struct sockaddr_storage their_addr;
71 memset(&hints, 0, sizeof hints);
72 hints.ai_family = AF_UNSPEC; // set to AF_INET to force IPv4
73 hints.ai_socktype = SOCK_DGRAM;
75 if ((rv = getaddrinfo(NULL, FCE_DEFAULT_PORT_STRING, &hints, &servinfo)) != 0) {
76 fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
80 // loop through all the results and bind to the first we can
81 for(p = servinfo; p != NULL; p = p->ai_next) {
82 if ((sockfd = socket(p->ai_family, p->ai_socktype,
83 p->ai_protocol)) == -1) {
84 perror("listener: socket");
88 if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
90 perror("listener: bind");
98 fprintf(stderr, "listener: failed to bind socket\n");
102 freeaddrinfo(servinfo);
104 printf("listener: waiting to recvfrom...\n");
106 addr_len = sizeof their_addr;
108 struct fce_packet packet;
110 if ((numbytes = recvfrom(sockfd,
114 (struct sockaddr *)&their_addr,
120 unpack_fce_packet((unsigned char *)buf, &packet);
122 if (memcmp(packet.magic, FCE_PACKET_MAGIC, sizeof(packet.magic)) == 0) {
124 switch (packet.mode) {
126 printf("FCE Start\n");
129 case FCE_CONN_BROKEN:
130 printf("Broken FCE connection\n");
134 printf("ID: %" PRIu32 ", Event: %s, Path: %s\n",
135 packet.event_id, fce_ev_names[packet.mode], packet.data);