/* * @NET.C * * Program to provide the same functionallity as the LANtastic NET program * with the added ability to process indirect files (i.e. @NET @PARAMS.FIL) */ #include #include #include #include #include "lantasti.h" #define MAX_CMDS 6 #define MAX_CMD_SIZE 7 #define MAX_ARGS 10 #define MAX_ARG_SIZE 40 typedef struct { char Command [MAX_CMD_SIZE]; (*Function) (void); } VC; int unuse (void); int help (void); int login (void); int logout (void); int lpt (void); int unuse (void); int use (void); int parse (void); void ProcessArgs (void); int indx; char **Arguments; char **FileArgs; char Server [17]; union { char UserID [17]; char Resource [17]; } Net; char Password [17]; char Device [5]; int Timeout; VC ValidCommands [MAX_CMDS] = { "HELP", help, "LOGIN", login, "LOGOUT", logout, "LPT", lpt, "UNUSE", unuse, "USE", use }; FILE *CmdStream; FILE *AltCmdStream; char Buffer [81]; int parse (void) { char *src, *dest; if (strncmp ("\\\\", Arguments [indx], 2) != 0) { strcpy (Device, Arguments [indx]); indx++; } else { *Device = '\0'; } if (strncmp ("\\\\", Arguments [indx], 2) == 0) { src = Arguments [indx] + 2; dest = Server; while (*src != '\\') { *dest++ = *src++; } src++; dest = Net.UserID; while (*src != '\0') { *dest++ = *src++; } indx++; strcpy (Password, Arguments [indx]); } else { *Server = '\0'; *Net.UserID = '\0'; Timeout = atoi (Arguments [indx]); } } int help (void) { parse (); clrscr (); cprintf ("\n\r@NET - LANtastic Network Functions with Indirect File Support"); cprintf ("\n\r\n\rSupported commands are:"); cprintf ("\n\r HELP - Display this screen"); cprintf ("\n\r LOGIN - Login to a server"); cprintf ("\n\r LOGOUT - Log out of a server"); cprintf ("\n\r USE - Use a resource of a server"); cprintf ("\n\r UNUSE - Release a resource of a server"); cprintf ("\n\r LPT TIMEOUT - Set printer timeouts"); cprintf ("\n\r"); cprintf ("\n\r @ - Execute commands from file "); cprintf ("\n\r\n\rPress a key to continue"); getch (); return 0; } int login (void) { int retc = FALSE; retc = ServerLogin (Server, Net.UserID, Password); return (retc); } int logout (void) { return (ServerLogout (Server)); } int lpt (void) { return (SetPtrTimeout ((int) Timeout * 18.2)); } int unuse (void) { return (RedirectCancel (Device)); } int use (void) { int DevType; char RemoteName [40]; sprintf (RemoteName, "\\\\%s\\%s", Server, Net.Resource); if (strlen (Device) > 2) { DevType = DevTypePtr; } else { DevType = DevTypeDsk; } return (RedirectDevice (DevType, Device, RemoteName)); } void ProcessArgs (void) { int j; j = 0; indx = 1; strupr (Arguments [indx]); while ((strcmp (Arguments [indx], ValidCommands[j].Command) != 0) & (j < MAX_CMDS)) { j++; } if (j < MAX_CMDS) { indx++; parse (); (ValidCommands[j].Function) (); } else { cprintf ("\n\rInvalid command: <%s>", Arguments [indx]); } } main (int argc, char **argv) { int j; char *ptr; clrscr (); if (argc < 2) { help (); exit (1); } Arguments = argv; if (argv [1][0] == '@') { if ((CmdStream = fopen(&argv [1][1], "rt")) == NULL) { cprintf ("\n\n\rUnable to open indirect file %s\n\r", argv [1]); } else { FileArgs = calloc (MAX_ARGS, MAX_ARG_SIZE); Arguments = FileArgs; while (NULL != fgets (Buffer, sizeof (Buffer) - 1, CmdStream)) { FileArgs [0] = "@NET.C"; j = 1; ptr = strtok (Buffer, " "); while (ptr != NULL) { if ((j == 1) & (stricmp (ptr, "NET") == 0)) { ptr = strtok (NULL, " "); } else { FileArgs [j] = calloc (1, strlen (ptr) + 1); strcpy (FileArgs [j], ptr); ptr = strtok (NULL, " "); j++; } } j--; ptr = strchr (FileArgs [j], '\n'); if (ptr != NULL) { *ptr = '\0'; } ProcessArgs (); } } } else { ProcessArgs (); } }