123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #ifndef KNETFILE_H
- #define KNETFILE_H
- #include <stdint.h>
- #include <fcntl.h>
- #ifndef _WIN32
- #define netread(fd, ptr, len) read(fd, ptr, len)
- #define netwrite(fd, ptr, len) write(fd, ptr, len)
- #define netclose(fd) close(fd)
- #else
- #include <winsock2.h>
- #define netread(fd, ptr, len) recv(fd, ptr, len, 0)
- #define netwrite(fd, ptr, len) send(fd, ptr, len, 0)
- #define netclose(fd) closesocket(fd)
- #endif
- // FIXME: currently I/O is unbuffered
- #define KNF_TYPE_LOCAL 1
- #define KNF_TYPE_FTP 2
- #define KNF_TYPE_HTTP 3
- typedef struct knetFile_s {
- int type, fd;
- int64_t offset;
- char *host, *port;
- // the following are for FTP only
- int ctrl_fd, pasv_ip[4], pasv_port, max_response, no_reconnect, is_ready;
- char *response, *retr, *size_cmd;
- int64_t seek_offset; // for lazy seek
- int64_t file_size;
- // the following are for HTTP only
- char *path, *http_host;
- } knetFile;
- #define knet_tell(fp) ((fp)->offset)
- #define knet_fileno(fp) ((fp)->fd)
- #ifdef __cplusplus
- extern "C" {
- #endif
- #ifdef _WIN32
- int knet_win32_init();
- void knet_win32_destroy();
- #endif
- knetFile *knet_open(const char *fn, const char *mode);
- /*
- This only works with local files.
- */
- knetFile *knet_dopen(int fd, const char *mode);
- /*
- If ->is_ready==0, this routine updates ->fd; otherwise, it simply
- reads from ->fd.
- */
- off_t knet_read(knetFile *fp, void *buf, off_t len);
- /*
- This routine only sets ->offset and ->is_ready=0. It does not
- communicate with the FTP server.
- */
- off_t knet_seek(knetFile *fp, int64_t off, int whence);
- int knet_close(knetFile *fp);
- #ifdef __cplusplus
- }
- #endif
- #endif
|