summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/utils/nmb-agent.c116
-rw-r--r--source3/utils/smb-agent.c24
2 files changed, 78 insertions, 62 deletions
diff --git a/source3/utils/nmb-agent.c b/source3/utils/nmb-agent.c
index 12795e5bdd..61959ba680 100644
--- a/source3/utils/nmb-agent.c
+++ b/source3/utils/nmb-agent.c
@@ -40,6 +40,7 @@ static int ClientNMB = -1;
struct sock_redir
{
int c;
+ int s;
int c_trn_id;
int s_trn_id;
struct nmb_state *n;
@@ -136,6 +137,7 @@ static struct sock_redir *sock_redir_get(int fd)
ZERO_STRUCTP(sock);
sock->c = fd;
+ sock->s = -1;
sock->n = NULL;
sock->time = time(NULL);
@@ -199,9 +201,11 @@ static BOOL process_cli_sock(struct sock_redir **sock)
nmb = (struct nmb_state*)malloc(sizeof(struct nmb_state));
if (nmb == NULL)
{
+ free(p);
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;
@@ -224,44 +228,67 @@ static BOOL process_cli_sock(struct sock_redir **sock)
if (!send_packet(p))
{
DEBUG(0,("server is dead\n"));
+ free(p);
return False;
}
+ free(p);
return True;
}
-static BOOL process_srv_sock(struct sock_redir *sock, struct packet_struct *p)
+static BOOL process_srv_sock(struct sock_redir *sock)
{
int nmb_id;
int tr_id;
+ int i;
+
+ struct packet_struct *p;
+
+ p = receive_packet(sock->s, NMB_PACKET, 0);
if (p == NULL)
{
return False;
}
- nmb_id = p->packet.nmb.header.name_trn_id;
- tr_id = sock->s_trn_id;
+ if (!p->packet.nmb.header.response)
+ {
+ free(p);
+ return True;
+ }
+ nmb_id = p->packet.nmb.header.name_trn_id;
DEBUG(10,("process_srv_sock:\tnmb_id:\t%d\n", nmb_id));
- DEBUG(10,("list:\tfd:\t%d\tnmb_id:\t%d\ttr_id:\t%d\n",
- sock->c,
- nmb_id,
- tr_id));
-
- if (nmb_id != tr_id)
+ for (i = 0; i < num_socks; i++)
{
- return False;
- }
+ if (socks[i] == NULL)
+ {
+ continue;
+ }
- filter_reply(p, sock->c_trn_id);
- p->fd = sock->c;
- p->packet_type = NMB_SOCK_PACKET;
+ tr_id = socks[i]->s_trn_id;
- if (!send_packet(p))
- {
- DEBUG(0,("client is dead\n"));
- }
- return True;
+ DEBUG(10,("list:\tfd:\t%d\tc_trn_id:\t%d\ttr_id:\t%d\n",
+ socks[i]->c,
+ socks[i]->c_trn_id,
+ tr_id));
+
+ if (nmb_id != tr_id)
+ {
+ continue;
+ }
+
+ filter_reply(p, socks[i]->c_trn_id);
+ p->fd = socks[i]->c;
+ p->packet_type = NMB_SOCK_PACKET;
+
+ if (!send_packet(p))
+ {
+ DEBUG(0,("client is dead\n"));
+ return False;
+ }
+ return True;
+ }
+ return False;
}
static void start_agent(void)
@@ -326,13 +353,9 @@ static void start_agent(void)
struct sockaddr_un addr;
int in_addrlen = sizeof(addr);
int maxfd = s;
- struct packet_struct *p = NULL;
- time_t current_time = time(NULL);
FD_ZERO(&fds);
FD_SET(s, &fds);
- FD_SET(ClientNMB, &fds);
- maxfd = MAX(ClientNMB, maxfd);
for (i = 0; i < num_socks; i++)
{
@@ -342,6 +365,12 @@ static void start_agent(void)
FD_SET(fd, &fds);
maxfd = MAX(maxfd, fd);
+ fd = socks[i]->s;
+ if (fd != -1)
+ {
+ FD_SET(fd, &fds);
+ maxfd = MAX(maxfd, fd);
+ }
}
}
@@ -353,8 +382,11 @@ static void start_agent(void)
continue;
}
+ DEBUG(10,("select received\n"));
+
if (FD_ISSET(s, &fds))
{
+ FD_CLR(s, &fds);
c = accept(s, (struct sockaddr*)&addr, &in_addrlen);
if (c != -1)
{
@@ -362,19 +394,6 @@ static void start_agent(void)
}
}
- if (FD_ISSET(ClientNMB, &fds))
- {
- p = receive_packet(ClientNMB, NMB_PACKET, 0);
- if (p && !p->packet.nmb.header.response)
- {
- free(p);
- p = NULL;
- }
- }
- else
- {
- p = NULL;
- }
for (i = 0; i < num_socks; i++)
{
if (socks[i] == NULL)
@@ -383,36 +402,31 @@ static void start_agent(void)
}
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 (p == NULL)
+ if (socks[i] == NULL)
{
continue;
}
-
- if (socks[i] == NULL)
+ if (socks[i]->s == -1)
{
continue;
}
-
- if (process_srv_sock(socks[i], p) ||
- current_time > socks[i]->time + 5)
+ if (FD_ISSET(socks[i]->s, &fds))
{
- sock_redir_free(socks[i]);
- socks[i] = NULL;
+ FD_CLR(socks[i]->s, &fds);
+ if (!process_srv_sock(socks[i]))
+ {
+ sock_redir_free(socks[i]);
+ socks[i] = NULL;
+ }
}
}
-
- if (p != NULL)
- {
- free(p);
- p = NULL;
- }
}
}
diff --git a/source3/utils/smb-agent.c b/source3/utils/smb-agent.c
index fd8697771d..dc110fb1da 100644
--- a/source3/utils/smb-agent.c
+++ b/source3/utils/smb-agent.c
@@ -323,7 +323,8 @@ static void filter_reply(char *buf, int moff)
SCVAL(buf, smb_mid, x);
}
-void process_cli_sock(struct sock_redir **sock)
+
+static BOOL process_cli_sock(struct sock_redir **sock)
{
struct cli_state *s = (*sock)->s;
if (s == NULL)
@@ -331,9 +332,7 @@ void process_cli_sock(struct sock_redir **sock)
s = init_client_connection((*sock)->c);
if (s == NULL)
{
- sock_redir_free(*sock);
- *sock = NULL;
- return ;
+ return False;
}
(*sock)->s = s;
}
@@ -342,9 +341,7 @@ void process_cli_sock(struct sock_redir **sock)
if (!receive_smb((*sock)->c, packet, 0))
{
DEBUG(0,("client closed connection\n"));
- sock_redir_free(*sock);
- *sock = NULL;
- return;
+ return False;
}
filter_reply(packet, (*sock)->mid_offset);
@@ -354,12 +351,11 @@ void process_cli_sock(struct sock_redir **sock)
if (!send_smb(s->fd, packet))
{
DEBUG(0,("server is dead\n"));
- sock_redir_free(*sock);
- *sock = NULL;
- return;
+ return False;
}
}
}
+ return True;
}
static int get_smbmid(char *buf)
@@ -513,6 +509,7 @@ static void start_agent(void)
if (FD_ISSET(s, &fds))
{
+ FD_CLR(s, &fds);
c = accept(s, (struct sockaddr*)&addr, &in_addrlen);
if (c != -1)
{
@@ -528,7 +525,12 @@ static void start_agent(void)
}
if (FD_ISSET(socks[i]->c, &fds))
{
- process_cli_sock(&socks[i]);
+ FD_CLR(socks[i]->c, &fds);
+ if (!process_cli_sock(&socks[i]))
+ {
+ sock_redir_free(socks[i]);
+ socks[i] = NULL;
+ }
}
if (socks[i] == NULL)
{