]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
even more cool! nmb-agent moved over to new vagent style, too!
authorLuke Leighton <lkcl@samba.org>
Sat, 4 Dec 1999 22:05:59 +0000 (22:05 +0000)
committerLuke Leighton <lkcl@samba.org>
Sat, 4 Dec 1999 22:05:59 +0000 (22:05 +0000)
(This used to be commit 49c157eae4bb24164f0f976d1bf6cf0cfc068863)

source3/utils/nmb-agent.c

index 7e7b1642cbd64177b4dc8c48ffd6ec9bb9e56d14..fb0e72d461ece99566af5310bf2d5b1f37777a05 100644 (file)
@@ -37,143 +37,15 @@ extern int DEBUGLEVEL;
 
 static int ClientNMB = -1;
 
-struct sock_redir
-{
-       int c;
-       int s;
-       int c_trn_id;
-       int s_trn_id;
-       struct nmb_state *n;
-};
-
-static uint32 num_socks = 0;
-static struct sock_redir **socks = NULL;
-
 /****************************************************************************
 terminate sockent connection
 ****************************************************************************/
-static void sock_redir_free(struct sock_redir *sock)
-{
-       DEBUG(10,("sock_redir_free: %d\n", sock->c));
-       if (sock->c != -1)
-       {
-               close(sock->c);
-               sock->c = -1;
-       }
-       if (sock->n != NULL)
-       {
-               free(sock->n);
-               sock->n = NULL;
-       }
-       free(sock);
-}
-
-/****************************************************************************
-free a sockent array
-****************************************************************************/
-static void free_sock_array(uint32 num_entries, struct sock_redir **entries)
+static void free_sock(void *sock)
 {
-       void(*fn)(void*) = (void(*)(void*))&sock_redir_free;
-       free_void_array(num_entries, (void**)entries, *fn);
-}
-
-/****************************************************************************
-add a sockent state to the array
-****************************************************************************/
-static struct sock_redir* add_sock_to_array(uint32 *len,
-                               struct sock_redir ***array,
-                               struct sock_redir *sock)
-{
-       int i;
-       for (i = 0; i < num_socks; i++)
-       {
-               if (socks[i] == NULL)
-               {
-                       socks[i] = sock;
-                       return sock;
-               }
-       }
-
-       return (struct sock_redir*)add_item_to_array(len,
-                            (void***)array, (void*)sock);
-                               
-}
-
-/****************************************************************************
-initiate sockent array
-****************************************************************************/
-void init_sock_redir(void)
-{
-       socks = NULL;
-       num_socks = 0;
-}
-
-/****************************************************************************
-terminate sockent array
-****************************************************************************/
-void free_sock_redir(void)
-{
-       free_sock_array(num_socks, socks);
-       init_sock_redir();
-}
-
-/****************************************************************************
-create a new sockent state from user credentials
-****************************************************************************/
-static struct sock_redir *sock_redir_get(int fd)
-{
-       struct sock_redir *sock;
-
-       sock = (struct sock_redir*)malloc(sizeof(*sock));
-
-       if (sock == NULL)
-       {
-               return NULL;
-       }
-
-       ZERO_STRUCTP(sock);
-
-       sock->c = fd;
-       sock->s = -1;
-       sock->n = NULL;
-
-       DEBUG(10,("sock_redir_get:\tfd:\t%d\t\n", fd));
-
-       return sock;
-}
-
-/****************************************************************************
-init sock state
-****************************************************************************/
-static void sock_add(int fd)
-{
-       struct sock_redir *sock;
-       sock = sock_redir_get(fd);
        if (sock != NULL)
        {
-               add_sock_to_array(&num_socks, &socks, sock);
-       }
-}
-
-/****************************************************************************
-delete a sockent state
-****************************************************************************/
-static BOOL sock_del(int fd)
-{
-       int i;
-
-       for (i = 0; i < num_socks; i++)
-       {
-               if (socks[i] == NULL) continue;
-               if (socks[i]->c == fd) 
-               {
-                       sock_redir_free(socks[i]);
-                       socks[i] = NULL;
-                       return True;
-               }
+               free(sock);
        }
-
-       return False;
 }
 
 static void filter_reply(struct packet_struct *p, int tr_id)
@@ -181,13 +53,15 @@ static void filter_reply(struct packet_struct *p, int tr_id)
        p->packet.nmb.header.name_trn_id = tr_id;
 }
 
-static BOOL process_cli_sock(struct sock_redir **sock)
+static BOOL process_cli_sock(struct sock_redir **socks,
+                               uint32 num_socks,
+                               struct sock_redir *sock)
 {
        struct packet_struct *p;
        struct nmb_state *nmb;
        static uint16 trn_id = 0x0;
 
-       p = receive_packet((*sock)->c, NMB_SOCK_PACKET, 0);
+       p = receive_packet(sock->c, NMB_SOCK_PACKET, 0);
        if (p == NULL)
        {
                DEBUG(0,("client closed connection\n"));
@@ -201,10 +75,11 @@ static BOOL process_cli_sock(struct sock_redir **sock)
                return False;
        }
 
-       (*sock)->s = ClientNMB;
-       (*sock)->n = nmb;
-       (*sock)->c_trn_id = p->packet.nmb.header.name_trn_id;
-       (*sock)->s_trn_id = trn_id;
+       sock->s = ClientNMB;
+       sock->n = nmb;
+       sock->c_id = p->packet.nmb.header.name_trn_id;
+       sock->s_id = trn_id;
+
        trn_id++;
        if (trn_id > 0xffff)
        {
@@ -213,7 +88,7 @@ static BOOL process_cli_sock(struct sock_redir **sock)
 
        DEBUG(10,("new trn_id: %d\n", trn_id));
 
-       filter_reply(p, (*sock)->s_trn_id);
+       filter_reply(p, sock->s_id);
 
        nmb->ip = p->ip;
        nmb->port = p->port;
@@ -231,7 +106,9 @@ static BOOL process_cli_sock(struct sock_redir **sock)
        return True;
 }
 
-static BOOL process_srv_sock(int fd)
+static BOOL process_srv_sock(struct sock_redir **socks,
+                               uint32 num_socks,
+                               int fd)
 {
        int nmb_id;
        int tr_id;
@@ -261,11 +138,11 @@ static BOOL process_srv_sock(int fd)
                        continue;
                }
 
-               tr_id = socks[i]->s_trn_id;
+               tr_id = socks[i]->s_id;
 
-               DEBUG(10,("list:\tfd:\t%d\tc_trn_id:\t%d\ttr_id:\t%d\n",
+               DEBUG(10,("list:\tfd:\t%d\tc_id:\t%d\ttr_id:\t%d\n",
                           socks[i]->c,
-                          socks[i]->c_trn_id,
+                          socks[i]->c_id,
                           tr_id));
 
                if (nmb_id != tr_id)
@@ -273,7 +150,7 @@ static BOOL process_srv_sock(int fd)
                        continue;
                }
 
-               filter_reply(p, socks[i]->c_trn_id);
+               filter_reply(p, socks[i]->c_id);
                p->fd = socks[i]->c;
                p->packet_type = NMB_SOCK_PACKET;
 
@@ -287,9 +164,9 @@ static BOOL process_srv_sock(int fd)
        return False;
 }
 
-static void start_agent(void)
+static int get_agent_sock(void*id)
 {
-       int s, c;
+       int s;
        struct sockaddr_un sa;
        fstring path;
        fstring dir;
@@ -303,7 +180,7 @@ static void start_agent(void)
        if (chmod(dir, 0777) < 0)
        {
                fprintf(stderr, "chmod on %s failed\n", sa.sun_path);
-               exit(1);
+               return -1;
        }
 
 
@@ -313,7 +190,7 @@ static void start_agent(void)
        if (s < 0)
        {
                fprintf(stderr, "socket open failed\n");
-               exit(1);
+               return -1;
        }
 
        ZERO_STRUCT(sa);
@@ -325,103 +202,43 @@ static void start_agent(void)
                fprintf(stderr, "socket bind to %s failed\n", sa.sun_path);
                close(s);
                remove(path);
-               exit(1);
+               return -1;
        }
 
        if (s == -1)
        {
                DEBUG(0,("bind failed\n"));
                remove(path);
-               exit(1);
+               return -1;
        }
 
+       chmod(path, 0666);
+
        if (listen(s, 5) == -1)
        {
                DEBUG(0,("listen failed\n"));
-               remove(path);
+               return -1;
        }
 
-       while (1)
-       {
-               int i;
-               fd_set fds;
-               int num;
-               struct sockaddr_un addr;
-               int in_addrlen = sizeof(addr);
-               int maxfd = s;
-               
-               FD_ZERO(&fds);
-               FD_SET(s, &fds);
-
-               for (i = 0; i < num_socks; i++)
-               {
-                       if (socks[i] != NULL)
-                       {
-                               int fd = socks[i]->c;
-                               FD_SET(fd, &fds);
-                               maxfd = MAX(maxfd, fd);
-
-                               fd = socks[i]->s;
-                               if (fd != -1)
-                               {
-                                       FD_SET(fd, &fds);
-                                       maxfd = MAX(maxfd, fd);
-                               }
-                       }
-               }
-
-               dbgflush();
-               num = sys_select(maxfd+1,&fds,NULL, NULL);
-
-               if (num <= 0)
-               {
-                       continue;
-               }
+       return s;
+}
 
-               if (FD_ISSET(s, &fds))
-               {
-                       FD_CLR(s, &fds);
-                       c = accept(s, (struct sockaddr*)&addr, &in_addrlen);
-                       if (c != -1)
-                       {
-                               sock_add(c);
-                       }
-               }
+static void start_nmb_agent(void)
+{
+       struct vagent_ops va =
+       {
+               free_sock,
+               get_agent_sock,
+               process_cli_sock,
+               process_srv_sock,
+               NULL,
+               NULL,
+               0
+       };
+       
+       CatchChild();
 
-               for (i = 0; i < num_socks; i++)
-               {
-                       if (socks[i] == NULL)
-                       {
-                               continue;
-                       }
-                       if (FD_ISSET(socks[i]->c, &fds))
-                       {
-                               FD_CLR(socks[i]->c, &fds);
-                               if (!process_cli_sock(&socks[i]))
-                               {
-                                       sock_redir_free(socks[i]);
-                                       socks[i] = NULL;
-                               }
-                       }
-                       if (socks[i] == NULL)
-                       {
-                               continue;
-                       }
-                       if (socks[i]->n == NULL)
-                       {
-                               continue;
-                       }
-                       if (FD_ISSET(socks[i]->s, &fds))
-                       {
-                               FD_CLR(socks[i]->s, &fds);
-                               if (!process_srv_sock(socks[i]->s))
-                               {
-                                       sock_redir_free(socks[i]);
-                                       socks[i] = NULL;
-                               }
-                       }
-               }
-       }
+       start_agent(&va);
 }
 
 /******************************************************************************
@@ -517,7 +334,7 @@ int main(int argc, char *argv[])
                return 1;
        }
 
-       start_agent();
+       start_nmb_agent();
 
        return 0;
 }