Changeset 745 for trunk/server/source3/winbindd/winbindd_wins.c
- Timestamp:
- Nov 27, 2012, 4:43:17 PM (13 years ago)
- Location:
- trunk/server
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server
- Property svn:mergeinfo changed
/vendor/current merged: 581,587,591,594,597,600,615,618,740
- Property svn:mergeinfo changed
-
trunk/server/source3/winbindd/winbindd_wins.c
r414 r745 23 23 #include "includes.h" 24 24 #include "winbindd.h" 25 #include "libsmb/nmblib.h" 25 26 26 27 #undef DBGC_CLASS 27 28 #define DBGC_CLASS DBGC_WINBIND 28 29 29 /* Use our own create socket code so we don't recurse.... */ 30 31 static int wins_lookup_open_socket_in(void) 32 { 33 struct sockaddr_in sock; 34 int val=1; 35 int res; 36 37 memset((char *)&sock,'\0',sizeof(sock)); 38 39 #ifdef HAVE_SOCK_SIN_LEN 40 sock.sin_len = sizeof(sock); 41 #endif 42 sock.sin_port = 0; 43 sock.sin_family = AF_INET; 44 sock.sin_addr.s_addr = interpret_addr("0.0.0.0"); 45 res = socket(AF_INET, SOCK_DGRAM, 0); 46 if (res == -1) 47 return -1; 48 49 if (setsockopt(res,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))) { 50 close(res); 51 return -1; 52 } 53 #ifdef SO_REUSEPORT 54 if (setsockopt(res,SOL_SOCKET,SO_REUSEPORT,(char *)&val,sizeof(val))) { 55 close(res); 56 return -1; 57 } 58 #endif /* SO_REUSEPORT */ 59 60 /* now we've got a socket - we need to bind it */ 61 62 if (bind(res, (struct sockaddr *)(void *)&sock, sizeof(sock)) < 0) { 63 close(res); 64 return(-1); 65 } 66 67 set_socket_options(res,"SO_BROADCAST"); 68 69 return res; 70 } 71 72 73 static NODE_STATUS_STRUCT *lookup_byaddr_backend(const char *addr, int *count) 74 { 75 int fd; 30 static struct node_status *lookup_byaddr_backend(TALLOC_CTX *mem_ctx, 31 const char *addr, int *count) 32 { 76 33 struct sockaddr_storage ss; 77 34 struct nmb_name nname; 78 NODE_STATUS_STRUCT *status; 79 80 fd = wins_lookup_open_socket_in(); 81 if (fd == -1) 82 return NULL; 35 struct node_status *result; 36 NTSTATUS status; 83 37 84 38 make_nmb_name(&nname, "*", 0); … … 86 40 return NULL; 87 41 } 88 status = node_status_query(fd, &nname, &ss, count, NULL); 89 90 close(fd); 91 return status; 92 } 93 94 static struct sockaddr_storage *lookup_byname_backend(const char *name, 95 int *count) 96 { 97 int fd; 42 status = node_status_query(mem_ctx, &nname, &ss, 43 &result, count, NULL); 44 if (!NT_STATUS_IS_OK(status)) { 45 return NULL; 46 } 47 return result; 48 } 49 50 static struct sockaddr_storage *lookup_byname_backend(TALLOC_CTX *mem_ctx, 51 const char *name, 52 int *count) 53 { 98 54 struct ip_service *ret = NULL; 99 55 struct sockaddr_storage *return_ss = NULL; 100 int j, i, flags = 0; 56 int j, i; 57 NTSTATUS status; 101 58 102 59 *count = 0; … … 106 63 if ( *count == 0 ) 107 64 return NULL; 108 if ( (return_ss = SMB_MALLOC_ARRAY(struct sockaddr_storage, *count)) == NULL ) { 65 return_ss = TALLOC_ARRAY(mem_ctx, struct sockaddr_storage, 66 *count); 67 if (return_ss == NULL ) { 109 68 free( ret ); 110 69 return NULL; … … 117 76 free( ret ); 118 77 return return_ss; 119 }120 121 fd = wins_lookup_open_socket_in();122 if (fd == -1) {123 return NULL;124 78 } 125 79 … … 132 86 continue; 133 87 } 134 return_ss = name_query(fd,name,0x20,True,True,bcast_ss,count, &flags, NULL); 135 if (return_ss) { 88 status = name_query(name, 0x20, True, True,bcast_ss, 89 mem_ctx, &return_ss, count, NULL); 90 if (NT_STATUS_IS_OK(status)) { 136 91 break; 137 92 } 138 93 } 139 94 140 close(fd);141 95 return return_ss; 142 96 } … … 148 102 fstring response; 149 103 int i, count, maxlen, size; 150 NODE_STATUS_STRUCT*status;104 struct node_status *status; 151 105 152 106 /* Ensure null termination */ … … 159 113 maxlen = sizeof(response) - 1; 160 114 161 if ((status = lookup_byaddr_backend(state->request->data.winsreq, &count))){ 115 if ((status = lookup_byaddr_backend( 116 state->mem_ctx, state->request->data.winsreq, &count))) { 162 117 size = strlen(state->request->data.winsreq); 163 118 if (size > maxlen) { 164 SAFE_FREE(status);119 TALLOC_FREE(status); 165 120 request_error(state); 166 121 return; … … 174 129 size = sizeof(status[i].name) + strlen(response); 175 130 if (size > maxlen) { 176 SAFE_FREE(status);131 TALLOC_FREE(status); 177 132 request_error(state); 178 133 return; … … 184 139 /* make last character a newline */ 185 140 response[strlen(response)-1] = '\n'; 186 SAFE_FREE(status);141 TALLOC_FREE(status); 187 142 } 188 143 fstrcpy(state->response->data.winsresp,response); … … 208 163 maxlen = sizeof(response) - 1; 209 164 210 if ((ip_list = lookup_byname_backend(state->request->data.winsreq,&count))){ 165 ip_list = lookup_byname_backend( 166 state->mem_ctx, state->request->data.winsreq, &count); 167 if (ip_list != NULL){ 211 168 for (i = count; i ; i--) { 212 169 print_sockaddr(addr, sizeof(addr), &ip_list[i-1]); 213 170 size = strlen(addr); 214 171 if (size > maxlen) { 215 SAFE_FREE(ip_list);172 TALLOC_FREE(ip_list); 216 173 request_error(state); 217 174 return; … … 230 187 size = strlen(state->request->data.winsreq) + strlen(response); 231 188 if (size > maxlen) { 232 SAFE_FREE(ip_list);189 TALLOC_FREE(ip_list); 233 190 request_error(state); 234 191 return; … … 236 193 fstrcat(response,state->request->data.winsreq); 237 194 fstrcat(response,"\n"); 238 SAFE_FREE(ip_list);195 TALLOC_FREE(ip_list); 239 196 } else { 240 197 request_error(state);
Note:
See TracChangeset
for help on using the changeset viewer.