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[] = {
34 // get sockaddr, IPv4 or IPv6:
35 static void *get_in_addr(struct sockaddr *sa)
37 if (sa->sa_family == AF_INET) {
38 return &(((struct sockaddr_in*)sa)->sin_addr);
41 return &(((struct sockaddr_in6*)sa)->sin6_addr);
44 static int unpack_fce_packet(unsigned char *buf, struct fce_packet *packet)
46 unsigned char *p = buf;
48 memcpy(&packet->magic[0], p, sizeof(packet->magic));
49 p += sizeof(packet->magic);
57 memcpy(&packet->event_id, p, sizeof(packet->event_id));
58 p += sizeof(packet->event_id);
59 packet->event_id = ntohl(packet->event_id);
61 memcpy(&packet->datalen, p, sizeof(packet->datalen));
62 p += sizeof(packet->datalen);
63 packet->datalen = ntohs(packet->datalen);
65 memcpy(&packet->data[0], p, packet->datalen);
74 struct addrinfo hints, *servinfo, *p;
77 struct sockaddr_storage their_addr;
80 char s[INET6_ADDRSTRLEN];
83 memset(&hints, 0, sizeof hints);
84 hints.ai_family = AF_UNSPEC; // set to AF_INET to force IPv4
85 hints.ai_socktype = SOCK_DGRAM;
87 if ((rv = getaddrinfo(NULL, FCE_DEFAULT_PORT_STRING, &hints, &servinfo)) != 0) {
88 fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
92 // loop through all the results and bind to the first we can
93 for(p = servinfo; p != NULL; p = p->ai_next) {
94 if ((sockfd = socket(p->ai_family, p->ai_socktype,
95 p->ai_protocol)) == -1) {
96 perror("listener: socket");
100 if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
102 perror("listener: bind");
110 fprintf(stderr, "listener: failed to bind socket\n");
114 freeaddrinfo(servinfo);
116 printf("listener: waiting to recvfrom...\n");
118 addr_len = sizeof their_addr;
120 struct fce_packet packet;
122 if ((numbytes = recvfrom(sockfd,
126 (struct sockaddr *)&their_addr,
132 unpack_fce_packet(buf, &packet);
134 if (memcmp(packet.magic, FCE_PACKET_MAGIC, sizeof(packet.magic)) == 0) {
136 switch (packet.mode) {
138 memcpy(&tmsize, packet.data, sizeof(uint64_t));
139 tmsize = ntoh64(tmsize);
140 printf("ID: %" PRIu32 ", Event: %s, Volume: %s, TM used size: %" PRIu64 " \n",
141 packet.event_id, fce_ev_names[packet.mode], packet.data + sizeof(uint64_t), tmsize);
145 printf("FCE Start\n");
148 case FCE_CONN_BROKEN:
149 printf("Broken FCE connection\n");
153 printf("ID: %" PRIu32 ", Event: %s, Path: %s\n",
154 packet.event_id, fce_ev_names[packet.mode], packet.data);