home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / XGRP_000.SZH / START.C < prev    next >
C/C++ Source or Header  |  1991-08-22  |  8KB  |  267 lines

  1. /* XBBS Group/Echo/Netmail processor */
  2.  
  3. #include "xgroup.h"
  4.  
  5. #define DO_EXPORT   1
  6. #define DO_IMPORT   2
  7. #define DO_CLEANUP  4
  8. #define DO_ALL      0
  9. #define DO_MAKE     8
  10. #define DO_NOGROUP  64
  11. #define DO_NOECHO   128
  12.  
  13. #define XVERSION      0
  14. #define XSUBVERSION   0
  15.  
  16. /* global variables created here */
  17.  
  18.   HSEM SemHandle;
  19.   HSEM XMSemHandle;
  20.   char machstate;
  21.  
  22. /* local-only functions */
  23.  
  24. #ifdef TSC
  25.        void deinitialize(void);
  26. #else
  27.        void _cdecl deinitialize(void);   /* atexit */
  28. #endif
  29.        void _fastcall send_help (void);
  30.  
  31. /* external functions called only from this module */
  32.  
  33. extern void _fastcall clean_up(void);
  34. extern void _fastcall make_requests(void);
  35. extern int  _fastcall do_route(void);
  36. extern void _fastcall rescan_echo_mail(ECHOREC *currecho,ADDR *addr,
  37.                                        unsigned int startat);
  38.  
  39. /* external var references */
  40.  
  41. extern GROUP    *group;
  42. extern CONTROLS control;
  43. extern ADDR     *myaddr;
  44. extern ECHOREC  *echos;
  45. extern ASSHOLE  *assholes;
  46. extern char     *groupin;
  47. extern char     *groupout;
  48. extern char     *grouphold;
  49. extern char     *msgdir;
  50. extern char     *outbound;
  51. extern char     *inbound;
  52. extern char     *archive;
  53. extern char     *unarchive;
  54. extern word     packsize;
  55. extern word     netarea;
  56. extern char     buffer[1024];
  57. extern int      logfilehandle;
  58.  
  59.  
  60.  
  61.  
  62. int _cdecl main (int argc,char *argv[]) {
  63.  
  64.     int     dowhat = DO_ALL,ptr = 2;
  65.     time_t  t;
  66.  
  67.  
  68.     t = time(NULL);
  69.  
  70.     fprintf(stderr,"\n\x1b[2J\rXGROUP (XBBS Groupmail/Echomail Processor) %u.%02u\n%s  %s\n\n",
  71.             XVERSION,XSUBVERSION,__DATE__,__TIME__);
  72.  
  73.     DosGetMachineMode(&machstate);
  74.  
  75.     if(argc == 1) fprintf(stderr,"  XGROUP ? > TEMP for a brief helpfile\n\n");
  76.  
  77.     if(argv[1] && *argv[1]=='?') {
  78.         send_help();
  79.         return 0;
  80.     }
  81.  
  82.     if(machstate) {
  83.         if(!DosOpenSem(&SemHandle,"\\SEM\\XGROUP.RUN")) {
  84.             DosCloseSem(SemHandle);
  85.             printf("\nAn instance of XGroup is already running...aborting.\n");
  86.             exit(2);
  87.         }
  88.         else {
  89.             if(DosCreateSem(1,&SemHandle,"\\SEM\\XGROUP.RUN")) {
  90.                 printf("\nCouldn't create XGroup semaphore\n");
  91.             }
  92.             DosSemSet(SemHandle);
  93.         }
  94.  
  95.         if(!DosOpenSem(&XMSemHandle,"\\SEM\\XMSG.RUN")) {
  96.             printf("\nWaiting for XMsg run to complete.\n");
  97.             DosSemRequest(XMSemHandle,-1L);
  98.             DosCloseSem(XMSemHandle);
  99.         }
  100.     }
  101.     atexit(deinitialize);
  102.  
  103.     if (argc < 2) {
  104.         if(config(NULL)) return 1;
  105.     }
  106.     else {
  107.         if(config(argv[1])) return 1;
  108.     }
  109.  
  110.     /* set command line switch defaults */
  111.  
  112.     control.fullok = 0;     /* fully moderated groups not ok */
  113.     control.partialok = 0;  /* partially moderated groups not ok */
  114.     control.noassholes = 0; /* use asshole.### files */
  115.     control.assexport = 0;  /* don't use asshole.### to abort export */
  116.                             /* don't talk to me about policy complaints */
  117.                             /* I write it, not abuse it */
  118.  
  119.     while(argc > ptr && argv[ptr]) {
  120.  
  121. ReSwitch:
  122.  
  123.         switch(toupper(*argv[ptr])) {
  124.             case 0:     break;
  125.  
  126.             case '/':
  127.             case '-':   memmove(argv[ptr],&argv[ptr][1],strlen(argv[ptr]));
  128.                         goto ReSwitch;
  129.  
  130.             case 'E':   dowhat |= DO_EXPORT;
  131.                         break;
  132.  
  133.             case 'I':   dowhat |= DO_IMPORT;
  134.                         break;
  135.  
  136.             case 'C':   dowhat |= DO_CLEANUP;
  137.                         break;
  138.  
  139.             case 'A':   dowhat |= DO_ALL;
  140.                         break;
  141.  
  142.             case 'M':   dowhat |= DO_MAKE;
  143.                         break;
  144.  
  145.             case 'N':   switch(toupper(argv[ptr][1])) {
  146.                             case 'G':   dowhat |= DO_NOGROUP;
  147.                                         break;
  148.  
  149.                             case 'E':   dowhat |= DO_NOECHO;
  150.                                         break;
  151.  
  152.                             default:    printf("\nUnknown N option \"%c\"\n",
  153.                                           toupper(argv[ptr][1]));
  154.                                         send_help();
  155.                                         return 1;
  156.                         }
  157.                         break;
  158.  
  159.             case 'F':   control.fullok = 1;
  160.                         break;
  161.  
  162.             case 'P':   control.partialok = 1;
  163.                         break;
  164.  
  165.             case 'X':   control.assexport = 1;
  166.                         break;
  167.  
  168.             case 'S':   control.noassholes = 1;
  169.                         break;
  170.  
  171.             case '?':   send_help();
  172.                         return 0;
  173.  
  174.             case 'R':   {
  175.                             ADDR         addr;
  176.                             char         *p = argv[ptr + 1];
  177.                             ECHOREC      *currecho;
  178.                             unsigned int startat = 1;
  179.  
  180.                             if(!p || !argv[ptr + 2] || parse_addr(&p,&addr,NULL)) {
  181.                                 printf("\nInvalid Rescan command syntax.\n");
  182.                                 return 2;
  183.                             }
  184.                             p = argv[ptr + 2];
  185.                             if(*p == '\"') p++;
  186.                             if(p[strlen(p) - 1] == '\"') p[strlen(p) - 1] = 0;
  187.                             currecho = echos;
  188.                             while(currecho) {
  189.                                 if(!stricmp(currecho->tag,p)) break;
  190.                                 currecho = currecho->next;
  191.                             }
  192.                             if(currecho) {
  193.                                 if(argv[ptr + 3]) startat = atoi(argv[ptr + 3]);
  194.                                 rescan_echo_mail(currecho,&addr,startat);
  195.                             }
  196.                             goto RunTime;
  197.                         }
  198.  
  199.             default:    printf("\nUnknown command \"%c\"\n",
  200.                           toupper(*argv[ptr]));
  201.                         send_help();
  202.                         return 1;
  203.         }
  204.         ptr++;
  205.     }
  206.  
  207.     if(dowhat == DO_ALL) {
  208.         echo_import_mail();
  209.         if(group) {
  210.             group_import_mail();
  211.             group_export_mail();
  212.         }
  213.         net_export_mail();
  214.         if(echos) {
  215.             echo_export_mail();
  216.         }
  217.         do_route();
  218.         clean_up();
  219.     }
  220.     else {
  221.         if(dowhat & DO_IMPORT) {
  222.             if(!(dowhat & DO_NOECHO)) if(echos) echo_import_mail();
  223.             if(!(dowhat & DO_NOGROUP)) if(group) group_import_mail();
  224.         }
  225.         if(dowhat & DO_EXPORT) {
  226.             if(!(dowhat & DO_NOECHO)) if(echos) echo_export_mail();
  227.             if(!(dowhat & DO_NOGROUP)) if(group) group_export_mail();
  228.             net_export_mail();
  229.             do_route();
  230.         }
  231.         if(dowhat & DO_CLEANUP) {
  232.             clean_up();
  233.         }
  234.         if(dowhat & DO_MAKE) {
  235.             make_requests();
  236.         }
  237.     }
  238.  
  239. RunTime:
  240.  
  241.     printf("\nRuntime: %lu mins %lu secs\n",(time(NULL) - t) / 60L,
  242.            (time(NULL) - t) - (((time(NULL) - t) / 60L) * 60L));
  243.  
  244.     return 0;
  245. }
  246.  
  247.  
  248.  
  249. #ifdef TSC
  250.   void deinitialize (void) {
  251. #else
  252.   void _cdecl deinitialize (void) {
  253. #endif
  254.  
  255.  
  256.     if(logfilehandle != -1) {
  257.         close(logfilehandle);
  258.     }
  259.  
  260.     if(machstate) {
  261.         DosSemClear(SemHandle);
  262.  
  263.         printf("Closing XGroup semaphore\n");
  264.         DosCloseSem(SemHandle);
  265.     }
  266. }
  267.