ftp-server-minimal/ftpd.h
2020-01-26 02:20:59 +02:00

118 lines
No EOL
2.8 KiB
C

#ifndef __FTPD_H
#define __FTPD_H
#ifdef __MINGW32__
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0600
#endif
#include <WinSock2.h>
#include <stdint.h>
#include "ftpd_util.h"
//#include "ftpd_vfs.h"
#define MAX_USERS 64
#define MAX_DATACHANNELS 128
#define MAX_USERNAMELEN 32
#define MAX_COMMANDLEN 256
#define MAX_POLLSLOTS MAX_USERS*MAX_DATACHANNELS+32
#define MIN_USRPORT 5000
#define MAX_USRPORT 6480
//Bitmap functions for static allocations
#define BMP_DEF(name,size) uintptr_t name[size/sizeof(uintptr_t)]
#define BMP_GET(bmp,bit) ((bmp[bit/sizeof(uintptr_t)] >> (bit%sizeof(uintptr_t))) & 1)
#define BMP_ON(bmp,bit) (bmp[bit/sizeof(uintptr_t)] |= 1<<(bit%sizeof(uintptr_t)))
#define BMP_OFF(bmp,bit) (bmp[bit/sizeof(uintptr_t)] &= ~(1<<(bit%sizeof(uintptr_t))))
#define MIN(a,b) (((a)<(b))?(a):(b))
//#define DEBUG_PRINT
#ifdef DEBUG_PRINT
#define printf_d printf
#define puts_d puts
#else
#define printf_d
#define puts_d
#endif
typedef enum {
CONN_ACTIVE = 0,
CONN_PASSIVE,
CONN_CONNECTED, //No operations needed
} conntype_t;
typedef struct {
SOCKET s;
struct sockaddr_in addr;
char* sendbuf;
size_t sendbufsize;
size_t sendbufoff;
} conn_t;
typedef enum {
DATACONN_SEND = 0,
DATACONN_SEND_FP,
DATACONN_RECV_FP
} datamodes_t;
typedef void (*dataconn_event_t)(void* user,void* dc);
typedef struct {
conn_t conn;
conn_t lconn; //For server sockets
HANDLE hFile;
int mode;
int type;
dataconn_event_t event;
dataconn_event_t close;
} dataconn_t;
typedef struct {
conn_t control;
dataconn_t data[MAX_DATACHANNELS];
BMP_DEF(dataslots,MAX_DATACHANNELS);
char command[MAX_COMMANDLEN];
size_t command_cur;
int disconnected;
char wdir[MAX_PATH];
int lastdc;
int dlcommand; //Delayed command after send
uint64_t rest; //Offset in file
void* udata; //For special purposes
} ftpd_user_t;
typedef struct {
conn_t local;
ftpd_user_t user[MAX_USERS];
BMP_DEF(userslots,MAX_USERS);
struct in_addr extip;
} ftpd_t;
void ftpd_init();
int ftpd_start_server(struct in_addr extip,int port);
void ftpd_main_loop();
ftpd_user_t* ftpd_open_session(conn_t* conn);
void ftpd_data_close(ftpd_user_t* user,dataconn_t* dc);
void ftpd_close_session(ftpd_user_t* user);
void ftpd_conn_send(conn_t* conn,const char* buf,size_t len);
void ftpd_user_send_reply(ftpd_user_t* user,const char* text);
void ftpd_dc_send_reply(dataconn_t* dc,const char* text);
void ftpd_user_send_replyf(ftpd_user_t* user,const char* fmt,...);
void ftpd_dc_send_replyf(dataconn_t* dc,const char* fmt,...);
void ftpd_user_disconnect(ftpd_user_t* user,const char* reason);
int ftpd_user_make_dataconn(ftpd_user_t* user);
dataconn_t* ftpd_user_get_cur_dataconn(ftpd_user_t* user);
void ftpd_fix_slashes(char* str);
void ftpd_list_event_end(void* u,void* d);
extern ftpd_t server;
#endif