reactos/base/services/tftpd/tftpd.h

188 lines
4.3 KiB
C

/**************************************************************************
* Copyright (C) 2005 by Achal Dhir *
* achaldhir@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
// TFTPServer.cpp
#define MYBYTE unsigned char
#define MYWORD unsigned short
#define MYDWORD unsigned int
#ifdef _MSC_VER
#define strcasecmp _stricmp
#define _CRT_SECURE_NO_WARNINGS
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "iphlpapi.lib")
#endif
//Constants
#define my_inet_addr inet_addr
#define MAX_SERVERS 8
//Structs
struct home
{
char alias[64];
char target[256];
};
struct tftpConnType
{
SOCKET sock;
sockaddr_in addr;
MYDWORD server;
MYWORD port;
bool loaded;
bool ready;
};
struct acknowledgement
{
MYWORD opcode;
MYWORD block;
};
struct message
{
MYWORD opcode;
char buffer[514];
};
struct tftperror
{
MYWORD opcode;
MYWORD errorcode;
char errormessage[512];
};
struct packet
{
MYWORD opcode;
MYWORD block;
char buffer;
};
struct data12
{
MYDWORD rangeStart;
MYDWORD rangeEnd;
};
struct request
{
timeval tv;
fd_set readfds;
time_t expiry;
SOCKET sock;
SOCKET knock;
MYBYTE sockInd;
MYBYTE attempt;
char path[256];
FILE *file;
char *filename;
char *mode;
char *alias;
MYDWORD tsize;
MYDWORD fblock;
int bytesReady;
int bytesRecd;
int bytesRead[2];
packet* pkt[2];
sockaddr_in client;
socklen_t clientsize;
union
{
tftperror serverError;
message mesout;
acknowledgement acout;
};
union
{
tftperror clientError;
message mesin;
acknowledgement acin;
};
MYWORD blksize;
MYWORD timeout;
MYWORD block;
MYWORD tblock;
};
struct data1
{
tftpConnType tftpConn[MAX_SERVERS];
MYDWORD allServers[MAX_SERVERS];
MYDWORD staticServers[MAX_SERVERS];
MYDWORD listenServers[MAX_SERVERS];
MYWORD listenPorts[MAX_SERVERS];
SOCKET maxFD;
bool ready;
bool busy;
};
struct data2
{
WSADATA wsaData;
#ifdef __REACTOS__
home homes[MAX_SERVERS];
#else
home homes[8];
#endif
FILE *logfile;
data12 hostRanges[32];
char fileRead;
char fileWrite;
char fileOverwrite;
int minport;
int maxport;
MYDWORD failureCount;
MYBYTE logLevel;
bool ifspecified;
};
struct data15
{
union
{
//MYDWORD ip;
unsigned ip:32;
MYBYTE octate[4];
};
};
//Functions
bool detectChange();
void closeConn();
void getInterfaces(data1*);
void runProg();
void processRequest(LPVOID lpParam);
char* myGetToken(char*, MYBYTE);
char* myTrim(char*, char*);
void init(void*);
bool cleanReq(request*);
bool addServer(MYDWORD*, MYDWORD);
FILE* openSection(const char*, MYBYTE, char*);
char* readSection(char*, FILE*);
bool getSection(const char*, char*, MYBYTE, char*);
bool isIP(char*s);
char* myLower(char*);
char* myUpper(char*);
char* IP2String(char*, MYDWORD);
MYDWORD* findServer(MYDWORD*, MYDWORD);
void printWindowsError();
void logMess(request*, MYBYTE);
void logMess(char*, MYBYTE);