7 int READ(SOCKET sh, UCHAR *whereto, int howmuch)
12 printf("read: %d bytes requested\n", howmuch);
17 int nread = recv(sh, (char *)&whereto[pnt], howmuch, 0);
20 if (nread == SOCKET_ERROR)
22 fprintf(stderr, "Connection dropped. Error: %d\n", WSAGetLastError());
33 int WRITE(SOCKET sh, UCHAR *wherefrom, int howmuch)
39 int nwritten = send(sh, (char *)&wherefrom[pnt], howmuch, 0);
42 if (nwritten == SOCKET_ERROR)
44 fprintf(stderr, "Connection dropped. Error: %d\n", WSAGetLastError());
55 BOOL getu32(SOCKET sh, ULONG *val)
59 if (READ(sh, buffer, 4) != 4)
62 *val = (buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + (buffer[3]);
67 BOOL putu32(SOCKET sh, ULONG value)
71 buffer[0] = (value >> 24) & 255;
72 buffer[1] = (value >> 16) & 255;
73 buffer[2] = (value >> 8) & 255;
74 buffer[3] = (value ) & 255;
76 if (WRITE(sh, buffer, 4) != 4)
82 DWORD WINAPI draad(LPVOID data)
84 SOCKET sockh = (SOCKET)data;
88 // open file 'filename'
89 fh = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
90 if (fh == INVALID_HANDLE_VALUE)
92 fprintf(stderr, "Error opening file %s: %d\n", filename, GetLastError());
95 for(;fh != INVALID_HANDLE_VALUE;)
98 ULONG magic, from, len, type, dummy;
100 /* negotiating time? */
103 printf("Negotiating...\n");
104 if (WRITE(sockh, (unsigned char *)"NBDMAGIC", 8) != 8)
106 fprintf(stderr, "Failed to send magic string\n");
110 // some other magic value
111 unsigned char magic[8];
120 if (WRITE(sockh, magic, 8) != 8)
122 fprintf(stderr, "Failed to send 2nd magic string\n");
127 unsigned char exportsize[8];
128 DWORD fsize = GetFileSize(fh, NULL);
129 if (fsize == 0xFFFFFFFF)
131 fprintf(stderr, "Failed to get filesize. Error: %d\n", GetLastError());
134 exportsize[7] = (fsize ) & 255;
135 exportsize[6] = (fsize >> 8) & 255;
136 exportsize[5] = (fsize >> 16) & 255;
137 exportsize[4] = (fsize >> 24) & 255;
138 exportsize[3] = (fsize >> 32) & 255;
139 exportsize[2] = (fsize >> 40) & 255;
140 exportsize[1] = (fsize >> 48) & 255;
141 exportsize[0] = (fsize >> 56) & 255;
143 printf("File is %ld bytes\n", fsize);
145 if (WRITE(sockh, exportsize, 8) != 8)
147 fprintf(stderr, "Failed to send filesize\n");
151 // send a couple of zeros */
152 unsigned char buffer[128];
153 memset(buffer, 0x00, 128);
154 if (WRITE(sockh, buffer, 128) != 128)
156 fprintf(stderr, "Failed to send a couple of 0x00s\n");
160 printf("Started!\n");
164 if (getu32(sockh, &magic) == FALSE || // 0x12560953
165 getu32(sockh, &type) == FALSE || // 0=read,1=write
166 READ(sockh, handle, 8) != 8 || // handle
167 getu32(sockh, &dummy) == FALSE || // ... high word of offset
168 getu32(sockh, &from) == FALSE || // offset
169 getu32(sockh, &len) == FALSE) // length
171 fprintf(stderr, "Failed to read from socket\n");
177 printf("Magic: %lx\n", magic);
178 printf("Offset: %ld\n", from);
179 printf("Len: %ld\n", len);
180 printf("Handle: %s\n", handle);
181 printf("Req.type: %ld (%s)\n\n", type, type?"write":"read");
185 if (magic != 0x25609513)
187 fprintf(stderr, "Unexpected protocol version! (got: %lx, expected: 0x25609513)\n", magic);
192 if (SetFilePointer(fh, from, NULL, FILE_BEGIN) == 0xFFFFFFFF)
194 fprintf(stderr, "Error seeking in file %s to position %d: %d\n", filename, from, GetLastError());
198 if (type == 1) // write
205 int nb = recv(sockh, (char *)buffer, min(len, 32768), 0);
210 if (WriteFile(fh, buffer, nb, &dummy, NULL) == 0)
212 fprintf(stderr, "Failed to write to %s: %d\n", filename, GetLastError());
217 fprintf(stderr, "Failed to write to %s: %d (written: %d, requested to write: %d)\n", filename, GetLastError(), dummy, nb);
223 if (len) // connection was closed
225 fprintf(stderr, "Connection was dropped while receiving data\n");
230 if (putu32(sockh, 0x67446698) == FALSE ||
231 putu32(sockh, 0) == FALSE ||
232 WRITE(sockh, handle, 8) != 8)
234 fprintf(stderr, "Failed to send through socket\n");
241 if (putu32(sockh, 0x67446698) == FALSE ||
242 putu32(sockh, 0) == FALSE ||
243 WRITE(sockh, handle, 8) != 8)
245 fprintf(stderr, "Failed to send through socket\n");
253 int nb = min(len, 32768);
256 // read nb to buffer;
257 if (ReadFile(fh, buffer, nb, &dummy, NULL) == 0)
259 fprintf(stderr, "Failed to read from %s: %d\n", filename, GetLastError());
264 fprintf(stderr, "Failed to read from %s: %d\n", filename, GetLastError());
268 // send through socket
269 if (WRITE(sockh, buffer, nb) != nb) // connection was closed
271 fprintf(stderr, "Connection dropped while sending block\n");
277 if (len) // connection was closed
282 printf("Unexpected commandtype: %d\n", type);
288 if (CloseHandle(fh) == 0)
290 fprintf(stderr, "Failed to close handle: %d\n", GetLastError());
300 int main(int argc, char *argv[])
305 printf("nbdsrvr v0.1, (C) 2003 by folkert@vanheusden.com\n");
309 fprintf(stderr, "Usage: %s file portnr\n", argv[0]);
313 portnr = atoi(argv[2]);
315 // initialize WinSock library
316 (void)WSAStartup(0x101, &WSAData);
318 // create listener socket
319 newconnh= socket(AF_INET, SOCK_STREAM, 0);
320 if (newconnh == INVALID_SOCKET)
324 struct sockaddr_in ServerAddr;
326 ServerAddrLen = sizeof(ServerAddr);
327 memset((char *)&ServerAddr, '\0', ServerAddrLen);
328 ServerAddr.sin_family = AF_INET;
329 ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
330 ServerAddr.sin_port = htons(portnr);
331 if (bind(newconnh, (struct sockaddr *)&ServerAddr, ServerAddrLen) == -1)
335 if (listen(newconnh, 5) == -1)
341 struct sockaddr_in clientaddr;
344 clientaddrlen = sizeof(clientaddr);
346 /* accept a connection */
347 clienth = accept(newconnh, (struct sockaddr *)&clientaddr, &clientaddrlen);
349 if (clienth != INVALID_SOCKET)
351 printf("Connection made with %s\n", inet_ntoa(clientaddr.sin_addr));
354 HANDLE th = CreateThread(NULL, 0, draad, (void *)clienth, 0, &tid);