libStatGen Software 1
Loading...
Searching...
No Matches
knetfile.h
1#ifndef KNETFILE_H
2#define KNETFILE_H
3
4#include <stdint.h>
5#include <fcntl.h>
6
7#ifndef _WIN32
8#define netread(fd, ptr, len) read(fd, ptr, len)
9#define netwrite(fd, ptr, len) write(fd, ptr, len)
10#define netclose(fd) close(fd)
11#else
12#include <winsock2.h>
13#define netread(fd, ptr, len) recv(fd, ptr, len, 0)
14#define netwrite(fd, ptr, len) send(fd, ptr, len, 0)
15#define netclose(fd) closesocket(fd)
16#endif
17
18// FIXME: currently I/O is unbuffered
19
20#define KNF_TYPE_LOCAL 1
21#define KNF_TYPE_FTP 2
22#define KNF_TYPE_HTTP 3
23
24typedef struct knetFile_s {
25 int type, fd;
26 int64_t offset;
27 char *host, *port;
28
29 // the following are for FTP only
30 int ctrl_fd, pasv_ip[4], pasv_port, max_response, no_reconnect, is_ready;
31 char *response, *retr, *size_cmd;
32 int64_t seek_offset; // for lazy seek
33 int64_t file_size;
34
35 // the following are for HTTP only
36 char *path, *http_host;
37} knetFile;
38
39#define knet_tell(fp) ((fp)->offset)
40#define knet_fileno(fp) ((fp)->fd)
41
42#ifdef __cplusplus
43extern "C" {
44#endif
45
46#ifdef _WIN32
47 int knet_win32_init();
48 void knet_win32_destroy();
49#endif
50
51 // Pass in non-zero to make knetfile silent (no messages), pass in
52 // 0 to keep any messages (default is 0).
53 void knet_silent(int silent);
54
55 knetFile *knet_open(const char *fn, const char *mode);
56
57 /*
58 This only works with local files.
59 */
60 knetFile *knet_dopen(int fd, const char *mode);
61
62 /*
63 If ->is_ready==0, this routine updates ->fd; otherwise, it simply
64 reads from ->fd.
65 */
66 ssize_t knet_read(knetFile *fp, void *buf, size_t len);
67
68 /*
69 This routine only sets ->offset and ->is_ready=0. It does not
70 communicate with the FTP server.
71 */
72 off_t knet_seek(knetFile *fp, off_t off, int whence);
73 int knet_close(knetFile *fp);
74
75#ifdef __cplusplus
76}
77#endif
78
79#endif