SALVSYNC_com initialization typo
[openafs.git] / src / vol / salvsync-server.c
index 6de28b8..c7bc09b 100644 (file)
@@ -26,8 +26,6 @@
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID
-    ("$Header$");
 
 #include <sys/types.h>
 #include <stdio.h>
@@ -74,29 +72,9 @@ RCSID
 
 /*@printflike@*/ extern void Log(const char *format, ...);
 
-#ifdef osi_Assert
-#undef osi_Assert
-#endif
-#define osi_Assert(e) (void)(e)
-
 #define MAXHANDLERS    4       /* Up to 4 clients; must be at least 2, so that
                                 * move = dump+restore can run on single server */
 
-/* Forward declarations */
-static void * SALVSYNC_syncThread(void *);
-static void SALVSYNC_newconnection(int fd);
-static void SALVSYNC_com(int fd);
-static void SALVSYNC_Drop(int fd);
-static void AcceptOn(void);
-static void AcceptOff(void);
-static void InitHandler(void);
-static void CallHandler(fd_set * fdsetp);
-static int AddHandler(int afd, void (*aproc) (int));
-static int FindHandler(register int afd);
-static int FindHandler_r(register int afd);
-static int RemoveHandler(register int afd);
-static void GetHandler(fd_set * fdsetp, int *maxfdp);
-
 
 /*
  * This lock controls access to the handler array.
@@ -109,6 +87,21 @@ struct Lock SALVSYNC_handler_lock;
  * SALVSYNC is a feature specific to the demand attach fileserver
  */
 
+/* Forward declarations */
+static void * SALVSYNC_syncThread(void *);
+static void SALVSYNC_newconnection(osi_socket fd);
+static void SALVSYNC_com(osi_socket fd);
+static void SALVSYNC_Drop(osi_socket fd);
+static void AcceptOn(void);
+static void AcceptOff(void);
+static void InitHandler(void);
+static void CallHandler(fd_set * fdsetp);
+static int AddHandler(osi_socket afd, void (*aproc) (int));
+static int FindHandler(register osi_socket afd);
+static int FindHandler_r(register osi_socket afd);
+static int RemoveHandler(register osi_socket afd);
+static void GetHandler(fd_set * fdsetp, int *maxfdp);
+
 static int AllocNode(struct SalvageQueueNode ** node);
 
 static int AddToSalvageQueue(struct SalvageQueueNode * node);
@@ -196,6 +189,9 @@ static struct QueueHead pendingQueue;  /* volumes being salvaged */
  */
 static int partition_salvaging[VOLMAXPARTS+1];
 
+static int HandlerFD[MAXHANDLERS];
+static void (*HandlerProc[MAXHANDLERS]) (int);
+
 #define VSHASH_SIZE 64
 #define VSHASH_MASK (VSHASH_SIZE-1)
 #define VSHASH(vid) ((vid)&VSHASH_MASK)
@@ -275,6 +271,7 @@ SALVSYNC_salvInit(void)
     pthread_attr_t tattr;
 
     /* initialize the queues */
+    Lock_Init(&SALVSYNC_handler_lock);
     assert(pthread_cond_init(&salvageQueue.cv, NULL) == 0);
     for (i = 0; i <= VOLMAXPARTS; i++) {
        queue_Init(&salvageQueue.part[i]);
@@ -298,6 +295,21 @@ SALVSYNC_salvInit(void)
     assert(pthread_create(&tid, &tattr, SALVSYNC_syncThread, NULL) == 0);
 }
 
+static void
+CleanFDs(void)
+{
+    int i;
+    for (i = 0; i < MAXHANDLERS; ++i) {
+       if (HandlerFD[i] >= 0) {
+           SALVSYNC_Drop(HandlerFD[i]);
+       }
+    }
+
+    /* just in case we were in AcceptOff mode, and thus this fd wouldn't
+     * have a handler */
+    close(salvsync_server_state.fd);
+    salvsync_server_state.fd = -1;
+}
 
 static fd_set SALVSYNC_readfds;
 
@@ -310,6 +322,11 @@ SALVSYNC_syncThread(void * args)
     int tid;
     SYNC_server_state_t * state = &salvsync_server_state;
 
+    /* when we fork, the child needs to close the salvsync server sockets,
+     * otherwise, it may get salvsync requests, instead of the parent
+     * salvageserver */
+    assert(pthread_atfork(NULL, NULL, CleanFDs) == 0);
+
     SYNC_getAddr(&state->endpoint, &state->addr);
     SYNC_cleanupSock(state);
 
@@ -360,7 +377,7 @@ SALVSYNC_newconnection(int afd)
 /* this function processes commands from an salvsync file descriptor (fd) */
 static afs_int32 SALV_cnt = 0;
 static void
-SALVSYNC_com(int fd)
+SALVSYNC_com(osi_socket fd)
 {
     SYNC_command com;
     SYNC_response res;
@@ -368,6 +385,12 @@ SALVSYNC_com(int fd)
     SALVSYNC_command scom;
     SALVSYNC_response sres;
     SYNC_PROTO_BUF_DECL(buf);
+
+    memset(&com, 0, sizeof(com));
+    memset(&res, 0, sizeof(res));
+    memset(&scom, 0, sizeof(scom));
+    memset(&sres, 0, sizeof(sres));
+    memset(&sres_hdr, 0, sizeof(sres_hdr));
     
     com.payload.buf = (void *)buf;
     com.payload.len = SYNC_PROTO_MAX_LEN;
@@ -384,7 +407,7 @@ SALVSYNC_com(int fd)
     sres.res = &res;
 
     SALV_cnt++;
-    if (SYNC_getCom(fd, &com)) {
+    if (SYNC_getCom(&salvsync_server_state, fd, &com)) {
        Log("SALVSYNC_com:  read failed; dropping connection (cnt=%d)\n", SALV_cnt);
        SALVSYNC_Drop(fd);
        return;
@@ -419,6 +442,8 @@ SALVSYNC_com(int fd)
        goto respond;
     }
 
+    res.hdr.com_seq = com.hdr.com_seq;
+
     VOL_LOCK;
     switch (com.hdr.command) {
     case SALVSYNC_NOP:
@@ -453,7 +478,7 @@ SALVSYNC_com(int fd)
     VOL_UNLOCK;
 
  respond:
-    SYNC_putRes(fd, &res);
+    SYNC_putRes(&salvsync_server_state, fd, &res);
     if (res.hdr.flags & SYNC_FLAG_CHANNEL_SHUTDOWN) {
        SALVSYNC_Drop(fd);
     }
@@ -729,7 +754,7 @@ SALVSYNC_com_Query(SALVSYNC_command * com, SALVSYNC_response * res)
 }
 
 static void
-SALVSYNC_Drop(int fd)
+SALVSYNC_Drop(osi_socket fd)
 {
     RemoveHandler(fd);
 #ifdef AFS_NT40_ENV
@@ -762,9 +787,6 @@ AcceptOff(void)
 
 /* The multiple FD handling code. */
 
-static int HandlerFD[MAXHANDLERS];
-static void (*HandlerProc[MAXHANDLERS]) (int);
-
 static void
 InitHandler(void)
 {
@@ -793,7 +815,7 @@ CallHandler(fd_set * fdsetp)
 }
 
 static int
-AddHandler(int afd, void (*aproc) (int))
+AddHandler(osi_socket afd, void (*aproc) (int))
 {
     register int i;
     ObtainWriteLock(&SALVSYNC_handler_lock);
@@ -811,7 +833,7 @@ AddHandler(int afd, void (*aproc) (int))
 }
 
 static int
-FindHandler(register int afd)
+FindHandler(register osi_socket afd)
 {
     register int i;
     ObtainReadLock(&SALVSYNC_handler_lock);
@@ -826,7 +848,7 @@ FindHandler(register int afd)
 }
 
 static int
-FindHandler_r(register int afd)
+FindHandler_r(register osi_socket afd)
 {
     register int i;
     for (i = 0; i < MAXHANDLERS; i++)
@@ -838,7 +860,7 @@ FindHandler_r(register int afd)
 }
 
 static int
-RemoveHandler(register int afd)
+RemoveHandler(register osi_socket afd)
 {
     ObtainWriteLock(&SALVSYNC_handler_lock);
     HandlerFD[FindHandler_r(afd)] = -1;