home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: InfoMgt / InfoMgt.zip / MAILMIND.ZOO / NETRCV.C < prev    next >
Text File  |  1992-03-11  |  3KB  |  127 lines

  1. /* netrcv.c - program to receive messages
  2.  * Thomas A. Marciniak, M.D. = ytm@nihccpc1.bitnet
  3.  * Division of Cancer Prevention & Control, NCI
  4.  */
  5.  
  6. /* Revision history:
  7.  * 1.00  ytm  12/14/90  first release
  8.  */
  9.  
  10. /* Program notes:
  11.  * Current versions are specific for TurboC.
  12.  */
  13.  
  14. #include <local.h>                      /* standard definitions */
  15. #include "netbios.h"
  16.  
  17. /* constants */
  18. #define USER_NUM    0xff                /* receive any */
  19.  
  20. /* status structure */
  21. #define STATUS_OK      0
  22. #define STATUS_UNKNOWN 0xff
  23. #define STATUS_STRUCT struct status
  24. typedef STATUS_STRUCT
  25.   {
  26.   word   wCode;
  27.   string sText;
  28.   };
  29. STATUS_STRUCT aStatus[] =
  30.   {
  31.   {0, "OK"},
  32.   {9, "message too large"},
  33.   {19, "no local name"},
  34.   {STATUS_UNKNOWN, "?"}
  35.   };
  36.  
  37. /* globals */
  38. NCB    RcvNcb, CanNcb;
  39. char   caPacket[MAX_PACKET];
  40. boolean bReceived = FALSE;
  41.  
  42. /* function prototypes */
  43. short main(short argc, string argv[]);
  44. void NetCancel(NCB *pToCanNcb);
  45. void NetReceive(void interrupt (*PostFn)(), short iNbNum);
  46. void interrupt Post(void);
  47.  
  48. /* cancel a NETBIOS command */
  49. void NetCancel(NCB *pToCanNcb)
  50. {
  51. memset(&CanNcb, 0, sizeof(NCB));
  52. CanNcb.NCB_COMMAND = CANCEL;
  53. CanNcb.NCB_BUFFER = (void far *) pToCanNcb;
  54. CanNcb.NCB_CMD_CPLT = 0xFF;
  55. _ES = FP_SEG(&CanNcb);
  56. _BX = FP_OFF(&CanNcb);
  57. _AX = 0x0100;
  58. geninterrupt(0x5c);
  59. } /* NetCancel */ 
  60.  
  61. /* receive a datagram */
  62. void NetReceive(void interrupt (*pPostFn)(), short iNbNum)
  63. {
  64. memset(&RcvNcb, 0, sizeof(NCB));
  65. RcvNcb.NCB_COMMAND = RECEIVE_DATAGRAM;
  66. RcvNcb.NCB_NUM = iNbNum;
  67. RcvNcb.NCB_LENGTH = MAX_PACKET;
  68. RcvNcb.NCB_POST = pPostFn;
  69. RcvNcb.NCB_BUFFER = (void far *) caPacket;
  70. RcvNcb.NCB_CMD_CPLT = 0xFF;
  71. _ES = FP_SEG(&RcvNcb);
  72. _BX = FP_OFF(&RcvNcb);
  73. _AX = 0x0100;
  74. geninterrupt(0x5c);
  75. } /* NetReceive */ 
  76.  
  77. void interrupt Post(void)
  78. {
  79. bReceived = TRUE;
  80. } /* Post */
  81.  
  82. /* main */
  83. short main(short argc, string argv[])
  84. {
  85. boolean bMore = TRUE;
  86. short   ch;
  87. short   i;
  88. short   iRcvNum = USER_NUM;
  89. word    wStatus = 0;
  90. printf("Netrcv v1.00\n");
  91. if (argc > 1) iRcvNum = atoi(argv[1]);
  92. printf("Receiving for %d (press <Esc> to stop)\n", iRcvNum);
  93. NetReceive(Post, iRcvNum);
  94. while (bMore)
  95.   {
  96.   if (kbhit())
  97.     {
  98.     GETKEY(ch);
  99.     if (ch == ESC)
  100.       {
  101.       bMore = FALSE;
  102.       wStatus = STATUS_OK;
  103.       NetCancel(&RcvNcb);
  104.       }
  105.     }
  106.   if (bMore && bReceived)
  107.     {
  108.     wStatus = RcvNcb.NCB_CMD_CPLT;
  109.     if (wStatus) bMore = FALSE;
  110.     else
  111.       {
  112.       bReceived = FALSE;
  113.       printf("%d byte datagram from %s\n", RcvNcb.NCB_LENGTH,
  114.                RcvNcb.NCB_CALLNAME);
  115.       printf("%s\n", caPacket);
  116.       NetReceive(Post, iRcvNum);
  117.       }
  118.     }
  119.   }
  120. for (i = 0; *(aStatus[i].sText) != '?'; i++)
  121.   if (aStatus[i].wCode == wStatus) break;
  122. printf("Netrcv status: %s (%d)\n", aStatus[i].sText, RcvNcb.NCB_CMD_CPLT);
  123. return(i);
  124. } /* main */
  125.  
  126.  
  127.