home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * Init.c *
- * *
- * Line Printer Daemon using TCP/IP printer protocol *
- * *
- * -------------- The initialisation routines -------------- *
- * *
- * Written by Casper Boon, August, 1992. *
- * *
- * © 1992 Casper Boon. *
- * *
- ************************************************************************/
- #include "LPD.H"
- #include "CvtAddr.h"
- #include "Spooler.H"
- #include "lpdProtos.H"
- #include <Traps.H>
-
-
- Boolean TrapAvailable(integer tNumb, TrapType tType);
- void GetParameters(void);
-
- /************************************************************************
- * *
- * Normal Macintosh initialisations. *
- * *
- ************************************************************************/
- void Initialise()
- {
- integer i;
- WindowPtr WhichWindow;
- Handle menuBar;
- SysEnvRec envir;
-
- MaxApplZone();
-
- for (i = 0; i < 16; i++)
- MoreMasters();
-
- ShowCursor();
- InitGraf((Ptr)&thePort);
- ShowCursor();
- InitFonts();
- ShowCursor();
- FlushEvents(everyEvent, 0);
- ShowCursor();
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs((ProcPtr) NIL);
-
- haveWaitEvnt = TrapAvailable(_WaitNextEvent, ToolTrap);
- SysEnvirons(1, &envir); /* look for at least 128K ROMS */
- if (envir.machineType < 0)
- {
- AlertUser(eWrongROM);
- ExitToShell();
- }
-
- if ( !(menuBar = GetNewMBar(rMenuBar)) )
- {
- AlertUser(eNoMemory);
- ExitToShell();
- }
-
- SetMenuBar(menuBar);
- DisposHandle(menuBar);
- AddResMenu(GetMHandle(appleMenu), 'DRVR');
- DrawMenuBar();
-
- InitCursor();
- ShowCursor();
- GetWMgrPort(&WhichWindow);
- SetPort(WhichWindow);
- screenRect = WhichWindow->portRect;
- screenRect.top += MBarHeight;
-
- ShowCursor();
-
- cursRgn = NewRgn();
-
- }
-
- /************************************************************************
- ************************************************************************/
- static Boolean TrapAvailable(integer tNumb, TrapType tType)
- {
- return NGetTrapAddress(tNumb, tType) != GetTrapAddress(_Unimplemented);
- }
-
- /************************************************************************
- * *
- * Read a line from the configuration file. This repeats until it finds *
- * a line with something in it after stripping comments and white space *
- * from the start and end. *
- * *
- ************************************************************************/
- static integer ReadLn(integer f, char *ibuf)
- {
- char c, *buf;
- integer len;
- do {
- buf = ibuf; len = 1;
-
- /* skip white space */
- do { c = fgetc(f); }
- while (c && (c == ' ' || c == '\t') );
-
- while (c && c != '\r' && c != '\n' && c != '#')
- {
- *buf++ = c; c = fgetc(f); len++;
- }
-
- if (c == '#') /* if it was a '#' skip to the end of line */
- {
- do { c = fgetc(f); }
- while ( c && c != '\r' && c != '\n' );
- }
-
-
- /* strip trailing spaces */
- do {
- *buf-- = 0; len--;
- }
- while ( len > 0 && (*buf == ' ' || *buf == '\t') );
- }
- while ( !len && c ); /* c will be 0 on eof */
-
- return (len || c);
- }
-
-
- /************************************************************************
- ************************************************************************/
- #define NO_CMMND 0
- #define PRINTER 1
- #define HOST 2
- #define ALIAS 3
- #define ADMIN 4
- #define CFA_STR 5
- #define NOMAIL 6
- #define NOACNT 7
- #define LASERWRTR 8
- #define DEBUG_CMD 9
- #define NO_ACTION 10
-
-
- /************************************************************************
- ************************************************************************/
- char toupper(char c);
- char toupper(char c)
- {
- if (c >= 'a' && c <= 'z')
- return c - 'a' + 'A';
- return c;
- }
-
- /************************************************************************
- * *
- * Convert a command string to a command number *
- * *
- ************************************************************************/
- static char * GetCmmnd(char *buf, integer *cmmnd);
- char * GetCmmnd(char *buf, integer *cmmnd)
- {
- char cmd[12];
- integer i = 0;
- while (*buf && *buf != ' ' && *buf != '\t' && i < 11) cmd[i++] = toupper(*buf++);
- cmd[i] = 0;
- if (strcmp("PRINTER", cmd) == 0) *cmmnd = PRINTER;
- else if (strcmp("HOST", cmd) == 0) *cmmnd = HOST;
- else if (strcmp("ALIAS", cmd) == 0) *cmmnd = ALIAS;
- else if (strcmp("ADMIN", cmd) == 0) *cmmnd = ADMIN;
- else if (strcmp("CTLFIL", cmd) == 0) *cmmnd = CFA_STR;
- else if (strcmp("NOMAIL", cmd) == 0) *cmmnd = NOMAIL;
- else if (strcmp("NOACNT", cmd) == 0) *cmmnd = NOACNT;
- else if (strcmp("LASERWRITER", cmd) == 0) *cmmnd = LASERWRTR;
- else if (strcmp("DEBUG", cmd) == 0) *cmmnd = DEBUG_CMD;
- else if (strcmp("NOACTION", cmd) == 0) *cmmnd = NO_ACTION;
- else *cmmnd = NO_CMMND;
-
- while (*buf && (*buf == ' ' || *buf == '\t')) buf++;
-
- return buf;
- }
-
-
- /************************************************************************
- * *
- * Read the configuration file. *
- * *
- ************************************************************************/
- integer ReadConfig()
- {
- integer cfg_dir = GetLogDir(); /* get the logging folder */
- integer f, cmmnd;
- char buf[128], *str;
- Str255 mess;
-
- CONFIG_Banner_Up();
-
- if (FSOpen("\pLPD.Config", cfg_dir, &f) != noErr)
- {
- AlertUser(eNoConfig);
- FSClose(f);
- Exit();
- }
-
- while ( ReadLn(f, buf) )
- {
- str = GetCmmnd(buf, &cmmnd);
-
- psprintf(mess, " %s", buf);
- PSTAT_Banner_Step(mess);
-
- switch (cmmnd)
- {
- case PRINTER : ParsePrinter(str); break;
- case HOST : ParseHost(str); break;
- case ALIAS : ParseAlias(str); break;
- case ADMIN : ParseAdmin(str); break;
- case CFA_STR : ParseCFA(str); break;
- case NOMAIL : mailing = FALSE; break;
- case NOACNT : accounting = FALSE; break;
- case LASERWRTR : ParseLaser(str); break;
- case DEBUG_CMD : debugOn = !debugOn; break;
- case NO_ACTION : noAction = TRUE; break;
- }
- }
-
- UnloadSeg(ConvertStringToAddr);
- UnloadSeg(ParseAlias);
- FSClose(f);
-
- PSTAT_Banner_Down();
- }
-
- /************************************************************************
- * *
- * For those commands that require a a name this utility function will *
- * extract it, allowing for quoted strings. Without quotes it stops on *
- * whitespace, with quotes it stops on the terminating quote. *
- * *
- ************************************************************************/
- char *ReadAName(char *str, char *name);
- static char *ReadAName(char *str, char *name)
- {
- char term = ' ', term2 = '\t';
-
- if (*str == '"') { term = *str++; term2 = term; }
- while (*str && *str != term && *str != term2) *name++ = *str++;
- if (*str == term) str++;
- *name = 0;
- while (*str && (*str == ' ' || *str == '\t') ) str++;
- return str;
- }
-
- /************************************************************************
- ************************************************************************/
- char *ReadANum(char *str, integer *num);
- static char *ReadANum(char *str, integer *num)
- {
- integer tnum = 0;
-
- while (*str && *str >= '0' && *str <= '9')
- { tnum *= 10; tnum += (*str++ - '0'); }
- *num = tnum;
- while (*str && (*str == ' ' || *str == '\t') ) str++;
- return str;
- }
-
-
- /************************************************************************
- ************************************************************************/
-
-
- #include <serial.h>
-
- extern prtHandle printers;
-
- /************************************************************************
- ************************************************************************/
- static void ParsePrinter(char *str)
- {
- char cmd[12], parity;
- prtRecord prt;
- integer i = 0, baud, bits, stop, parm, nPrtrs = 0;
-
-
- str = ReadAName(str, prt.in_name);
- while (*str && *str != ' ' && *str != '\t' && i < 11) cmd[i++] = toupper(*str++);
- cmd[i] = 0;
- if (strcmp("PAP", cmd) == 0) prt.pap = TRUE;
- else if (strcmp("SERIAL", cmd) == 0) prt.pap = FALSE;
- else return; /* bad type */
- while (*str && (*str == ' ' || *str == '\t')) str++;
- str = ReadAName(str, (char*)&prt.outname[1]);
- prt.outname[0] = strlen((char*)&prt.outname[1]);
- parm = 0;
- if (!prt.pap)
- {
- str = ReadANum(str, &baud);
- str = ReadANum(str, &stop);
- parity = *str++;
- while (*str && *str != ' ' && *str != '\t') str++;
- while (*str && (*str == ' ' || *str == '\t')) str++;
- str = ReadANum(str, &bits);
- switch (baud)
- {
- case 300: parm = baud300; break;
- case 600: parm = baud600; break;
- case 1200: parm = baud1200; break;
- case 1800: parm = baud1800; break;
- case 2400: parm = baud2400; break;
- case 3600: parm = baud3600; break;
- case 4800: parm = baud4800; break;
- case 7200: parm = baud7200; break;
- case 9600: parm = baud9600; break;
- case 19200: parm = baud19200; break;
- case 57600: parm = baud57600; break;
- }
- switch (stop)
- {
- case 10: parm |= stop10; break;
- case 15: parm |= stop15; break;
- case 20: parm |= stop20; break;
- }
- switch (parity)
- {
- case 'N': parm |= noParity; break;
- case 'O': parm |= oddParity; break;
- case 'E': parm |= evenParity; break;
- }
- switch (bits)
- {
- case 5: parm |= data5; break;
- case 6: parm |= data6; break;
- case 7: parm |= data7; break;
- case 8: parm |= data8; break;
- }
- prt.params = parm;
- }
-
- prt.postscript = (*str == 'P');
-
- if (!printers)
- printers = (prtHandle)NewHandle(sizeof(prtRecord));
- else
- {
- HUnlock((Handle)printers);
- nPrtrs = (GetHandleSize((Handle)printers) / sizeof(prtRecord));
- SetHandleSize((Handle)printers, GetHandleSize((Handle)printers) + sizeof(prtRecord) );
- }
-
- MoveHHi((Handle)printers);
- HLock((Handle)printers);
- (*printers)[nPrtrs] = prt;
-
- if DEBUGGING
- {
- log_printf("PRINTER \"%s\" is \"%p\"\n", prt.in_name, prt.outname);
- if (!prt.pap) log_printf("Serial printer %d %d %c %d\n",
- baud, stop, parity, bits);
- log_printf("%d printers found\n", nPrtrs+1);
- }
- }
-
-
- /************************************************************************
- ************************************************************************/
- static void ParseHost(char *str)
- {
- LongWord ipAddress;
- Byte *ip = (Byte*)&ipAddress;
- integer nHosts = 0;
-
-
- if (ConvertStringToAddr(str, &ipAddress)==noErr)
- {
- if (!hosts)
- hosts = NewHandle(sizeof(LongWord));
- else
- {
- nHosts = (GetHandleSize(hosts) / sizeof(LongWord));
- SetHandleSize( hosts, GetHandleSize(hosts) + sizeof(LongWord) );
- }
- HLock(hosts);
- ((LongWord*)(*hosts))[nHosts] = ipAddress;
- HUnlock(hosts);
- if DEBUGGING
- log_printf("HOST \"%s\" resolved %d.%d.%d.%d\n", str, ip[0], ip[1], ip[2], ip[3]);
- }
- else
- log_printf("cannot resolve HOST \"%s\"\n", str);
- }
-
-
- /************************************************************************
- ************************************************************************/
- static void ParseCFA(char *str)
- {
- extern char *cfA;
- cfA = (char*)NewPtr(strlen(str));
- str = ReadAName(str, cfA);
- }
-
-
- /************************************************************************
- ************************************************************************/
- static void ParseLaser(char *str)
- {
- extern Byte *LaserWriterName;
- str = ReadAName(str, (char*)&LaserWriterName[1]);
- LaserWriterName[0] = strlen((char*)LaserWriterName);
- }
-