home *** CD-ROM | disk | FTP | other *** search
/ Dr. CD ROM (Annual Premium Edition) / premium.zip / premium / IBMOS2_2 / MAILMIND.ZIP / NETADDUS.C < prev    next >
Text File  |  1992-03-11  |  5KB  |  174 lines

  1. /* netaddus.c - add %username% & %home_server% as NETBIOS names
  2.  * Thomas A. Marciniak, M.D. = ytm@nihccpc1.bitnet
  3.  * Division of Cancer Prevention & Control, NCI
  4.  */
  5.  
  6. /* Revision history:
  7.  * 1.03  ytm  05/21/91  don't wipe out high netbios name numbers
  8.  * 1.02  ytm  02/01/91  add both user & server, check for existing
  9.  * 1.01  ytm  01/31/91  eliminate post routine
  10.  * 1.00  ytm  01/31/91  first release
  11.  */
  12.  
  13. /* Program notes:
  14.  * Current versions are specific for TurboC.
  15.  */
  16.  
  17. #include <local.h>                      /* standard definitions */
  18. #include "netbios.h"
  19.  
  20. /* defines */
  21. #define ADDUSER  1
  22. #define ADDSERV  2
  23. #define USER_NUM 4
  24. #define SERV_NUM 5
  25. #define MIN_SERV_LEN 5                  /* minimum length of server name */
  26.  
  27. /* status structure */
  28. #define STATUS_NOUSER  100
  29. #define STATUS_NOSERV  101
  30. #define STATUS_BADUSER 102
  31. #define STATUS_BADSERV 103
  32. #define STATUS_UNKNOWN 0xff
  33. #define STATUS_STRUCT struct status
  34. typedef STATUS_STRUCT
  35.   {
  36.   word   wCode;
  37.   string sText;
  38.   };
  39. STATUS_STRUCT aStatus[] =
  40.   {
  41.   {0,  "OK"},
  42.   {13, "already present"},
  43.   {22, "at another station"},
  44.   {STATUS_NOUSER, "NO username!"},
  45.   {STATUS_NOSERV, "NO home_server!"},
  46.   {STATUS_BADUSER, "user number bad"},
  47.   {STATUS_BADSERV, "server number bad"},
  48.   {STATUS_UNKNOWN, "?"}
  49.   };
  50.  
  51. /* globals */
  52. NB_STATUS Nb;
  53. NCB       Ncb;
  54.  
  55. /* function prototypes */
  56. short main(void);
  57. word NetAddName(string sName, boolean bGroup);
  58. word NetAdapterStatus(string sName);
  59. word NetDelName(string sName);
  60. void SetNbName(string sTarget, string sSource);
  61.  
  62. /* main */
  63. short main(void)
  64. {
  65. char   caServGroup[NETBIOS_NAME_LEN];
  66. char   caUser[NETBIOS_NAME_LEN];
  67. short  i;
  68. short  iAddName = 0;
  69. word   wStatus;
  70. printf("Netaddus v1.03\n");
  71. if (getenv("USERNAME") == NULL) wStatus = STATUS_NOUSER;
  72. else if (strlen(getenv("HOME_SERVER")) < MIN_SERV_LEN)
  73.   wStatus = STATUS_NOSERV;
  74. else if ((wStatus = NetAdapterStatus("*")) == SUCCESS)
  75.   {
  76.   SetNbName(caUser, getenv("USERNAME"));
  77.   SetNbName(caServGroup, getenv("HOME_SERVER"));
  78.   caServGroup[0] = 'U';
  79.   caServGroup[1] = 'S';
  80.   caServGroup[2] = 'E';
  81.   caServGroup[3] = 'R';
  82.   iAddName = ADDUSER + ADDSERV;
  83.   for (i = 0; i < Nb.wNames && !wStatus; i++)
  84.     {
  85.     if (Nb.aNameEntry[i].byNcbNum == USER_NUM)
  86.       {
  87.       if (strcmp(Nb.aNameEntry[i].caName, caUser) SAME)
  88.         iAddName -= ADDUSER;
  89.       else wStatus = NetDelName(Nb.aNameEntry[i].caName);
  90.       }
  91.     else if (Nb.aNameEntry[i].byNcbNum == SERV_NUM)
  92.       {
  93.       if (strcmp(Nb.aNameEntry[i].caName, caServGroup) SAME)
  94.         iAddName -= ADDSERV;
  95.       else wStatus = NetDelName(Nb.aNameEntry[i].caName);
  96.       }
  97.     } /* for */
  98.   if (!wStatus && (iAddName & ADDUSER))
  99.     {
  100.     wStatus = NetAddName(caUser, FALSE);
  101.     if (!wStatus && (Ncb.NCB_NUM != USER_NUM)) wStatus = STATUS_BADUSER;
  102.     }
  103.   if (!wStatus && (iAddName & ADDSERV))
  104.     {
  105.     wStatus = NetAddName(caServGroup, TRUE);
  106.     if (!wStatus && (Ncb.NCB_NUM != SERV_NUM)) wStatus = STATUS_BADSERV;
  107.     }
  108.   }
  109. for (i = 0; *(aStatus[i].sText) != '?'; i++)
  110.   if (aStatus[i].wCode == wStatus) break;
  111. printf("Netaddus status: %s (%d)\n", aStatus[i].sText, Ncb.NCB_CMD_CPLT);
  112. return(i);
  113. } /* main */
  114.  
  115. /* check the adapter status */
  116. word NetAdapterStatus(string sName)
  117. {
  118. memset(&Ncb, 0, sizeof(NCB));
  119. Ncb.NCB_COMMAND = STATUS_WAIT;
  120. SetNbName(Ncb.NCB_CALLNAME, sName);
  121. Ncb.NCB_BUFFER = (void far *) &Nb;
  122. Ncb.NCB_LENGTH = sizeof(Nb);
  123. Ncb.NCB_CMD_CPLT = STATUS_UNKNOWN;
  124. _ES = FP_SEG(&Ncb);
  125. _BX = FP_OFF(&Ncb);
  126. _AX = 0x0100;
  127. geninterrupt(0x5c);
  128. return(Ncb.NCB_CMD_CPLT);
  129. } /* NetAdapterStatus */ 
  130.  
  131. /* add a name to the network */
  132. word NetAddName(string sName, boolean bGroup)
  133. {
  134. printf("Adding %s ", sName);
  135. memset(&Ncb, 0, sizeof(NCB));
  136. if (bGroup) Ncb.NCB_COMMAND = ADD_GROUP_NAME_WAIT;
  137. else Ncb.NCB_COMMAND = ADD_NAME_WAIT;
  138. strncpy(Ncb.NCB_NAME, sName, NETBIOS_NAME_LEN);
  139. Ncb.NCB_CMD_CPLT = STATUS_UNKNOWN;
  140. _ES = FP_SEG(&Ncb);
  141. _BX = FP_OFF(&Ncb);
  142. _AX = 0x0100;
  143. geninterrupt(0x5c);
  144. if (Ncb.NCB_CMD_CPLT) printf("FAILED\n");
  145. else printf("NETBIOS number %d\n", Ncb.NCB_NUM);
  146. return(Ncb.NCB_CMD_CPLT);
  147. } /* NetAddName */ 
  148.  
  149. /* delete a name from NETBIOS */
  150. word NetDelName(string sName)
  151. {
  152. memset(&Ncb, 0, sizeof(NCB));
  153. Ncb.NCB_COMMAND = DELETE_NAME_WAIT;
  154. strncpy(Ncb.NCB_NAME, sName, NETBIOS_NAME_LEN);
  155. Ncb.NCB_CMD_CPLT = STATUS_UNKNOWN;
  156. _ES = FP_SEG(&Ncb);
  157. _BX = FP_OFF(&Ncb);
  158. _AX = 0x0100;
  159. geninterrupt(0x5c);
  160. return(Ncb.NCB_CMD_CPLT);
  161. } /* NetDelName */ 
  162.  
  163. /* copy & blank fill a string to NB name length */
  164. void SetNbName(string sTarget, string sSource)
  165. {
  166. string s, t;
  167. memset(sTarget, 0, NETBIOS_NAME_LEN);
  168. strncpy(sTarget, sSource, NETBIOS_NAME_LEN);
  169. for (s = sTarget, t = s + NETBIOS_NAME_LEN - 1; s < t; s++)
  170.   *s = ((*s) ? toupper(*s) : ' ');
  171. } /* SetNbName */
  172.  
  173.  
  174.