]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/fce_api.c
Merge master
[netatalk.git] / etc / afpd / fce_api.c
index fb7535b6c485e68b2dd8bfe269d2aabb8d89eca8..23991febd0b05dcde8c195abcf1751e8cd25230a 100644 (file)
@@ -37,8 +37,6 @@
 #include <arpa/inet.h>
 #include <netdb.h>
 
-#include <netatalk/at.h>
-
 #include <atalk/adouble.h>
 #include <atalk/vfs.h>
 #include <atalk/logger.h>
@@ -155,42 +153,44 @@ void fce_cleanup()
     udp_initialized = FCE_FALSE;
 }
 
-
 /*
  * Construct a UDP packet for our listeners and return packet size
  * */
 static ssize_t build_fce_packet( struct fce_packet *packet, char *path, int mode, uint32_t event_id )
 {
-    size_t pathlen;
+    size_t pathlen = 0;
     ssize_t data_len = 0;
+    uint64_t *t;
 
-    strncpy(packet->magic, FCE_PACKET_MAGIC, sizeof(packet->magic) );
+    /* Set content of packet */
+    memcpy(packet->magic, FCE_PACKET_MAGIC, sizeof(packet->magic) );
     packet->version = FCE_PACKET_VERSION;
     packet->mode = mode;
-    packet->event_id = event_id;
-
-    pathlen = strlen(path) + 1; /* include string terminator */
+   
+    packet->event_id = event_id; 
 
+    pathlen = strlen(path); /* exclude string terminator */
+    
     /* This should never happen, but before we bust this server, we send nonsense, fce listener has to cope */
     if (pathlen >= MAXPATHLEN)
         pathlen = MAXPATHLEN - 1;
 
-    /* This is the payload len. Means: the stream has len bytes more until packet is finished */
-    /* A server should read the first 16 byte, decode them and then fetch the rest */
-    data_len = FCE_PACKET_HEADER_SIZE + pathlen;
     packet->datalen = pathlen;
 
+    /* This is the payload len. Means: the packet has len bytes more until packet is finished */
+    data_len = FCE_PACKET_HEADER_SIZE + pathlen;
+
     switch (mode) {
     case FCE_TM_SIZE:
-        tm_used = hton64(tm_used);
-        memcpy(packet->data, &tm_used, sizeof(tm_used));
-        strncpy(packet->data + sizeof(tm_used), path, pathlen);
-
-        packet->datalen += sizeof(tm_used);
+        t = (uint64_t *)packet->data;
+        *t = hton64(tm_used);
+        memcpy(packet->data + sizeof(tm_used), path, pathlen);
+        
+        packet->datalen = pathlen + sizeof(tm_used);
         data_len += sizeof(tm_used);
         break;
     default:
-        strncpy(packet->data, path, pathlen);
+        memcpy(packet->data, path, pathlen);
         break;
     }
 
@@ -198,7 +198,10 @@ static ssize_t build_fce_packet( struct fce_packet *packet, char *path, int mode
     return data_len;
 }
 
-static int pack_fce_packet(struct fce_packet *packet, unsigned char *buf)
+/*
+ * Handle Endianess and write into buffer w/o padding
+ **/ 
+static void pack_fce_packet(struct fce_packet *packet, unsigned char *buf, int maxlen)
 {
     unsigned char *p = buf;
 
@@ -211,18 +214,17 @@ static int pack_fce_packet(struct fce_packet *packet, unsigned char *buf)
     *p = packet->mode;
     p++;
     
-    uint32_t id = htonl(packet->event_id);
-    memcpy(p, &id, sizeof(id));
+    uint32_t *id = (uint32_t*)p;
+    *id = htonl(packet->event_id);
     p += sizeof(packet->event_id);
 
-    uint16_t l = htons(packet->datalen);
-    memcpy(p, &l, sizeof(l));
-    p += sizeof(l);
-
-    memcpy(p, &packet->data[0], packet->datalen);
-    p += packet->datalen;
+    uint16_t *l = ( uint16_t *)p;
+    *l = htons(packet->datalen);
+    p += sizeof(packet->datalen);
 
-    return 0;
+    if (((p - buf) +  packet->datalen) < maxlen) {
+        memcpy(p, &packet->data[0], packet->datalen);
+    }
 }
 
 /*
@@ -250,7 +252,7 @@ static void send_fce_event( char *path, int mode )
 
     /* build our data packet */
     ssize_t data_len = build_fce_packet( &packet, path, mode, ++event_id );
-    pack_fce_packet(&packet, iobuf);
+    pack_fce_packet(&packet, iobuf, MAXIOBUF);
 
     for (int i = 0; i < udp_sockets; i++)
     {
@@ -281,7 +283,7 @@ static void send_fce_event( char *path, int mode )
 
             /* Okay, we have a running socket again, send server that we had a problem on our side*/
             data_len = build_fce_packet( &packet, "", FCE_CONN_BROKEN, 0 );
-            pack_fce_packet(&packet, iobuf);
+            pack_fce_packet(&packet, iobuf, MAXIOBUF);
 
             sendto(udp_entry->sock,
                    iobuf,
@@ -292,7 +294,7 @@ static void send_fce_event( char *path, int mode )
 
             /* Rebuild our original data packet */
             data_len = build_fce_packet( &packet, path, mode, event_id );
-            pack_fce_packet(&packet, iobuf);
+            pack_fce_packet(&packet, iobuf, MAXIOBUF);
         }
 
         sent_data = sendto(udp_entry->sock,
@@ -459,7 +461,7 @@ int fce_register_delete_file( struct path *path )
     if (!(fce_ev_enabled & (1 << FCE_FILE_DELETE)))
         return ret;
        
-    ret = register_fce( path->u_name, FALSE, FCE_FILE_DELETE );
+    ret = register_fce( path->u_name, false, FCE_FILE_DELETE );
 
     return ret;
 }
@@ -473,7 +475,7 @@ int fce_register_delete_dir( char *name )
     if (!(fce_ev_enabled & (1 << FCE_DIR_DELETE)))
         return ret;
        
-    ret = register_fce( name, TRUE, FCE_DIR_DELETE);
+    ret = register_fce( name, true, FCE_DIR_DELETE);
 
     return ret;
 }
@@ -488,7 +490,7 @@ int fce_register_new_dir( struct path *path )
     if (!(fce_ev_enabled & (1 << FCE_DIR_CREATE)))
         return ret;
 
-    ret = register_fce( path->u_name, TRUE, FCE_DIR_CREATE );
+    ret = register_fce( path->u_name, true, FCE_DIR_CREATE );
 
     return ret;
 }
@@ -504,31 +506,22 @@ int fce_register_new_file( struct path *path )
     if (!(fce_ev_enabled & (1 << FCE_FILE_CREATE)))
         return ret;
 
-    ret = register_fce( path->u_name, FALSE, FCE_FILE_CREATE );
+    ret = register_fce( path->u_name, false, FCE_FILE_CREATE );
 
     return ret;
 }
 
 int fce_register_file_modification( struct ofork *ofork )
 {
-    char *u_name = NULL;
-    struct vol *vol;
     int ret = AFP_OK;
 
-    if (ofork == NULL || ofork->of_vol == NULL)
+    if (ofork == NULL)
         return AFPERR_PARAM;
 
     if (!(fce_ev_enabled & (1 << FCE_FILE_MODIFY)))
         return ret;
 
-    vol = ofork->of_vol;
-
-    if (NULL == (u_name = mtoupath(vol, of_name(ofork), ofork->of_did, utf8_encoding()))) 
-    {
-        return AFPERR_MISC;
-    }
-    
-    ret = register_fce( u_name, FALSE, FCE_FILE_MODIFY );
+    ret = register_fce(of_name(ofork), false, FCE_FILE_MODIFY );
     
     return ret;    
 }
@@ -544,7 +537,7 @@ int fce_register_tm_size(const char *vol, size_t used)
         return ret;
 
     tm_used = used;             /* oh what a hack */
-    ret = register_fce(vol, FALSE, FCE_TM_SIZE);
+    ret = register_fce(vol, false, FCE_TM_SIZE);
 
     return ret;
 }
@@ -599,6 +592,8 @@ int fce_set_events(const char *events)
     }
 
     free(e);
+
+    return AFP_OK;
 }
 
 #ifdef FCE_TEST_MAIN