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>
18 #include <sys/param.h>
19 #include <sys/cdefs.h>
21 #include <atalk/fce_api.h>
22 #include <atalk/util.h>
24 #define MAXBUFLEN 1024
26 static char *fce_ev_names[] = {
36 // get sockaddr, IPv4 or IPv6:
37 static void *get_in_addr(struct sockaddr *sa)
39 if (sa->sa_family == AF_INET) {
40 return &(((struct sockaddr_in*)sa)->sin_addr);
43 return &(((struct sockaddr_in6*)sa)->sin6_addr);
46 static int unpack_fce_packet(unsigned char *buf, struct fce_packet *packet)
48 unsigned char *p = buf;
50 memcpy(&packet->magic[0], p, sizeof(packet->magic));
51 p += sizeof(packet->magic);
59 memcpy(&packet->event_id, p, sizeof(packet->event_id));
60 p += sizeof(packet->event_id);
61 packet->event_id = ntohl(packet->event_id);
63 memcpy(&packet->datalen, p, sizeof(packet->datalen));
64 p += sizeof(packet->datalen);
65 packet->datalen = ntohs(packet->datalen);
67 memcpy(&packet->data[0], p, packet->datalen);
76 struct addrinfo hints, *servinfo, *p;
79 struct sockaddr_storage their_addr;
82 char s[INET6_ADDRSTRLEN];
85 memset(&hints, 0, sizeof hints);
86 hints.ai_family = AF_UNSPEC; // set to AF_INET to force IPv4
87 hints.ai_socktype = SOCK_DGRAM;
89 if ((rv = getaddrinfo(NULL, FCE_DEFAULT_PORT_STRING, &hints, &servinfo)) != 0) {
90 fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
94 // loop through all the results and bind to the first we can
95 for(p = servinfo; p != NULL; p = p->ai_next) {
96 if ((sockfd = socket(p->ai_family, p->ai_socktype,
97 p->ai_protocol)) == -1) {
98 perror("listener: socket");
102 if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
104 perror("listener: bind");
112 fprintf(stderr, "listener: failed to bind socket\n");
116 freeaddrinfo(servinfo);
118 printf("listener: waiting to recvfrom...\n");
120 addr_len = sizeof their_addr;
122 struct fce_packet packet;
124 if ((numbytes = recvfrom(sockfd,
128 (struct sockaddr *)&their_addr,
134 unpack_fce_packet(buf, &packet);
136 if (memcmp(packet.magic, FCE_PACKET_MAGIC, sizeof(packet.magic)) == 0) {
138 switch (packet.mode) {
140 memcpy(&tmsize, packet.data, sizeof(uint64_t));
141 tmsize = ntoh64(tmsize);
142 printf("ID: %" PRIu32 ", Event: %s, Volume: %s, TM used size: %" PRIu64 " \n",
143 packet.event_id, fce_ev_names[packet.mode], packet.data + sizeof(uint64_t), tmsize);
147 printf("FCE Start\n");
150 case FCE_CONN_BROKEN:
151 printf("Broken FCE connection\n");
155 printf("ID: %" PRIu32 ", Event: %s, Path: %s\n",
156 packet.event_id, fce_ev_names[packet.mode], packet.data);