3 Copyright (C) Andrew Tridgell 1999
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #define MAX_FILES 1000
24 static char buf[70000];
26 char *server = "localhost";
30 /* emulate a single SMB packet exchange */
31 static void do_packets(int send_size, int recv_size)
33 uint32 *ubuf = (uint32 *)buf;
35 ubuf[0] = htonl(send_size-4);
36 ubuf[1] = htonl(recv_size-4);
38 if (write_sock(sock, buf, send_size) != send_size) {
39 printf("error writing %d bytes\n", (int)send_size);
43 if (read_sock(sock, buf, 4) != 4) {
44 printf("error reading header\n");
48 if (ntohl(ubuf[0]) != (unsigned)(recv_size-4)) {
49 printf("lost sync (%d %d)\n",
50 (int)recv_size-4, (int)ntohl(ubuf[0]));
54 if (recv(sock, buf, recv_size-4, MSG_WAITALL|MSG_TRUNC) !=
56 printf("error reading %d bytes\n", (int)recv_size-4);
60 if (ntohl(ubuf[0]) != (unsigned)(recv_size-4)) {
61 printf("lost sync (%d %d)\n",
62 (int)recv_size-4, (int)ntohl(ubuf[0]));
67 void nb_setup(struct child_struct *child)
69 extern char *tcp_options;
71 sock = open_socket_out(server, TCP_PORT);
73 printf("client %d failed to start\n", child->id);
76 set_socket_options(sock, tcp_options);
81 void nb_unlink(struct child_struct *child, char *fname, int attr, const char *status)
86 do_packets(39+2+strlen(fname)*2+2, 39);
89 void nb_mkdir(struct child_struct *child, char *dname, const char *status)
93 do_packets(39+2+strlen(dname)*2+2, 39);
96 void nb_rmdir(struct child_struct *child, char *fname, const char *status)
100 do_packets(39+2+strlen(fname)*2+2, 39);
103 void nb_createx(struct child_struct *child, const char *fname,
104 uint32_t create_options, uint32_t create_disposition, int fnum,
108 (void)create_options;
109 (void)create_disposition;
112 do_packets(70+2+strlen(fname)*2+2, 39+12*4);
115 void nb_writex(struct child_struct *child, int handle, int offset,
116 int size, int ret_size, const char *status)
123 do_packets(39+20+size, 39+16);
124 child->bytes += size;
127 void nb_readx(struct child_struct *child, int handle, int offset,
128 int size, int ret_size, const char *status)
135 do_packets(39+20, 39+20+ret_size);
136 child->bytes += ret_size;
139 void nb_close(struct child_struct *child, int handle, const char *status)
144 do_packets(39+8, 39);
147 void nb_rename(struct child_struct *child, char *old, char *new, const char *status)
151 do_packets(39+8+2*strlen(old)+2*strlen(new), 39);
154 void nb_flush(struct child_struct *child, int handle, const char *status)
159 do_packets(39+2, 39);
162 void nb_qpathinfo(struct child_struct *child, const char *fname, int level,
168 do_packets(39+16+2*strlen(fname), 39+32);
171 void nb_qfileinfo(struct child_struct *child, int handle, int level, const char *status)
177 do_packets(39+20, 39+32);
180 void nb_qfsinfo(struct child_struct *child, int level, const char *status)
185 do_packets(39+20, 39+32);
188 void nb_findfirst(struct child_struct *child, char *fname, int level, int maxcnt,
189 int count, const char *status)
195 do_packets(39+20+strlen(fname)*2, 39+90*count);
198 void nb_cleanup(struct child_struct *child)
203 void nb_deltree(struct child_struct *child, char *dname)
209 void nb_sfileinfo(struct child_struct *child, int handle, int level, const char *status)
215 do_packets(39+32, 39+8);
218 void nb_lockx(struct child_struct *child, int handle, uint32_t offset, int size,
226 do_packets(39+12, 39);
229 void nb_unlockx(struct child_struct *child,
230 int handle, uint32_t offset, int size, const char *status)
237 do_packets(39+12, 39);
240 void nb_sleep(struct child_struct *child, int usec, const char *status)