/src/samba/source4/libcli/dgram/browse.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | Unix SMB/CIFS implementation. |
3 | | |
4 | | handling for browsing dgram requests |
5 | | |
6 | | Copyright (C) Jelmer Vernooij 2005 |
7 | | Heavily based on ntlogon.c |
8 | | |
9 | | This program is free software; you can redistribute it and/or modify |
10 | | it under the terms of the GNU General Public License as published by |
11 | | the Free Software Foundation; either version 3 of the License, or |
12 | | (at your option) any later version. |
13 | | |
14 | | This program is distributed in the hope that it will be useful, |
15 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | | GNU General Public License for more details. |
18 | | |
19 | | You should have received a copy of the GNU General Public License |
20 | | along with this program. If not, see <http://www.gnu.org/licenses/>. |
21 | | */ |
22 | | |
23 | | #include "includes.h" |
24 | | #include "lib/util/util_file.h" |
25 | | #include "libcli/dgram/libdgram.h" |
26 | | #include "lib/socket/socket.h" |
27 | | #include "libcli/resolve/resolve.h" |
28 | | #include "librpc/gen_ndr/ndr_nbt.h" |
29 | | #include "param/param.h" |
30 | | |
31 | | NTSTATUS dgram_mailslot_browse_send(struct nbt_dgram_socket *dgmsock, |
32 | | struct nbt_name *dest_name, |
33 | | struct socket_address *dest, |
34 | | struct nbt_name *src_name, |
35 | | struct nbt_browse_packet *request) |
36 | 0 | { |
37 | 0 | NTSTATUS status; |
38 | 0 | enum ndr_err_code ndr_err; |
39 | 0 | DATA_BLOB blob; |
40 | 0 | TALLOC_CTX *tmp_ctx = talloc_new(dgmsock); |
41 | |
|
42 | 0 | ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, request, |
43 | 0 | (ndr_push_flags_fn_t)ndr_push_nbt_browse_packet); |
44 | 0 | if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { |
45 | 0 | talloc_free(tmp_ctx); |
46 | 0 | return ndr_map_error2ntstatus(ndr_err); |
47 | 0 | } |
48 | | |
49 | 0 | status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE, |
50 | 0 | NBT_MAILSLOT_BROWSE, |
51 | 0 | dest_name, dest, |
52 | 0 | src_name, &blob); |
53 | 0 | talloc_free(tmp_ctx); |
54 | 0 | return status; |
55 | 0 | } |
56 | | |
57 | | NTSTATUS dgram_mailslot_browse_reply(struct nbt_dgram_socket *dgmsock, |
58 | | struct nbt_dgram_packet *request, |
59 | | const char *mailslot_name, |
60 | | const char *my_netbios_name, |
61 | | struct nbt_browse_packet *reply) |
62 | 0 | { |
63 | 0 | NTSTATUS status; |
64 | 0 | enum ndr_err_code ndr_err; |
65 | 0 | DATA_BLOB blob; |
66 | 0 | TALLOC_CTX *tmp_ctx = talloc_new(dgmsock); |
67 | 0 | struct nbt_name myname; |
68 | 0 | struct socket_address *dest; |
69 | |
|
70 | 0 | ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, reply, |
71 | 0 | (ndr_push_flags_fn_t)ndr_push_nbt_browse_packet); |
72 | 0 | if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { |
73 | 0 | talloc_free(tmp_ctx); |
74 | 0 | return ndr_map_error2ntstatus(ndr_err); |
75 | 0 | } |
76 | | |
77 | 0 | make_nbt_name_client(&myname, my_netbios_name); |
78 | |
|
79 | 0 | dest = socket_address_from_strings(tmp_ctx, dgmsock->sock->backend_name, |
80 | 0 | request->src_addr, request->src_port); |
81 | 0 | if (!dest) { |
82 | 0 | talloc_free(tmp_ctx); |
83 | 0 | return NT_STATUS_NO_MEMORY; |
84 | 0 | } |
85 | | |
86 | 0 | status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE, |
87 | 0 | mailslot_name, |
88 | 0 | &request->data.msg.source_name, |
89 | 0 | dest, |
90 | 0 | &myname, &blob); |
91 | 0 | talloc_free(tmp_ctx); |
92 | 0 | return status; |
93 | 0 | } |
94 | | |
95 | | NTSTATUS dgram_mailslot_browse_parse(struct dgram_mailslot_handler *dgmslot, |
96 | | TALLOC_CTX *mem_ctx, |
97 | | struct nbt_dgram_packet *dgram, |
98 | | struct nbt_browse_packet *pkt) |
99 | 0 | { |
100 | 0 | DATA_BLOB data = dgram_mailslot_data(dgram); |
101 | 0 | enum ndr_err_code ndr_err; |
102 | |
|
103 | 0 | ndr_err = ndr_pull_struct_blob(&data, mem_ctx, pkt, |
104 | 0 | (ndr_pull_flags_fn_t)ndr_pull_nbt_browse_packet); |
105 | 0 | if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { |
106 | 0 | NTSTATUS status = ndr_map_error2ntstatus(ndr_err); |
107 | 0 | DEBUG(0,("Failed to parse browse packet of length %d: %s\n", |
108 | 0 | (int)data.length, nt_errstr(status))); |
109 | 0 | if (DEBUGLVL(10)) { |
110 | 0 | (void)file_save("browse.dat", data.data, data.length); |
111 | 0 | } |
112 | 0 | return status; |
113 | 0 | } |
114 | 0 | return NT_STATUS_OK; |
115 | 0 | } |