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
);