Ignore:
Timestamp:
Nov 27, 2012, 4:43:17 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.0

Location:
trunk/server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/server

  • trunk/server/source3/winbindd/winbindd_wins.c

    r414 r745  
    2323#include "includes.h"
    2424#include "winbindd.h"
     25#include "libsmb/nmblib.h"
    2526
    2627#undef DBGC_CLASS
    2728#define DBGC_CLASS DBGC_WINBIND
    2829
    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;
     30static struct node_status *lookup_byaddr_backend(TALLOC_CTX *mem_ctx,
     31                                                 const char *addr, int *count)
     32{
    7633        struct sockaddr_storage ss;
    7734        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;
    8337
    8438        make_nmb_name(&nname, "*", 0);
     
    8640                return NULL;
    8741        }
    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
     50static struct sockaddr_storage *lookup_byname_backend(TALLOC_CTX *mem_ctx,
     51                                                      const char *name,
     52                                                      int *count)
     53{
    9854        struct ip_service *ret = NULL;
    9955        struct sockaddr_storage *return_ss = NULL;
    100         int j, i, flags = 0;
     56        int j, i;
     57        NTSTATUS status;
    10158
    10259        *count = 0;
     
    10663                if ( *count == 0 )
    10764                        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 ) {
    10968                        free( ret );
    11069                        return NULL;
     
    11776                free( ret );
    11877                return return_ss;
    119         }
    120 
    121         fd = wins_lookup_open_socket_in();
    122         if (fd == -1) {
    123                 return NULL;
    12478        }
    12579
     
    13286                        continue;
    13387                }
    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)) {
    13691                        break;
    13792                }
    13893        }
    13994
    140         close(fd);
    14195        return return_ss;
    14296}
     
    148102        fstring response;
    149103        int i, count, maxlen, size;
    150         NODE_STATUS_STRUCT *status;
     104        struct node_status *status;
    151105
    152106        /* Ensure null termination */
     
    159113        maxlen = sizeof(response) - 1;
    160114
    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))) {
    162117            size = strlen(state->request->data.winsreq);
    163118            if (size > maxlen) {
    164                 SAFE_FREE(status);
     119                TALLOC_FREE(status);
    165120                request_error(state);
    166121                return;
     
    174129                        size = sizeof(status[i].name) + strlen(response);
    175130                        if (size > maxlen) {
    176                             SAFE_FREE(status);
     131                            TALLOC_FREE(status);
    177132                            request_error(state);
    178133                            return;
     
    184139            /* make last character a newline */
    185140            response[strlen(response)-1] = '\n';
    186             SAFE_FREE(status);
     141            TALLOC_FREE(status);
    187142        }
    188143        fstrcpy(state->response->data.winsresp,response);
     
    208163        maxlen = sizeof(response) - 1;
    209164
    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){
    211168                for (i = count; i ; i--) {
    212169                        print_sockaddr(addr, sizeof(addr), &ip_list[i-1]);
    213170                        size = strlen(addr);
    214171                        if (size > maxlen) {
    215                                 SAFE_FREE(ip_list);
     172                                TALLOC_FREE(ip_list);
    216173                                request_error(state);
    217174                                return;
     
    230187                size = strlen(state->request->data.winsreq) + strlen(response);
    231188                if (size > maxlen) {
    232                     SAFE_FREE(ip_list);
     189                    TALLOC_FREE(ip_list);
    233190                    request_error(state);
    234191                    return;
     
    236193                fstrcat(response,state->request->data.winsreq);
    237194                fstrcat(response,"\n");
    238                 SAFE_FREE(ip_list);
     195                TALLOC_FREE(ip_list);
    239196        } else {
    240197                request_error(state);
Note: See TracChangeset for help on using the changeset viewer.