#ifndef _NNTP_H_ #define _NNTP_H_ /* * Copyright (c) 1996, Ruslan R. Laishev (@RRL) */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* * */ extern char *ID$IDcpy; extern char *ID$IDsrv; extern char *ID$IDver; /* * */ #define NNTP_EOL "\r\n" #define NNTP_EOT ".\r\n" #define NNTP_OK ".\r\n" #define NNTPMAXWORKER 128 typedef struct { char *cmd; int (*nntp_fun) (); char *hlp; } NNTP_cmd_t; /* * Structure of nntp$msg.db */ #define Msg_MaxRec 32000 #define MsgGrp$_pos 0 #define MsgGrp$_len 64+16 #define MsgGrp$_ref 0 #define MsgId$_pos MsgGrp$_len #define MsgId$_len 64 #define MsgId$_ref 1 typedef struct { char Grp [MsgGrp$_len]; char MsgId [MsgId$_len]; time_t Date; } MsgKey; /* * Structure of nntp$grp.db */ typedef struct { #define GrpName$_len 64 /* News group name */ char GrpName [GrpName$_len]; unsigned long First; /* # of first available message */ unsigned long Last; /* # of last available message */ char PostFlag; /* 'form of posting' flag */ char SuckFlag; /* 'group cached' flag */ time_t DateCr; /* date of news group creation */ time_t DateUp; /* date of last update */ } GrpKey; #define Grp_MaxRec sizeof(GrpKey) #define GrpName$_pos 0 #define GrpName$_ref 0 /* * Structure of nntp$suck.db */ typedef struct { #define Suck$_len (16+1+GrpName$_len) char Host_Grp [Suck$_len]; /* IP address in ASCII form + "," */ /* + news group name */ unsigned long Last; /* Index of last geted message */ } SuckRec; #define Suck_MaxRec sizeof(SuckRec) #define Suck$_pos 0 #define Suck$_ref 0 /* * Structure of nntp$feed.db */ typedef struct { #define Feed$_len (Suck$_len) char Host_Grp [Feed$_len]; /* IP address in ASCII form + "," */ /* + news group name */ unsigned long Last; /* Index of last feeded message */ } FeedRec; #define Feed_MaxRec sizeof(FeedRec) #define Feed$_pos 0 #define Feed$_ref 0 /* * */ /* "Type" code's for Wctx.type */ enum {T_Null,T_Suck,T_Feed,T_Clnt,T_Expr}; enum {A_Read = 0x1,A_Post = 0x2,A_Ihav = 0x4}; typedef struct { int type; /* Type of worker: suck,feed,client */ pthread_mutex_t mutex; /* Mutual exclusion lock flag */ pthread_t tid; /* Thread identificator */ int indx; int chan; /* TCP I/O socket */ #define BUFPSZ 512 char bufp [ BUFPSZ ]; struct RAB Grprab; struct RAB Msgrab; struct RAB Suckrab; struct RAB Feedrab; char MsgBuff [Msg_MaxRec]; #define MSGBUFFSZ Msg_MaxRec #define MSGMAXSZ (MSGBUFFSZ - sizeof(MsgKey)) /* Current News Group */ char Grp [GrpName$_len]; int MsgNum; /* Current Message number */ int MsgNumf; } WorkerContext; #define FIELDSEP '|' typedef struct { char *LocalHost; char *LocalPath; char *LocalTZ; int LocalPort; char *LocalMgr; char *LocalSMTP; int MsgDBsize; int MsgPurgeDay; int MsgOld; int MsgPurgeNum; int ClientTimeOut; int SuckTimeOut; int FeedTimeOut; char *GrpME; int GrpDay; char *Suck; char *Feed; char *Client; int LogLevel; int LogType; int SuckInterval; int FeedInterval; time_t Expire; char *Moderator; char *GrpMod; } nntp_conf_t; #ifndef nntp_conf nntp_conf_t nntp_conf; #else external nntp_conf_t nntp_conf; #endif int nntp_cmd_get (int, char *, int); void *nntp_cmd_parse (WorkerContext *); int nntp_help (WorkerContext *); int nntp_quit (WorkerContext *); int nntp_arti (WorkerContext *); int nntp_head (WorkerContext *); int nntp_body (WorkerContext *); int nntp_post (WorkerContext *); int nntp_list (WorkerContext *); int nntp_ihav (WorkerContext *); int nntp_grou (WorkerContext *); int nntp_newg (WorkerContext *); int nntp_slav (WorkerContext *); int nntp_stat (WorkerContext *); int nntp_xove (WorkerContext *); int nntp_last (WorkerContext *); int nntp_next (WorkerContext *); int nntp_newn (WorkerContext *); int msg_to_db (WorkerContext *,int); int msg_hdr_valid (WorkerContext *,int); int nntp_conf_get (void); int nntp_conf_out (void); int nntp_suck (WorkerContext *,char *,char *); int nntp_feed (WorkerContext *,char *,char *,int,char *); time_t cvt_rfc_to_vms (char *); time_t cvt_nntp_to_vms(char *); char *cvt_vms_to_rfc (time_t,char *,char *); char *strlwr (char *); int strnlen (char *,int); int strincmp (char *,char *,int); int stricmp (char *,char *); void strstrip (char *,char *,char *); char *strtok_val (char *,char *,char *,char *,int); int strelem (char *,char *,int, char *,int); int strmatch (char *,char *); int match_wild (char *,char *); int domatch (char *,char *); int match_in_list (char *,char *); int send_mail (char *,int,char *,int,char *,int,char *,int); #define min(x,y) ((x > y)?y:x) #define max(x,y) ((x < y)?y:x) #define LOGI 0 #define LOGF 1 #define LOGS 2 #define LOGE 3 #define LOGW 4 #define LOGD 5 extern char *lvl_msg[]; char *nntp_log_time (char *, int); int NNTP_LOG_ERR (char *, long); void NNTP_LOG (int ,const char *, ...); void NNTP_LOGT (WorkerContext *,int ,const char *, ...); int nntp_line_get (int, char *, int); int nntp_cmd_get (int, char *, int); int nntp_txt_get (int, char *, int); void nntp_sockshut (int); #include #include #include #include #include #include #include #include /* * */ #define BigNum ((unsigned long) 0x7fffffff) int MsgDBopen (void); int MsgDBopen_stream (struct RAB *); int MsgDBfind_byId (struct RAB *,char *,int); int MsgDBget_byId (struct RAB *,char *,char *,int); int MsgDBget_byNum (struct RAB *,char *,int,char *,int); int MsgDBget_byRange (struct RAB *,char *,int,int,char *,int,char *,int *); int MsgDBdel (struct RAB *); int GrpDBopen (void); int GrpDBopen_stream (struct RAB *); int GrpDBget (struct RAB *,char *,char *,int); int GrpDBput (struct RAB *,char *,char *); int GrpDBget_seq (struct RAB *,char *,int); int GrpDBfree (struct RAB *); int DBclose_stream (struct RAB *); int DBclose (void); int DBins (struct RAB *, struct RAB *,char *,time_t,char *,int); int SuckDBopen (void); int SuckDBopen_stream (struct RAB *); int SuckDBget (struct RAB *,char *); int SuckDBput (struct RAB *,char *); int FeedDBopen (void); int FeedDBopen_stream (struct RAB *); int FeedDBget (struct RAB *,char *); int FeedDBput (struct RAB *,char *); int nntp_suck (WorkerContext *,char *,char *); int NNTP_InitBosses(void); void NNTP_ClientBoss(void); void NNTP_SuckBoss (void); void NNTP_FeedBoss (void); void *NNTP_WorkerInit(int,int); void NNTP_WorkerKill(WorkerContext *); void NNTP_WorkerClient(WorkerContext *); #endif /* _NNTP_H_ */