|
|
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 l
Length: 8925 (0x22dd)
Types: TextFile
Names: »logger.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/compat/logger.c«
/* logger.c - system logging routines */
#ifndef lint
static char *rcsid = "$Header: /f/osi/compat/RCS/logger.c,v 6.0 89/03/18 23:25:23 mrose Rel $";
#endif
/*
* $Header: /f/osi/compat/RCS/logger.c,v 6.0 89/03/18 23:25:23 mrose Rel $
*
*
* $Log: logger.c,v $
* Revision 6.0 89/03/18 23:25:23 mrose
* Release 5.0
*
*/
/*
* NOTICE
*
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
* this agreement.
*
*/
/* LINTLIBRARY */
#include <stdio.h>
#include <varargs.h>
#include "general.h"
#include "manifest.h"
#include "logger.h"
#include "tailor.h"
#ifdef NULL
#undef NULL
#endif
#include <sys/param.h>
#ifndef NULL
#define NULL 0
#endif
#ifdef BSD42
#include <sys/file.h>
#endif
#ifdef SYS5
#include <fcntl.h>
#endif
#include <sys/stat.h>
#ifndef BSD42
#include <time.h>
#else
#ifndef timerisset
#include <sys/time.h>
#endif
#endif
#ifndef SYS5
#include <syslog.h>
#endif
/* \f
*/
long lseek (), time ();
/* \f
*/
int ll_open (lp)
register LLog *lp;
{
int mask,
mode;
char *bp,
buffer[BUFSIZ];
struct stat st;
if (lp -> ll_file == NULLCP
|| *lp -> ll_file == NULL
|| ll_check (lp) == NOTOK) {
(void) ll_close (lp);
lp -> ll_stat |= LLOGERR;
return NOTOK;
}
lp -> ll_stat &= ~LLOGERR;
if (lp -> ll_fd != NOTOK)
return OK;
if (strcmp (lp -> ll_file, "-") == 0) {
lp -> ll_stat |= LLOGTTY;
return OK;
}
(void) sprintf (bp = buffer, _isodefile (isodelogs, lp -> ll_file),
getpid ());
mode = O_WRONLY | O_APPEND;
if (stat (bp, &st) == NOTOK && (lp -> ll_stat & LLOGCRT))
mode |= O_CREAT;
mask = umask (~0666);
lp -> ll_fd = open (bp, mode, 0666);
(void) umask (mask);
return (lp -> ll_fd != NOTOK ? OK : NOTOK);
}
/* \f
*/
int ll_close (lp)
register LLog *lp;
{
int status;
if (lp -> ll_fd == NOTOK)
return OK;
status = close (lp -> ll_fd);
lp -> ll_fd = NOTOK;
return status;
}
/* \f
*/
#ifndef lint
int ll_log (va_alist)
va_dcl
{
int event,
result;
LLog *lp;
va_list ap;
va_start (ap);
lp = va_arg (ap, LLog *);
event = va_arg (ap, int);
result = _ll_log (lp, event, ap);
va_end (ap);
return result;
}
#else
/* VARARGS4 */
int ll_log (lp, event, what, fmt)
LLog *lp;
int event;
char *what,
*fmt;
{
return ll_log (lp, event, what, fmt);
}
#endif
/* \f
*/
int _ll_log (lp, event, ap) /* what, fmt, args ... */
register LLog *lp;
int event;
va_list ap;
{
int cc,
status;
long clock;
register char *bp;
char *what,
buffer[BUFSIZ];
register struct tm *tm;
if (!(lp -> ll_events & event))
return OK;
bp = buffer;
(void) time (&clock);
tm = localtime (&clock);
(void) sprintf (bp, "%2d/%2d %2d:%02d:%02d %s %s ",
tm -> tm_mon + 1, tm -> tm_mday,
tm -> tm_hour, tm -> tm_min, tm -> tm_sec,
lp -> ll_hdr ? lp -> ll_hdr : "",
lp -> ll_dhdr ? lp -> ll_dhdr : "");
bp += strlen (bp);
what = va_arg (ap, char *);
_asprintf (bp, what, ap);
#ifndef SYS5
if (lp -> ll_syslog & event) {
int priority;
switch (event) {
case LLOG_FATAL:
priority = LOG_ERR;
break;
case LLOG_EXCEPTIONS:
priority = LOG_WARNING;
break;
case LLOG_NOTICE:
priority = LOG_INFO;
break;
case LLOG_PDUS:
case LLOG_TRACE:
case LLOG_DEBUG:
priority = LOG_DEBUG;
break;
default:
priority = LOG_NOTICE;
break;
}
(void) syslog (priority, "%s", buffer + 13);
if (lp -> ll_stat & LLOGCLS)
(void) closelog ();
}
#endif
if (!(lp -> ll_stat & LLOGTTY)
&& lp -> ll_fd == NOTOK
&& strcmp (lp -> ll_file, "-") == 0)
lp -> ll_stat |= LLOGTTY;
if (lp -> ll_stat & LLOGTTY) {
(void) fflush (stdout);
if (lp -> ll_fd != NOTOK)
(void) fprintf (stderr, "LOGGING: ");
(void) fputs (bp, stderr);
(void) fputc ('\n', stderr);
(void) fflush (stderr);
}
bp += strlen (bp);
if (lp -> ll_fd == NOTOK) {
if ((lp -> ll_stat & (LLOGERR | LLOGTTY)) == (LLOGERR | LLOGTTY))
return OK;
if (ll_open (lp) == NOTOK)
return NOTOK;
}
else
if (ll_check (lp) == NOTOK)
return NOTOK;
*bp++ = '\n', *bp = NULL;
cc = bp - buffer;
if ((status = write (lp -> ll_fd, buffer, cc)) != cc) {
if (status == NOTOK) {
(void) ll_close (lp);
error: ;
lp -> ll_stat |= LLOGERR;
return NOTOK;
}
status = NOTOK;
}
else
status = OK;
if ((lp -> ll_stat & LLOGCLS) && ll_close (lp) == NOTOK)
goto error;
return status;
}
/* \f
*/
void ll_hdinit (lp, prefix)
register LLog *lp;
char *prefix;
{
register char *cp,
*up;
char buffer[BUFSIZ],
user[10];
if (prefix == NULLCP)
cp = "unknown";
else {
if ((cp = rindex (prefix, '/')))
cp++;
if (cp == NULL || *cp == NULL)
cp = prefix;
}
if ((up = getenv ("USER")) == NULLCP
&& (up = getenv ("LOGNAME")) == NULLCP) {
(void) sprintf (user, "#%d", getuid ());
up = user;
}
(void) sprintf (buffer, "%-8.8s %05d (%-8.8s)",
cp, getpid () % 100000, up);
if (lp -> ll_stat & LLOGHDR)
free (lp -> ll_hdr);
lp -> ll_stat &= ~LLOGHDR;
if ((lp -> ll_hdr = malloc ((unsigned) (strlen (buffer) + 1))) == NULLCP)
return;
(void) strcpy (lp -> ll_hdr, buffer);
lp -> ll_stat |= LLOGHDR;
}
/* \f
*/
void ll_dbinit (lp, prefix)
register LLog *lp;
char *prefix;
{
register char *cp;
char buffer[BUFSIZ];
ll_hdinit (lp, prefix);
if (prefix) {
if ((cp = rindex (prefix, '/')))
cp++;
if (cp == NULL || *cp == NULL)
cp = prefix;
(void) sprintf (buffer, "./%s.log", cp);
if ((lp -> ll_file = malloc ((unsigned) (strlen (buffer) + 1)))
== NULLCP)
return;
(void) strcpy (lp -> ll_file, buffer);
}
lp -> ll_events |= LLOG_ALL;
lp -> ll_stat |= LLOGTTY;
}
/* \f
*/
#ifndef lint
int ll_printf (va_alist)
va_dcl
{
int result;
LLog *lp;
va_list ap;
va_start (ap);
lp = va_arg (ap, LLog *);
result = _ll_printf (lp, ap);
va_end (ap);
return result;
}
#else
/* VARARGS2 */
int ll_printf (lp, fmt)
LLog *lp;
char *fmt;
{
return ll_printf (lp, fmt);
}
#endif
/* \f
*/
#ifndef lint
static
#endif
int _ll_printf (lp, ap) /* fmt, args ... */
register LLog *lp;
va_list ap;
{
int cc,
status;
register char *bp;
char buffer[BUFSIZ];
char *fmt;
va_list fp = ap;
fmt = va_arg (fp, char *);
if (strcmp (fmt, "%s") != 0) {
bp = buffer;
_asprintf (bp, NULLCP, ap);
}
else {
bp = NULL;
fmt = va_arg (fp, char *);
}
if (!(lp -> ll_stat & LLOGTTY)
&& lp -> ll_fd == NOTOK
&& strcmp (lp -> ll_file, "-") == 0)
lp -> ll_stat |= LLOGTTY;
if (lp -> ll_stat & LLOGTTY) {
(void) fflush (stdout);
if (bp)
(void) fputs (bp, stderr);
else
(void) fputs (fmt, stderr);
(void) fflush (stderr);
}
if (bp)
bp += strlen (bp);
if (lp -> ll_fd == NOTOK) {
if ((lp -> ll_stat & (LLOGERR | LLOGTTY)) == (LLOGERR | LLOGTTY))
return OK;
if (ll_open (lp) == NOTOK)
return NOTOK;
}
else
if (ll_check (lp) == NOTOK)
return NOTOK;
if (bp)
cc = bp - buffer;
else
cc = strlen (fmt);
if ((status = write (lp -> ll_fd, bp ? buffer : fmt, cc)) != cc) {
if (status == NOTOK) {
(void) ll_close (lp);
lp -> ll_stat |= LLOGERR;
return NOTOK;
}
status = NOTOK;
}
else
status = OK;
return status;
}
/* \f
*/
int ll_sync (lp)
register LLog *lp;
{
if (lp -> ll_stat & LLOGCLS)
return ll_close (lp);
return OK;
}
/* \f
*/
#ifndef lint
char *ll_preset (va_alist)
va_dcl
{
va_list ap;
static char buffer[BUFSIZ];
va_start (ap);
_asprintf (buffer, NULLCP, ap);
va_end (ap);
return buffer;
}
#else
/* VARARGS1 */
char *ll_preset (fmt)
char *fmt;
{
return ll_preset (fmt);
}
#endif
/* \f
*/
int ll_check (lp)
register LLog *lp;
{
#ifndef BSD42
int fd;
#endif
long size;
struct stat st;
if ((size = lp -> ll_msize) <= 0)
return OK;
if (lp -> ll_fd == NOTOK
|| (fstat (lp -> ll_fd, &st) != NOTOK
&& st.st_size < (size <<= 10)))
return OK;
if (!(lp -> ll_stat & LLOGZER)) {
(void) ll_close (lp);
#ifndef BSD42
error: ;
#endif
lp -> ll_stat |= LLOGERR;
return NOTOK;
}
#ifdef BSD42
#ifdef SUNOS4
(void) ftruncate (lp -> ll_fd, (off_t) 0);
#else
(void) ftruncate (lp -> ll_fd, 0);
#endif
(void) lseek (lp -> ll_fd, 0L, 0);
return OK;
#else
(void) ll_close (lp);
if ((fd = open (lp -> ll_file, O_WRONLY | O_APPEND | O_TRUNC)) == NOTOK)
goto error;
(void) close (fd);
return ll_open (lp);
#endif
}