/* * FTP/HTTP daemon * process.h Copyright (C) 1995, 96 Alex Belits * * This source/code is public free; you can distribute it and/or modify * it under terms of the GNU General Public License (published by the * Free Software Foundation) either version two of this License, or any * later version. * */ #ifndef INCLUDED_PROCESS_H #define INCLUDED_PROCESS_H 1 #include "sockobj.h" class ControlFTPServerApp; /* see fhttpd.h */ class ProcessServer:public ServerSocket{ public: ServerConnection *emptyclient; char *tmppathname; struct passwd *tmpuser; int tmpargc; char **tmpargv; ProcessServer(char *xname,int xport,int xmaxclients,__s32 xlocaladdr=0); ~ProcessServer(void); virtual void emptyfn(ServerConnection *client); virtual void connectfn(ServerConnection *client); virtual void disconnectfn(ServerConnection *client); virtual void splitfn(ServerConnection *client,ServerProcess *process); /* virtual void splitparentfn(ServerConnection *client,ServerProcess *process); virtual void unsplitfn(ServerConnection *client,ServerProcess *process); */ virtual void afterunsplitfn(ServerConnection *client,ServerProcess *process); virtual int prioritydatafn(ServerConnection *client); virtual int datafn(ServerConnection *client); virtual int pipedatafn(ServerConnection *client,ServerProcess *process); virtual int pipeprioritydatafn(ServerConnection *client,ServerProcess *process); virtual void response(ServerConnection *client,char *fmt,...); virtual void setexitafterresponse(ServerConnection *client,int closeonexit); }; class ApplicationInstance; class Application:public Item{ public: ProcessServer *server; char *appname; char *url; char *username; int max_requests_per_instance; int max_instances; int max_instances_for_uid; int usesocket; int authentication; int processflag; List instances; List requests; char *mappedname; char *pathname; int argc; char **argv; __s32 address; Application(ProcessServer *xserver,char *xappname,char *xurl,char *xusername,int xmax_requests_per_instance=0, int xmax_instances=0,char *xmappedname=NULL,char *xpathname=NULL,int xargc=0,char **xargv=NULL,__s32 xaddress=-1,int xusesocket=0,int xmax_instances_for_uid=0,int xauthentication=0); virtual ~Application(void); ApplicationInstance *MakeInstance(int xmap_uid=-1); ApplicationInstance *MakeInstance(ServerConnection *conn); void ProcessQueue(void); }; class ApplicationMessage; class ApplicationRequest; class ApplicationInstance:public Item{ public: Application *application; ServerProcess *process; ServerConnection *connection; ApplicationMessage *currmessage; ApplicationRequest *currresponse; __s32 capabilities; int exitreq; int queuesize; time_t lastrequesttime; unsigned long lastrequestcounter; List requests; List configlines; __s32 responsesize; char *sizeptr; int sizedefined; __s32 id; char *idptr; __s32 opnumber; char *opnumberptr; int iddefined; int opnumberdefined; int map_uid; __s32 preassigned_id; ApplicationInstance(Application *xapplication,ServerProcess *xprocess,ServerConnection *xconnection,int xmap_uid=-1); virtual ~ApplicationInstance(void); int CheckInstanceRules(ApplicationRequest *currequest); int SendLogMessage(ControlFTPServerApp *clientapp,ApplicationRequest *request, ApplicationInstance *ainst,struct timeval *tv, int level,char *msgtype,char *message,__s32 xclientid=0,__s32 xreqid=0); int SendLogMessage(ControlFTPServerApp *clientapp,ApplicationRequest *request, ApplicationInstance *ainst,struct timeval *tv, int level,List *messages,__s32 xclientid=0,__s32 xreqid=0); void LogReportStatus(void); int RespondToApp(char *data,int size); int Send(char *data,int size); void ConfirmExit(void); }; class ProcessServerApp:public ServerConnectionApp{ public: char *buffer; int buffsize; int boffset; int bufflen; char lastchar; char username[129]; int userid; int gid; int auth; ApplicationInstance *appinst; ProcessServerApp(ServerConnection *c); ~ProcessServerApp(void); }; class ControlFTPServerApp; class CtrlAppPtrApplicationRequest; class ApplicationRequest:public Item{ public: Application *application; ApplicationInstance *instance; CtrlAppPtrApplicationRequest *ctrlappptr; ControlFTPServerApp *ctrlapp; char *requestline; int map_uid; int nlines; List lines; char *buffer; int buffsize; int offset; long *marksbuffer; int marksbuffersize; int marksinbuffer; int markssent; char *responsebuffer; int responsebuffersize; int responsesize; int responseoffset; int responsereadoffset; char *databuffer; int databuffsize; int dataoffset; __s32 id; __s32 preassigned_id; int disconnectflag; int ack_finish; int specialmessage; int appresponsefinished; int reported_deleted; int totalsize; ApplicationRequest(Application *xpaalication,ApplicationInstance *xinstance,ControlFTPServerApp *xctrlapp, char *xdataleft,int xdataleftsize,int xmap_uid); virtual ~ApplicationRequest(void); int ReadData(int handle, int size); void AddLine(char *key,char *line); void AddLine(char *line); int Convert(void); int Ready(void); int Send(void); int NotifyDisconnect(void); int RespondToUser(int cankeepalive); void DiscardResponseData(void); void FreeResources(void); int GetSize(void); void FinishResponse(int cankeepalive); int InitResponse(long xresponsesize); int CopyResponseData(char *data, int size); void SendResponseBuffer(void); }; class CtrlAppPtrApplicationRequest:public Item{ public: ApplicationRequest *request; CtrlAppPtrApplicationRequest(ApplicationRequest *xrequest); virtual ~CtrlAppPtrApplicationRequest(); }; class ApplicationMessage:public Item{ public: Application *application; ApplicationInstance *instance; char *responsebuffer; int responsesize; int responseoffset; int responsereadoffset; int appresponsefinished; ApplicationMessage(Application *xpaalication,ApplicationInstance *xinstance); virtual ~ApplicationMessage(void); int CopyMessageData(char *data, int size); int Process(long opnumber); int InitMessage(long xresponsesize); }; extern class ProcessServer *processserver; extern unsigned long requestcounter; extern __s32 sequencenumber; extern struct disconnectmessage{ __s32 buffsize; __s32 sequencenumber; __s32 reqtype; __s32 rl; __s32 nlines; __s32 databufsize; }disconnectbuffer; extern struct finishedmessage{ __s32 buffsize; __s32 sequencenumber; __s32 reqtype; __s32 rl; __s32 nlines; __s32 databufsize; __s32 databuffer; }outputfinishedbuffer; #endif