summaryrefslogtreecommitdiff
path: root/source3/libsmb/clidgram.c
diff options
context:
space:
mode:
authorRichard Sharpe <sharpe@samba.org>2001-02-18 10:36:03 +0000
committerRichard Sharpe <sharpe@samba.org>2001-02-18 10:36:03 +0000
commit0293869b1f6012d1f106e4ab1bd392cea1c66ff0 (patch)
tree62aee01474ad53662e67737ef0c59ef5efc0ad84 /source3/libsmb/clidgram.c
parentfd46817f0b20c633c80dee70a29cf7478e2dfd68 (diff)
downloadsamba-0293869b1f6012d1f106e4ab1bd392cea1c66ff0.tar.gz
samba-0293869b1f6012d1f106e4ab1bd392cea1c66ff0.tar.bz2
samba-0293869b1f6012d1f106e4ab1bd392cea1c66ff0.zip
Fixes to libsmbclient so it will work when browsing real Windows systems which
only respond to port 138 when dealing with NetBIOS datagrams. We use the unexpected packed database. (This used to be commit 620cc34015ab16d25f7ef7e13cbc3d0f669da11e)
Diffstat (limited to 'source3/libsmb/clidgram.c')
-rw-r--r--source3/libsmb/clidgram.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/source3/libsmb/clidgram.c b/source3/libsmb/clidgram.c
index c58e3fc796..68ac3b5c45 100644
--- a/source3/libsmb/clidgram.c
+++ b/source3/libsmb/clidgram.c
@@ -42,6 +42,7 @@ int cli_send_mailslot(BOOL unique, char *mailslot, char *buf, int len,
struct sockaddr_in sock_out;
char *ptr, *p2;
char tmp[4];
+ int name_size;
bzero((char *)&p, sizeof(p));
@@ -51,8 +52,6 @@ int cli_send_mailslot(BOOL unique, char *mailslot, char *buf, int len,
if (dgram_sock < 1) {
- int name_size;
-
if ((dgram_sock = open_socket_out(SOCK_DGRAM, &dest_ip, 138, LONG_CONNECT_TIMEOUT)) < 0) {
DEBUG(4, ("open_sock_out failed ..."));
@@ -67,22 +66,35 @@ int cli_send_mailslot(BOOL unique, char *mailslot, char *buf, int len,
/* Now, bind my addr to it ... */
bzero((char *)&sock_out, sizeof(sock_out));
- putip((char *)&sock_out.sin_addr, (char *)&src_ip);
- sock_out.sin_port = INADDR_ANY;
+ sock_out.sin_addr.s_addr = INADDR_ANY;
+ sock_out.sin_port = htons(138);
sock_out.sin_family = AF_INET;
- bind(dgram_sock, (struct sockaddr_in *)&sock_out, sizeof(sock_out));
+ if (bind(dgram_sock, (struct sockaddr_in *)&sock_out, sizeof(sock_out)) < 0) {
+
+ /* Try again on any port ... */
- /* Now, figure out what socket name we were bound to. We want the port */
+ sock_out.sin_port = INADDR_ANY;
- name_size = sizeof(sock_out);
+ if (bind(dgram_sock, (struct sockaddr_in *)&sock_out, sizeof(sock_out)) < 0) {
- getsockname(dgram_sock, (struct sockaddr_in *)&sock_out, &name_size);
+ DEBUG(4, ("failed to bind socket to address ...\n"));
+ return False;
- fprintf(stderr, "Socket bound to IP:%s, port: %d\n", inet_ntoa(sock_out.sin_addr), ntohs(sock_out.sin_port));
+ }
+
+ }
}
+ /* Now, figure out what socket name we were bound to. We want the port */
+
+ name_size = sizeof(sock_out);
+
+ getsockname(dgram_sock, (struct sockaddr_in *)&sock_out, &name_size);
+
+ fprintf(stderr, "Socket bound to IP:%s, port: %d\n", inet_ntoa(sock_out.sin_addr), ntohs(sock_out.sin_port));
+
/*
* Next, build the DGRAM ...
*/
@@ -93,8 +105,10 @@ int cli_send_mailslot(BOOL unique, char *mailslot, char *buf, int len,
dgram->header.flags.first = True;
dgram->header.flags.more = False;
dgram->header.dgm_id = ((unsigned)time(NULL)%(unsigned)0x7FFF) + ((unsigned)sys_getpid()%(unsigned)100);
- dgram->header.source_ip = src_ip;
+ dgram->header.source_ip.s_addr = sock_out.sin_addr.s_addr;
+ fprintf(stderr, "Source IP = %0X\n", dgram->header.source_ip);
dgram->header.source_port = ntohs(sock_out.sin_port);
+ fprintf(stderr, "Source Port = %0X\n", dgram->header.source_port);
dgram->header.dgm_length = 0; /* Let build_dgram() handle this. */
dgram->header.packet_offset = 0;
@@ -147,7 +161,7 @@ int cli_get_response(BOOL unique, char *mailslot, char *buf, int bufsiz)
{
struct packet_struct *packet;
- packet = read_packet(dgram_sock, DGRAM_PACKET);
+ packet = receive_dgram_packet(dgram_sock, 2, mailslot);
if (packet) { /* We got one, pull what we want out of the SMB data ... */
@@ -166,7 +180,6 @@ int cli_get_response(BOOL unique, char *mailslot, char *buf, int bufsiz)
else
return -1;
- return 0;
}
/*
@@ -187,7 +200,7 @@ int cli_get_backup_list(const char *myname, const char *send_to_name)
}
- bzero(&my_ip, 4); /* Cheap way to get 0.0.0.0 in there */
+ my_ip.s_addr = inet_addr("0.0.0.0");
if (!resolve_name(myname, &my_ip, 0x00)) { /* FIXME: Call others here */
@@ -220,7 +233,6 @@ int cli_get_backup_list(const char *myname, const char *send_to_name)
/* Should check the response here ... FIXME */
- return 0;
}
/*
@@ -236,7 +248,4 @@ int cli_get_backup_server(char *my_name, char *target, char *servername, int nam
strncpy(servername, cli_backup_list, MIN(16, namesize));
- /* Should check the response here ... FIXME */
-
- return 0;
}