Makefile.in
netacnv
afpldaptest
+fce
logger_test
.deps
.libs
pkgconfdir = @PKGCONFDIR@
bin_PROGRAMS =
-noinst_PROGRAMS = netacnv logger_test
+noinst_PROGRAMS = netacnv logger_test fce
netacnv_SOURCES = netacnv.c
netacnv_LDADD = $(top_builddir)/libatalk/libatalk.la
logger_test_SOURCES = logger_test.c
logger_test_LDADD = $(top_builddir)/libatalk/libatalk.la
+fce_SOOURCE = fce.c
+fce_LDADD = $(top_builddir)/libatalk/libatalk.la
+fce_CFLAGS = -I$(top_srcdir)/include
+
bin_PROGRAMS += afpldaptest
afpldaptest_SOURCES = uuidtest.c
afpldaptest_CFLAGS = -D_PATH_ACL_LDAPCONF=\"$(pkgconfdir)/afp_ldap.conf\"
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include <atalk/fce_api.h>
+
+#define MAXBUFLEN 100
+
+// get sockaddr, IPv4 or IPv6:
+void *get_in_addr(struct sockaddr *sa)
+{
+ if (sa->sa_family == AF_INET) {
+ return &(((struct sockaddr_in*)sa)->sin_addr);
+ }
+
+ return &(((struct sockaddr_in6*)sa)->sin6_addr);
+}
+
+int main(void)
+{
+ int sockfd;
+ struct addrinfo hints, *servinfo, *p;
+ int rv;
+ int numbytes;
+ struct sockaddr_storage their_addr;
+ char buf[MAXBUFLEN];
+ socklen_t addr_len;
+ char s[INET6_ADDRSTRLEN];
+
+ memset(&hints, 0, sizeof hints);
+ hints.ai_family = AF_UNSPEC; // set to AF_INET to force IPv4
+ hints.ai_socktype = SOCK_DGRAM;
+// hints.ai_flags = AI_PASSIVE; // use my IP
+
+ if ((rv = getaddrinfo(NULL, FCE_DEFAULT_PORT_STRING, &hints, &servinfo)) != 0) {
+ fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
+ return 1;
+ }
+
+ // loop through all the results and bind to the first we can
+ for(p = servinfo; p != NULL; p = p->ai_next) {
+ if ((sockfd = socket(p->ai_family, p->ai_socktype,
+ p->ai_protocol)) == -1) {
+ perror("listener: socket");
+ continue;
+ }
+
+ if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
+ close(sockfd);
+ perror("listener: bind");
+ continue;
+ }
+
+ break;
+ }
+
+ if (p == NULL) {
+ fprintf(stderr, "listener: failed to bind socket\n");
+ return 2;
+ }
+
+ freeaddrinfo(servinfo);
+
+ printf("listener: waiting to recvfrom...\n");
+
+ addr_len = sizeof their_addr;
+ if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
+ (struct sockaddr *)&their_addr, &addr_len)) == -1) {
+ perror("recvfrom");
+ exit(1);
+ }
+
+ printf("listener: got packet from %s\n",
+ inet_ntop(their_addr.ss_family,
+ get_in_addr((struct sockaddr *)&their_addr),
+ s, sizeof s));
+ printf("listener: packet is %d bytes long\n", numbytes);
+ buf[numbytes] = '\0';
+ printf("listener: packet contains \"%s\"\n", buf);
+
+ close(sockfd);
+
+ return 0;
+}
endif
-noinst_HEADERS = auth.h afp_config.h desktop.h directory.h fce_api.h fce_api_internal.h file.h \
+noinst_HEADERS = auth.h afp_config.h desktop.h directory.h fce_api_internal.h file.h \
filedir.h fork.h globals.h icon.h mangle.h misc.h status.h switch.h \
uam_auth.h uid.h unix.h volume.h hash.h acls.h acl_mappings.h extattrs.h \
dircache.h afp_zeroconf.h afp_avahi.h
#include <atalk/paths.h>
#include <atalk/util.h>
#include <atalk/compat.h>
+#include <atalk/fce_api.h>
#include "globals.h"
#include "status.h"
#include "auth.h"
#include "dircache.h"
-#include "fce_api.h"
#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#include <atalk/bstrlib.h>
#include <atalk/bstradd.h>
#include <atalk/errchk.h>
+#include <atalk/fce_api.h>
#include "directory.h"
#include "dircache.h"
#include "unix.h"
#include "mangle.h"
#include "hash.h"
-#include "fce_api.h"
/*
* FIXMEs, loose ends after the dircache rewrite:
#include <atalk/util.h>\r
#include <atalk/cnid.h>\r
#include <atalk/unix.h>\r
+#include <atalk/fce_api.h>\r
\r
#include "fork.h"\r
#include "file.h"\r
#include "desktop.h"\r
#include "volume.h"\r
\r
-#include "fce_api.h"\r
-\r
// ONLY USED IN THIS FILE\r
#include "fce_api_internal.h"\r
\r
}\r
int main( int argc, char*argv[] )\r
{\r
- int port = 11250;\r
- char *host = NULL;\r
+ int c,ret;\r
+\r
+ char *port = FCE_DEFAULT_PORT_STRING;\r
+ char *host = "localhost";\r
int delay_between_events = 1000;\r
int event_code = FCE_FILE_MODIFY;\r
char pathbuff[1024];\r
int duration_in_seconds = 0; // TILL ETERNITY\r
-\r
+ char target[256];\r
char *path = getcwd( pathbuff, sizeof(pathbuff) );\r
\r
// FULLSPEED TEST IS "-s 1001" -> delay is 0 -> send packets without pause\r
\r
- if (argc == 1)\r
- {\r
- fprintf( stdout, "%s: -p Port -h Listener1 [ -h Listener2 ...] -P path -s Delay_between_events_in_us -e event_code -d Duration \n", argv[0]);\r
- exit( 1 );\r
- }\r
- int ret = AFP_OK;\r
-\r
- for (int i = 1; i < argc; i++)\r
- {\r
- char *p = argv[i];\r
- if (*p == '-' && p[1])\r
- {\r
- char *arg = argv[i + 1];\r
- switch (p[1])\r
- {\r
- case 'p': if (arg) port = atoi( arg ), i++; break;\r
- case 'P': if (arg) path = arg, i++; break;\r
- case 's': if (arg) delay_between_events = atoi( arg ), i++; break;\r
- case 'e': if (arg) event_code = atoi( arg ), i++; break;\r
- case 'd': if (arg) duration_in_seconds = atoi( arg ), i++; break;\r
- case 'h':\r
- {\r
- if (arg)\r
- {\r
- host = arg;\r
- char target[256];\r
- sprintf( target, "%s:%d", host, port );\r
- ret += fce_add_udp_socket( target );\r
- i++;\r
- }\r
- break;\r
- } \r
- }\r
+ while ((c = getopt(argc, argv, "d:e:h:p:P:s:")) != -1) {\r
+ switch(c) {\r
+ case '?':\r
+ fprintf(stdout, "%s: [ -p Port -h Listener1 [ -h Listener2 ...] -P path -s Delay_between_events_in_us -e event_code -d Duration ]\n", argv[0]);\r
+ exit(1);\r
+ break;\r
+ case 'd':\r
+ duration_in_seconds = atoi(optarg);\r
+ break;\r
+ case 'e':\r
+ event_code = atoi(optarg);\r
+ break;\r
+ case 'h':\r
+ host = strdup(optarg);\r
+ break;\r
+ case 'p':\r
+ port = strdup(optarg);\r
+ break;\r
+ case 'P':\r
+ path = strdup(optarg);\r
+ break;\r
+ case 's':\r
+ delay_between_events = atoi(optarg);\r
+ break;\r
}\r
}\r
- \r
-\r
- if (host == NULL)\r
- {\r
- char target[256];\r
- sprintf( target, "127.0.0.1:%d", port );\r
- ret += fce_add_udp_socket( target );\r
- }\r
-\r
- if (ret)\r
- return ret;\r
\r
+ sprintf(target, "%s:%s", host, port);\r
+ if (fce_add_udp_socket(target) != 0)\r
+ return 1;\r
\r
int ev_cnt = 0;\r
time_t start_time = time(NULL);\r
+++ /dev/null
-/*
- * File: fce_api.h
- * Author: mw
- *
- * Created on 1. Oktober 2010, 21:35
- *
- * API calls for file change event api
- */
-
-#ifndef _FCE_API_H
-#define _FCE_API_H
-
-struct path;
-struct ofork;
-int fce_register_delete_file( struct path *path );
-int fce_register_delete_dir( char *name );
-int fce_register_new_dir( struct path *path );
-int fce_register_new_file( struct path *path );
-int fce_register_file_modification( struct ofork *ofork );
-
-int fce_add_udp_socket( char *target ); // IP or IP:Port
-int fce_set_coalesce( char *coalesce_opt ); // all|delete|create
-
-#define FCE_DEFAULT_PORT 12250
-
-#endif /* _FCE_API_H */
-
#ifndef _FCE_API_INTERNAL_H\r
#define _FCE_API_INTERNAL_H\r
\r
+/* fce_packet.mode */\r
#define FCE_FILE_MODIFY 1\r
#define FCE_FILE_DELETE 2\r
#define FCE_DIR_DELETE 3\r
#define FCE_CONN_START 42\r
#define FCE_CONN_BROKEN 99\r
\r
+/* fce_packet.fce_magic */\r
+#define FCE_PACKET_MAGIC "at_fcapi"\r
\r
#define FCE_MAX_PATH_LEN 1024\r
-\r
#define FCE_MAX_UDP_SOCKS 5 /* Allow a maximum of udp listeners for file change events */\r
#define FCE_MAX_IP_LEN 255 /* Man len of listener name */\r
#define FCE_SOCKET_RETRY_DELAY_S 600 /* Pause this time in s after socket was broken */\r
#define FCE_PACKET_VERSION 1\r
-\r
-\r
-#define FCE_PACKET_MAGIC "at_fcapi" /* Must fit to size of fce_packet.fce_magic */\r
-\r
#define FCE_HISTORY_LEN 10 /* This is used to coalesce events */\r
#define MAX_COALESCE_TIME_MS 1000 /* Events oldeer than this are not coalesced */\r
\r
#include <atalk/util.h>\r
#include <atalk/cnid.h>\r
#include <atalk/unix.h>\r
+#include <atalk/fce_api.h>\r
\r
#include "fork.h"\r
#include "file.h"\r
#include "desktop.h"\r
#include "volume.h"\r
\r
-#include "fce_api.h"\r
-\r
// ONLY USED IN THIS FILE\r
#include "fce_api_internal.h"\r
\r
#include <atalk/util.h>
#include <atalk/cnid.h>
#include <atalk/unix.h>
+#include <atalk/fce_api.h>
#include "directory.h"
#include "dircache.h"
#include "filedir.h"
#include "globals.h"
#include "unix.h"
-#include "fce_api.h"
/* the format for the finderinfo fields (from IM: Toolbox Essentials):
* field bytes subfield bytes
#include <atalk/bstrlib.h>
#include <atalk/bstradd.h>
#include <atalk/acl.h>
+#include <atalk/fce_api.h>
#include "directory.h"
#include "dircache.h"
#include "globals.h"
#include "filedir.h"
#include "unix.h"
-#include "fce_api.h"
#ifdef DROPKLUDGE
int matchfile2dirperms(
#include <atalk/util.h>
#include <atalk/bstrlib.h>
#include <atalk/bstradd.h>
+#include <atalk/fce_api.h>
#include "globals.h"
#include "volume.h"
#include "directory.h"
#include "fork.h"
-#include "fce_api.h"
/* we need to have a hashed list of oforks (by dev inode). just hash
* by first letter. */
server_ipc.h tdb.h uam.h unicode.h util.h uuid.h volinfo.h \
zip.h ea.h acl.h unix.h directory.h hash.h volume.h
-noinst_HEADERS = cnid_dbd_private.h cnid_private.h bstradd.h bstrlib.h errchk.h ftw.h
+noinst_HEADERS = cnid_dbd_private.h cnid_private.h bstradd.h bstrlib.h errchk.h ftw.h fce_api.h
--- /dev/null
+/*
+ * File: fce_api.h
+ * Author: mw
+ *
+ * Created on 1. Oktober 2010, 21:35
+ *
+ * API calls for file change event api
+ */
+
+#ifndef _FCE_API_H
+#define _FCE_API_H
+
+struct path;
+struct ofork;
+int fce_register_delete_file( struct path *path );
+int fce_register_delete_dir( char *name );
+int fce_register_new_dir( struct path *path );
+int fce_register_new_file( struct path *path );
+int fce_register_file_modification( struct ofork *ofork );
+
+int fce_add_udp_socket( char *target ); // IP or IP:Port
+int fce_set_coalesce( char *coalesce_opt ); // all|delete|create
+
+#define FCE_DEFAULT_PORT 12250
+#define FCE_DEFAULT_PORT_STRING "12250"
+
+#endif /* _FCE_API_H */
+