]> arthur.barton.de Git - netatalk.git/commitdiff
Add fce simple test listener, use getopt in main in fce_api
authorFrank Lahm <franklahm@googlemail.com>
Mon, 30 May 2011 11:32:01 +0000 (13:32 +0200)
committerFrank Lahm <franklahm@googlemail.com>
Mon, 30 May 2011 11:32:01 +0000 (13:32 +0200)
15 files changed:
bin/misc/.gitignore
bin/misc/Makefile.am
bin/misc/fce.c [new file with mode: 0644]
etc/afpd/Makefile.am
etc/afpd/afp_options.c
etc/afpd/directory.c
etc/afpd/fce_api.c
etc/afpd/fce_api.h [deleted file]
etc/afpd/fce_api_internal.h
etc/afpd/fce_util.c
etc/afpd/file.c
etc/afpd/filedir.c
etc/afpd/ofork.c
include/atalk/Makefile.am
include/atalk/fce_api.h [new file with mode: 0755]

index 2bff10ed3a1d944593ad9ff8cea65d8cbecbe84d..84dddb390fcef45d5bc5b67288146b947a67fcce 100644 (file)
@@ -2,6 +2,7 @@ Makefile
 Makefile.in
 netacnv
 afpldaptest
+fce
 logger_test
 .deps
 .libs
index 04a53e23e8b72fa1c59ff0af9944890f9a6188af..426dc3179f25ad99371bdff4e0e341e0a3cc6386 100644 (file)
@@ -3,7 +3,7 @@
 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
@@ -11,6 +11,10 @@ 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\"
diff --git a/bin/misc/fce.c b/bin/misc/fce.c
new file mode 100644 (file)
index 0000000..863665b
--- /dev/null
@@ -0,0 +1,91 @@
+#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;
+}
index e1389dbcd4e77f24e30d5e4329ba0b2ede1385cd..35580d93e599f84943f7fc8beda2baf7952de336 100644 (file)
@@ -70,7 +70,7 @@ afpd_SOURCES += acls.c
 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
index 6fff02fd32c48a970c02745444011df9b5772109..7a2d405f82045aa4947d986a4b55a595f037d21a 100644 (file)
 #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))
index 06ad94f3f10768e5fb9d380237c501ad14839b99..7b25849114d0d9c1e079ca3f77446d5ade6fce36 100644 (file)
@@ -29,6 +29,7 @@
 #include <atalk/bstrlib.h>
 #include <atalk/bstradd.h>
 #include <atalk/errchk.h>
+#include <atalk/fce_api.h>
 
 #include "directory.h"
 #include "dircache.h"
@@ -41,7 +42,6 @@
 #include "unix.h"
 #include "mangle.h"
 #include "hash.h"
-#include "fce_api.h"
 
 /*
  * FIXMEs, loose ends after the dircache rewrite:
index 37f06732c76a83fd8a4366169ae782560883f25b..601f02e215262e1bda24b93d09307636f2e903f2 100755 (executable)
@@ -46,6 +46,7 @@
 #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
@@ -54,8 +55,6 @@
 #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
@@ -458,64 +457,49 @@ void shortsleep( unsigned int us )
 }\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
diff --git a/etc/afpd/fce_api.h b/etc/afpd/fce_api.h
deleted file mode 100755 (executable)
index cabb995..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/* 
- * 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 */
-
index 959ce9ea4c9b0b67897abe84dd12aaffc4697049..bf6cea3e83be0223661e7d8a6a0a95fb880ca2ce 100755 (executable)
@@ -8,6 +8,7 @@
 #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
index 8a89e2449302619c112df79146c212dfd2f9af0d..c1377ee68ae68be95e9fbfdfb9b5fccf40cf1736 100755 (executable)
@@ -48,6 +48,7 @@
 #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
@@ -56,8 +57,6 @@
 #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
index 8257d18b5fa115ecafea861bb11dbf855ee6bd6b..c165eb93f37680a0d6c10290d955e61c01d9c2b4 100644 (file)
@@ -37,6 +37,7 @@ char *strchr (), *strrchr ();
 #include <atalk/util.h>
 #include <atalk/cnid.h>
 #include <atalk/unix.h>
+#include <atalk/fce_api.h>
 
 #include "directory.h"
 #include "dircache.h"
@@ -47,7 +48,6 @@ char *strchr (), *strrchr ();
 #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
index 097ba114b9eaceeaf573f3b3b05c173838b14d2e..5f6e0f643e5987f101a2068123772eb8a50a21f8 100644 (file)
@@ -40,6 +40,7 @@ char *strchr (), *strrchr ();
 #include <atalk/bstrlib.h>
 #include <atalk/bstradd.h>
 #include <atalk/acl.h>
+#include <atalk/fce_api.h>
 
 #include "directory.h"
 #include "dircache.h"
@@ -50,7 +51,6 @@ char *strchr (), *strrchr ();
 #include "globals.h"
 #include "filedir.h"
 #include "unix.h"
-#include "fce_api.h"
 
 #ifdef DROPKLUDGE
 int matchfile2dirperms(
index ed5f732814e7dd5d35ad2aa088c319a2f3d3d8e6..c4901285c9e9d248692d7841cc546e986321fa55 100644 (file)
 #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. */
index 2bf09187b4c6cb996e3a729d0e9c776cabde0311..80bdc14b7a94fc42842723543b06d8d6ba760f4d 100644 (file)
@@ -8,4 +8,4 @@ atalkinclude_HEADERS = \
        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
diff --git a/include/atalk/fce_api.h b/include/atalk/fce_api.h
new file mode 100755 (executable)
index 0000000..a460933
--- /dev/null
@@ -0,0 +1,28 @@
+/* 
+ * 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 */
+