--- /dev/null
+// vim: smarttab tabstop=8 shiftwidth=2 expandtab
+/********************************************************/
+/* */
+/* Main SMTP Daemon */
+/* */
+/********************************************************/
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "subrou.h"
+#include "unipar.h"
+#include "uniprc.h"
+#include "unisig.h"
+#include "modrec.h"
+
+#define RECNAME "emlrec"
+
+//port listening format is "IP:PORT NUMBER:num iteration"
+#define PORTREC "192.168.0.1:25:2"
+/*
+\f
+*/
+/********************************************************/
+/* */
+/* Waiting and handling smtp request */
+/* */
+/********************************************************/
+static void rec_handlesmtp()
+
+{
+int phase;
+_Bool proceed;
+
+phase=0;
+proceed=true;
+while (proceed==true) {
+ switch (phase) {
+ case 0 : //looping forever email receiving processes
+ (void) prc_settitle("emlrec with pid='%06d'",getpid());
+ break;
+ case 1 : //Terminating all remaining process
+ (void) sleep(1);
+ if (hangup==false)
+ phase--; //looping forever
+ break;
+ default : //SAFE Guard
+ proceed=false;
+ break;
+ }
+ phase++;
+ }
+}
+/*
+\f
+*/
+/********************************************************/
+/* */
+/* Main routine */
+/* Start multiple SMTP daemon and make */
+/* sure there always ready to answer to */
+/* SMTP request. */
+/* */
+/********************************************************/
+int main(int argc,char *argv[])
+
+{
+int status;
+ARGTYP *params;
+int phase;
+_Bool proceed;
+
+status=0;
+params=(ARGTYP *)0;
+phase=0;
+proceed=true;
+while (proceed==true) {
+ switch (phase) {
+ case 0 : //checking parameters
+ if ((params=par_getparams(argc,argv,"d:fhr:v"))==(ARGTYP *)0) {
+ phase=999; //no need to go further
+ }
+ break;
+ case 1 : //initialising process
+ (void) prc_preptitle(argc,argv,environ);
+ (void) rou_setappname(RECNAME);
+ (void) rou_modesubrou(true);
+ (void) par_modeunipar(true);
+ (void) prc_modeuniprc(true);
+ (void) sig_modeunisig(true);
+ (void) rec_modemodrec(true);
+ (void) sig_trapsignal(true,sig_alrm);
+ break;
+ case 2 : //doing main tash
+ (void) rec_handlesmtp();
+ break;
+ case 3 : //doing main tash
+ (void) prc_cleantitle();
+ params=par_freeparams(params);
+ (void) sig_trapsignal(false,sig_alrm);
+ (void) rec_modemodrec(false);
+ (void) sig_modeunisig(false);
+ (void) prc_modeuniprc(false);
+ (void) par_modeunipar(false);
+ (void) rou_modesubrou(false);
+ break;
+ default : //end of task
+ proceed=false;
+ break;
+ }
+ phase++;
+ }
+(void) exit(status);
+}
//version definition
-#define VERSION "0.1"
-#define RELEASE "14"
+#define VERSION "0.2"
+#define RELEASE "1"
//Public variables
PUBLIC int debug=0; //debug level
return VERSION"."RELEASE;
}
/*
+^L
+*/
+/********************************************************/
+/* */
+/* Returne set a new application name to be used in*/
+/* logs. */
+/* */
+/********************************************************/
+char *rou_setappname(const char *newname)
+
+{
+char *name;
+
+name=(char *)0;
+if (newname!=(char *)0) {
+ if (appname!=(char *)0)
+ (void) free(appname);
+ appname=strdup(newname);
+ name=appname;
+ }
+return name;
+}
+/*
\f
*/
/********************************************************/
(void) srand(getpid()*355);
if (foreground==true)
(void) srand((int)(M_PI*100000000));
- if (appname!=(char *)0)
- (void) free(appname);
- appname=strdup(APPNAME);
- (void) openlog(APPNAME,LOG_PID,LOG_DAEMON);
- (void) rou_alert(0,"Starting: %s-%s",APPNAME,rou_getversion());
+ if (appname==(char *)0)
+ appname=strdup(APPNAME);
+ (void) openlog(appname,LOG_PID,LOG_DAEMON);
+ (void) rou_alert(0,"Starting: %s-%s",appname,rou_getversion());
break;
case false :
- (void) rou_alert(0,"Exiting: %s-%s",APPNAME,rou_getversion());
+ (void) rou_alert(0,"Exiting: %s-%s",appname,rou_getversion());
(void) closelog();
if (appname!=(char *)0) {
(void) free(appname);