|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T u
Length: 8326 (0x2086) Types: TextFile Names: »utility.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Rog-O-Matic/utility.c«
/* * utility.c: Rog-O-Matic XIV (CMU) Thu Jan 31 18:18:22 1985 - mlm * Copyright (C) 1985 by A. Appel, G. Jacobson, L. Hamey, and M. Mauldin * * This file contains all of the miscellaneous system functions which * determine the baud rate, time of day, etc. */ # include <sgtty.h> # include <stdio.h> # include <signal.h> # include <sys/types.h> # include <sys/stat.h> # include "install.h" # ifdef BSD41 # include <time.h> # else # include <sys/time.h> # endif # define TRUE 1 # define FALSE 0 /* * baudrate: Determine the baud rate of the terminal */ baudrate () { static short baud_convert[] = { 0, 50, 75, 110, 135, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600 }; static struct sgttyb sg; static short baud_rate; gtty (fileno (stdin), &sg); baud_rate = sg.sg_ospeed == 0 ? 1200 : sg.sg_ospeed < sizeof baud_convert / sizeof baud_convert[0] ? baud_convert[sg.sg_ospeed] : 9600; return (baud_rate); } /* * stlmatch -- match leftmost part of string * * Usage: i = stlmatch (big,small) * int i; * char *small, *big; * * Returns 1 iff initial characters of big match small exactly; * else 0. * * HISTORY * 18-May-82 Michael Mauldin (mlm) at Carnegie-Mellon University * Ripped out of CMU lib for Rog-O-Matic portability * 20-Nov-79 Steven Shafer (sas) at Carnegie-Mellon University * Rewritten for VAX from Ken Greer's routine. * * Originally from klg (Ken Greer) on IUS/SUS UNIX */ int stlmatch (big, small) char *small, *big; { register char *s, *b; s = small; b = big; do { if (*s == '\0') return (1); } while (*s++ == *b++); return (0); } /* * getname: get userid of player. */ char *getname () { static char name[100]; int i; getpw (getuid (), name); i = 0; while (name[i] != ':' && name[i] != ',') i++; name[i] = '\0'; return (name); } /* * putenv -- put value into environment * * Usage: i = putenv (name,value) * int i; * char *name, *value; * * Putenv associates "value" with the environment parameter "name". * If "value" is 0, then "name" will be deleted from the environment. * Putenv returns 0 normally, -1 on error (not enough core for malloc). * * Putenv may need to add a new name into the environment, or to * associate a value longer than the current value with a particular * name. So, to make life simpler, putenv() copies your entire * environment into the heap (i.e. malloc()) from the stack * (i.e. where it resides when your process is initiated) the first * time you call it. * * HISTORY * 25-Nov-82 Michael Mauldin (mlm) at Carnegie-Mellon University * Ripped out of CMU lib for Rog-O-Matic portability * 20-Nov-79 Steven Shafer (sas) at Carnegie-Mellon University * Created for VAX. Too bad Bell Labs didn't provide this. It's * unfortunate that you have to copy the whole environment onto the * heap, but the bookkeeping-and-not-so-much-copying approach turns * out to be much hairier. So, I decided to do the simple thing, * copying the entire environment onto the heap the first time you * call putenv(), then doing realloc() uniformly later on. * Note that "putenv(name,getenv(name))" is a no-op; that's the reason * for the use of a 0 pointer to tell putenv() to delete an entry. * */ #define EXTRASIZE 5 /* increment to add to env. size */ char *index (), *malloc (), *realloc (); int strlen (); static int envsize = -1; /* current size of environment */ extern char **environ; /* the global which is your env. */ static int findenv (); /* look for a name in the env. */ static int newenv (); /* copy env. from stack to heap */ static int moreenv (); /* incr. size of env. */ int putenv (name, value) char *name, *value; { register int i, j; register char *p; if (envsize < 0) { /* first time putenv called */ if (newenv () < 0) /* copy env. to heap */ return (-1); } i = findenv (name); /* look for name in environment */ if (value) { /* put value into environment */ if (i < 0) { /* name must be added */ for (i = 0; environ[i]; i++); if (i >= (envsize - 1)) { /* need new slot */ if (moreenv () < 0) return (-1); } p = malloc (strlen (name) + strlen (value) + 2); if (p == 0) /* not enough core */ return (-1); environ[i + 1] = 0; /* new end of env. */ } else { /* name already in env. */ p = realloc (environ[i], strlen (name) + strlen (value) + 2); if (p == 0) return (-1); } sprintf (p, "%s=%s", name, value);/* copy into env. */ environ[i] = p; } else { /* delete name from environment */ if (i >= 0) { /* name is currently in env. */ free (environ[i]); for (j = i; environ[j]; j++); environ[i] = environ[j - 1]; environ[j - 1] = 0; } } return (0); } static int findenv (name) char *name; { register char *namechar, *envchar; register int i, found; found = 0; for (i = 0; environ[i] && !found; i++) { envchar = environ[i]; namechar = name; while (*namechar && (*namechar == *envchar)) { namechar++; envchar++; } found = (*namechar == '\0' && *envchar == '='); } return (found ? i - 1 : -1); } static int newenv () { register char **env, *elem; register int i, esize; for (i = 0; environ[i]; i++); esize = i + EXTRASIZE + 1; env = (char **) malloc (esize * sizeof (elem)); if (env == 0) return (-1); for (i = 0; environ[i]; i++) { elem = malloc (strlen (environ[i]) + 1); if (elem == 0) return (-1); env[i] = elem; strcpy (elem, environ[i]); } env[i] = 0; environ = env; envsize = esize; return (0); } static int moreenv () { register int esize; register char **env; esize = envsize + EXTRASIZE; env = (char **) realloc (environ, esize * sizeof (*env)); if (env == 0) return (-1); environ = env; envsize = esize; return (0); } /* * wopen: Open a file for world access. */ FILE *wopen(fname, mode) char *fname, *mode; { int oldmask; FILE *newlog; oldmask = umask (0111); newlog = fopen (fname, mode); umask (oldmask); return (newlog); } /* * fexists: return a boolean if the named file exists */ fexists (fn) char *fn; { struct stat pbuf; return (stat (fn, &pbuf) == 0); } /* * filelength: Do a stat and return the length of a file. */ int filelength (f) { struct stat sbuf; if (stat (f, &sbuf) == 0) return (sbuf.st_size); else return (-1); } /* * critical: Disable interrupts */ static int (*hstat)(), (*istat)(), (*qstat)(); critical () { hstat = signal (SIGHUP, SIG_IGN); istat = signal (SIGINT, SIG_IGN); qstat = signal (SIGQUIT, SIG_IGN); } /* * uncritical: Enable interrupts */ uncritical () { signal (SIGHUP, hstat); signal (SIGINT, istat); signal (SIGQUIT, qstat); } /* * reset_int: Set all interrupts to default */ reset_int () { signal (SIGHUP, SIG_DFL); signal (SIGINT, SIG_DFL); signal (SIGQUIT, SIG_DFL); } /* * int_exit: Set up a function to call if we get an interrupt */ int_exit (exitproc) int (*exitproc)(); { if (signal (SIGINT, SIG_IGN) != SIG_IGN) signal (SIGINT, exitproc); if (signal (SIGPIPE, SIG_IGN) != SIG_IGN) signal (SIGPIPE, exitproc); if (signal (SIGQUIT, SIG_IGN) != SIG_IGN) signal (SIGQUIT, exitproc); } /* * lock_file: lock a file for a maximum number of seconds. * Based on the method used in Rogue 5.2. */ # define NOWRITE 0 lock_file (lokfil, maxtime) char *lokfil; int maxtime; { int try; struct stat statbuf; time_t time (); start: if (creat (lokfil, NOWRITE) > 0) return TRUE; for (try = 0; try < 60; try++) { sleep (1); if (creat (lokfil, NOWRITE) > 0) return TRUE; } if (stat (lokfil, &statbuf) < 0) { creat (lokfil, NOWRITE); return TRUE; } if (time (NULL) - statbuf.st_mtime > maxtime) { if (unlink (lokfil) < 0) return FALSE; goto start; } else return FALSE; } /* * unlock_file: Unlock a lock file. */ unlock_file (lokfil) char *lokfil; { unlink (lokfil); } /* * quit: Defined for compatibility with Berkeley 4.2 system */ quit (code, fmt, a1, a2, a3, a4) int code, a1, a2, a3, a4; char *fmt; { fprintf (stderr, fmt, a1, a2, a3, a4); exit (code); }