r16100: Patch from Michael Wood <mwood@icts.uct.ac.za>: s/then/than/ for correct...
[kai/samba.git] / source / libcli / dgram / mailslot.c
index 0e6b99c3e3b43df1d5ccf40ab2d6c1755f89ef0a..c59cab79da2447578a9a24de7f9d91b5f378a1cf 100644 (file)
 
 /*
    This implements "Class 2 mailslots", i.e. the communication mechanism 
-   used for all mailslot packets smaller then 425 bytes. 
+   used for all mailslot packets smaller than 425 bytes. 
 
    "Class 1 mailslots" (which use SMB) are used for messages larger 
-   then 426 bytes and are supported on some systems. These are not implemented
+   than 426 bytes and are supported on some systems. These are not implemented
    in Samba4 yet, as there don't appear to be any core services that use
    them.
 
 /*
   destroy a mailslot handler
 */
-static int dgram_mailslot_destructor(void *ptr)
+static int dgram_mailslot_destructor(struct dgram_mailslot_handler *dgmslot)
 {
-       struct dgram_mailslot_handler *dgmslot = 
-               talloc_get_type(ptr, struct dgram_mailslot_handler);
-       
        DLIST_REMOVE(dgmslot->dgmsock->mailslot_handlers, dgmslot);
        return 0;
 }
@@ -137,7 +134,9 @@ struct dgram_mailslot_handler *dgram_mailslot_temp(struct nbt_dgram_socket *dgms
                }
                dgmslot = dgram_mailslot_listen(dgmsock, name, handler, private);
                talloc_free(name);
-               return dgmslot;
+               if (dgmslot != NULL) {
+                       return dgmslot;
+               }
        }
        DEBUG(2,("Unable to create temporary mailslot from %s\n", mailslot_name));
        return NULL;
@@ -151,28 +150,39 @@ NTSTATUS dgram_mailslot_send(struct nbt_dgram_socket *dgmsock,
                             enum dgram_msg_type msg_type,
                             const char *mailslot_name,
                             struct nbt_name *dest_name,
-                            const struct nbt_peer_socket *_dest,
+                            struct socket_address *_dest,
                             struct nbt_name *src_name,
                             DATA_BLOB *request)
 {
        TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
        struct nbt_dgram_packet packet;
-       struct nbt_peer_socket dest = *_dest;
+       struct socket_address *dest;
        struct dgram_message *msg;
        struct dgram_smb_packet *smb;
        struct smb_trans_body *trans;
+       struct socket_address *src;
        NTSTATUS status;
 
-       if (dest.port == 0) {
-               dest.port = lp_dgram_port();
+       if (_dest->port == 0) {
+               dest = socket_address_from_strings(tmp_ctx, _dest->family, 
+                                                  _dest->addr, lp_dgram_port());
+       } else {
+               dest = _dest;
+       }
+       if (!dest) {
+               return NT_STATUS_NO_MEMORY;
        }
 
        ZERO_STRUCT(packet);
        packet.msg_type = msg_type;
        packet.flags = DGRAM_FLAG_FIRST | DGRAM_NODE_NBDD;
        packet.dgram_id = generate_random() % UINT16_MAX;
-       packet.src_addr = socket_get_my_addr(dgmsock->sock, tmp_ctx);
-       packet.src_port = socket_get_my_port(dgmsock->sock);
+       src = socket_get_my_addr(dgmsock->sock, tmp_ctx);
+       if (!src) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       packet.src_addr = src->addr;
+       packet.src_port = src->port;
 
        msg = &packet.data.msg;
        /* this length calculation is very crude - it should be based on gensize
@@ -198,7 +208,7 @@ NTSTATUS dgram_mailslot_send(struct nbt_dgram_socket *dgmsock,
        trans->mailslot_name = mailslot_name;
        trans->data = *request;
 
-       status = nbt_dgram_send(dgmsock, &packet, &dest);
+       status = nbt_dgram_send(dgmsock, &packet, dest);
 
        talloc_free(tmp_ctx);