home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 2 / amigaformatcd02.iso / comms / netsoftware / nethandler.lha / NetHandler / server / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-16  |  9.7 KB  |  250 lines

  1. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  2. /* |_o_o|\\ Copyright (c) 1987, 1988 The Software Distillery.  All Rights  */
  3. /* |. o.| || Reserved.  This program may not be distributed without the    */
  4. /* | .  | || permission of the authors:                            BBS:    */
  5. /* | o  | ||   John Toebes     Doug Walker    Dave Baker                   */
  6. /* |  . |//                                                                */
  7. /* ======                                                                  */
  8. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  9.  
  10. #include "server.h"
  11.  
  12. /* Eventually, make this table work for me - flag significant args,     */
  13. /* flag args that point into the data table.  This will take care of    */
  14. /* everything but Examine, ExNext, Read and Write with no special funcs */
  15.  
  16. /******************************************************************************/
  17. /******************************************************************************/
  18. /********************* Dispatch table to handle all packets *******************/
  19. /******************************************************************************/
  20. /******************************************************************************/
  21. #define BP1 1
  22. #define BP2 2
  23. #define BP3 4
  24. #define BP4 8
  25.  
  26. typedef void (*ifuncp)(GLOBAL, struct DosPacket *);
  27. struct LookupTable
  28.    {
  29.    ifuncp subr;
  30.    int flags;
  31.    };
  32.  
  33. #define LO_FIRST 0
  34. #define LO_LAST  34
  35. struct LookupTable lowork[LO_LAST+1] = {
  36.    { NULL,              0  | 0  | 0  | 0   }, /*  0 - ACTION_NIL            */
  37.    { NULL,              0  | 0  | 0  | 0   }, /*  1 - Unknown               */
  38.    { NULL,              BP1| BP2| BP3| 0   }, /*  2 - ACTION_GET_BLOCK      */
  39.    { NULL,              0  | BP2| BP3| 0   }, /*  3 - Unknown               */
  40.    { NULL,              BP1| BP2| BP3| 0   }, /*  4 - ACTION_SET_MAP        */
  41.    { RmtDie,            0  | 0  | 0  | 0   }, /*  5 - ACTION_DIE            */
  42.    { NULL,              0  | 0  | 0  | 0   }, /*  6 - ACTION_EVENT          */
  43.    { NULL,              BP1| 0  | 0  | 0   }, /*  7 - ACTION_CURRENT_VOLUME */
  44.    { RmtLock,           BP1| BP2| 0  | 0   }, /*  8 - ACTION_LOCATE_OBJECT  */
  45.    { NULL,              BP1| BP2| 0  | 0   }, /*  9 - ACTION_RENAME_DISK    */
  46.    { NULL,              0  | 0  | 0  | 0   }, /* 10 - Unknown               */
  47.    { NULL,              0  | 0  | 0  | 0   }, /* 11 - Unknown               */
  48.    { NULL,              0  | 0  | 0  | 0   }, /* 12 - Unknown               */
  49.    { NULL,              0  | 0  | 0  | 0   }, /* 13 - Unknown               */
  50.    { NULL,              0  | 0  | 0  | 0   }, /* 14 - Unknown               */
  51.    { RmtUnLock,         BP1| 0  | 0  | 0   }, /* 15 - ACTION_FREE_LOCK      */
  52.    { RmtDelete,         BP1| BP2| 0  | 0   }, /* 16 - ACTION_DELETE_OBJECT  */
  53.    { RmtRename,         BP1| BP2| BP3| BP4 }, /* 17 - ACTION_RENAME_OBJECT  */
  54.    { NULL,              0  | 0  | 0  | 0   }, /* 18 - ACTION_MORE_CACHE     */
  55.    { RmtDupLock,        BP1| 0  | 0  | 0   }, /* 19 - ACTION_COPY_DIR       */
  56.    { NULL,              0  | 0  | 0  | 0   }, /* 20 - ACTION_WAIT_CHAR      */
  57.    { RmtSetProtection,  0  | BP2| BP3| 0   }, /* 21 - ACTION_SET_PROTECT    */
  58.    { RmtCreateDir,      BP1| BP2| 0  | 0   }, /* 22 - ACTION_CREATE_DIR     */
  59.    { RmtExamine,        BP1| BP2| 0  | 0   }, /* 23 - ACTION_EXAMINE_OBJECT */
  60.    { RmtExNext,         BP1| BP2| 0  | 0   }, /* 24 - ACTION_EXAMINE_NEXT   */
  61.    { NULL,              BP1| 0  | 0  | 0   }, /* 25 - ACTION_DISK_INFO      */
  62.    { RmtInfo,           BP1| BP2| 0  | 0   }, /* 26 - ACTION_INFO           */
  63.    { NULL,              0  | 0  | 0  | 0   }, /* 27 - ACTION_FLUSH          */
  64.    { RmtSetComment,     0  | BP2| BP3| BP4 }, /* 28 - ACTION_SET_COMMENT    */
  65.    { RmtParent,         BP1| 0  | 0  | 0   }, /* 29 - ACTION_PARENT         */
  66.    { NULL,              BP1| 0  | 0  | 0   }, /* 30 - ACTION_TIMER          */
  67.    { NULL,              0  | 0  | 0  | 0   }, /* 31 - ACTION_INHIBIT        */
  68.    { NULL,              BP1| 0  | 0  | 0   }, /* 32 - ACTION_DISK_TYPE      */
  69.    { NULL,              0  | 0  | 0  | 0   }, /* 33 - ACTION_DISK_CHANGE    */
  70.    { NULL,              0  | 0  | 0  | 0   }  /* 34 - ACTION_SET_FILE_DATE  */
  71.       };
  72.  
  73. #define HI_FIRST 1004
  74. #define HI_LAST  1008
  75. struct LookupTable hiwork[5] = {
  76.    { RmtFindwrite,      BP1| BP2| BP3| 0   }, /* ACTION_FIND_WRITE  - 1004 */
  77.    { RmtFindwrite,      BP1| BP2| BP3| 0   }, /* ACTION_FIND_INPUT  - 1005 */
  78.    { RmtFindwrite,      BP1| BP2| BP3| 0   }, /* ACTION_FIND_OUTPUT - 1006 */
  79.    { RmtEnd,            0  | 0  | 0  | 0   }, /* ACTION_END         - 1007 */
  80.    { RmtSeek,           0  | 0  | 0  | 0   }  /* ACTION_SEEK        - 1008 */
  81.    };
  82.  
  83. #define USER_FIRST 2010
  84. #define USER_LAST  2012
  85. struct LookupTable userwork[3] = {
  86.    { RmtSetDebug,       0  | 0  | 0  | 0   }, /* ACTION_HANDLER_DEBUG 2010 */
  87.    { NULL,              BP1| 0  | 0  | 0   }, /* ACTION_SET_TRANS_TYPE2011 */
  88.    { NULL,              BP1| 0  | 0  | 0   }, /* ACTION_NETWORK_HELLO 2012 */
  89.    };
  90.  
  91. struct DosLibrary *DOSBase;
  92.  
  93. void _main(x)
  94. char *x;
  95. {
  96.    ifuncp             subr;
  97.    int                action;
  98.    struct global      global;
  99.  
  100.    DOSBase = (struct DosLibrary *)OpenLibrary(DOSNAME,0);
  101.  
  102.    /* Initialize our global data structure */
  103.    memset((char *)&global, 0, sizeof(struct global));
  104.    global.n.self   = (struct Process *) FindTask(0L);  /* find myself        */
  105.    global.n.run    = 1;
  106.    global.n.port   = &(global.n.self->pr_MsgPort);
  107.                  /* install our taskid ...   */
  108.    if(!(global.fib = (char *)
  109.              DosAllocMem(&global, 2*sizeof(struct FileInfoBlock))))
  110.    {
  111.       global.n.run = 0;
  112.    }
  113.  
  114.    /* Initialize the intuitext structures for the requesters we might have   */
  115.    /* to display                                                             */
  116.    /* Because we have no scruples we can cheat and do this with a couple of  */
  117.    /* long word assignments.  We leave the acual C code commented out here   */
  118.    /* so that if this structure ever changed we will still be able to work   */
  119. #if 0
  120.    global.n.line1.FrontPen = global.n.line1.BackPen = -1;
  121.    global.n.line1.DrawMode = JAM1;
  122.    global.n.line1.LeftEdge = global.n.line1.TopEdge = 4;
  123.    global.n.line2 = global.n.line1;
  124.    global.n.line3 = global.n.line1;
  125.    global.n.retrytxt = global.n.line1;
  126.    global.n.canceltxt = global.n.line1;
  127. #else
  128.    *(long *)&global.n.line1.FrontPen     = 0x00010000L | (JAM1<<8);
  129.    *(long *)&global.n.line1.LeftEdge     = 0x00040004L;  /* 4,4  */
  130.    *(long *)&global.n.line2.FrontPen     = 0x00010000L | (JAM1<<8);
  131.    *(long *)&global.n.line2.LeftEdge     = 0x0004000EL;  /* 4,14 */
  132.    *(long *)&global.n.line3.FrontPen     = 0x00010000L | (JAM1<<8);
  133.    *(long *)&global.n.line3.LeftEdge     = 0x00040018L;  /* 4,24 */
  134.    *(long *)&global.n.retrytxt.FrontPen  = 0x00010000L | (JAM1<<8);
  135.    *(long *)&global.n.retrytxt.LeftEdge  = 0x00040004L;
  136.    *(long *)&global.n.canceltxt.FrontPen = 0x00010000L | (JAM1<<8);
  137.    *(long *)&global.n.canceltxt.LeftEdge = 0x00040004L;
  138. #endif
  139.    global.n.retrytxt.IText = "Retry";
  140.    global.n.canceltxt.IText = "Cancel";
  141.  
  142.  
  143.    /* Should get startup info from external config file */
  144.    if(InitDevice(&global))
  145.    {
  146.       BUG(("****** ERROR INITIALIZING\n"));
  147. #if DEBUG
  148.       /* Can't use BUGR - need &global, not global */       
  149.       request(&global, REQ_GENERAL, "Can't init");
  150. #endif
  151.    }
  152.    else
  153.    while(global.n.run)   /* start of the real work */
  154.    {
  155.       if(GetRPacket(&global, global.n.devptr))
  156.       {
  157.          if(!ReSync(&global, global.n.devptr)) continue;
  158.          break;
  159.       }
  160.  
  161.       BUG(("Execute: action #%ld arg1 %lx\n", 
  162.            global.RP.Type, global.RP.Arg1));
  163.  
  164.       switch(action = global.pkt->dp_Type = global.RP.Type)
  165.          {
  166.          case ACTION_NETWORK_KLUDGE:
  167.             subr = RmtNetKludge;
  168.             break;
  169.          
  170.          case ACTION_READ:
  171.             subr = RmtRead;
  172.             break;
  173.          case ACTION_WRITE:
  174.             subr = RmtWrite;
  175.             break;
  176.  
  177.          case ACTION_SET_RAW_MODE:
  178.             subr = NULL;
  179.             break;
  180.  
  181.          case ACTION_FIND_WRITE:  /* 1004 */
  182.          case ACTION_FIND_INPUT:  /* 1005 */
  183.          case ACTION_FIND_OUTPUT: /* 1006 */
  184.          case ACTION_END:         /* 1007 */
  185.          case ACTION_SEEK:        /* 1008 */
  186.             subr = hiwork[action-HI_FIRST].subr;
  187.             break;
  188.  
  189.          case ACTION_HANDLER_DEBUG:  /* 2010 */
  190.          case ACTION_SET_TRANS_TYPE: /* 2011 */
  191.          case ACTION_NETWORK_HELLO:  /* 2012 */
  192.             subr = userwork[action-USER_FIRST].subr;
  193.             break;
  194.  
  195.          default:            
  196.             if ((action >= LO_FIRST) && (action <= LO_LAST))
  197.                {
  198.                subr = lowork[action-LO_FIRST].subr;
  199.                }
  200.             else
  201.                subr = NULL;
  202.          }
  203.  
  204.       if(subr != NULL)
  205.       {
  206.          global.n.reply = 1;
  207.          (*subr)(&global, global.pkt);
  208.       }
  209.       else
  210.       {
  211.          global.RP.Arg1 = DOS_FALSE;
  212.          global.RP.Arg2 = ERROR_ACTION_NOT_KNOWN;
  213.          BUG(("Unknown packet type %ld\n",global.RP.Type));
  214.       }
  215.  
  216.       /* Now return the packet to them */
  217.       if (global.n.reply && 
  218.           PutRPacket(&global, global.n.devptr) &&
  219.           ReSync(&global, global.n.devptr))
  220.          break;
  221.   
  222.       BUG(("-----\n"));
  223.    }
  224.  
  225.    TermDevice(&global);
  226.  
  227.    BUGTERM()  
  228. }
  229.  
  230. #define DEBUG_SPECIAL 0x40000000   /* Mask for handler-defined dbg type*/
  231. #define DEBUG_SERVER  0x20000000   /* Mask indicating server command   */
  232. #define DEBUG_SERVWT  0x10000000   /* Wait for debugger to catch us    */
  233.  
  234. void RmtSetDebug(global, pkt)
  235. GLOBAL global;
  236. struct DosPacket *pkt;
  237. {
  238. #if DEBUG
  239.    BUG(("RmtSetDebug: Entry, arg1 %lx\n", global->RP.Arg1))
  240.    if(global->RP.Arg1 == DEBUG_SERVWT) 
  241.       cprwait(global);
  242.    else if(global->RP.Arg1) 
  243.       BUGINIT()
  244.    else
  245.       BUGTERM()
  246.  
  247. #endif
  248.    pkt->dp_Res1 = DOS_TRUE;
  249. }
  250.