/* * $Source$ * $Author$ * $Header$ * * * Utility functions used by the DCM. * * (c) Copyright 1987, 1988 by the Massachusetts Institute of Technology. * For copying and distribution information, please see the file * . */ #ifndef lint static char *rcsid_utils_c = "$Header$"; #endif lint #include #include #include #include #include #include #include #include #include #include #include #include #include "dcm.h" int dbg = 0; int log_flags; extern char *strsave(); void dcm_com_err_hook(whoami, code, fmt, pvar) char *whoami; int code; char *fmt; caddr_t pvar; { if (whoami) { fputs(whoami, stderr); fputs(": ", stderr); } if (code) { fputs(error_message(code), stderr); } if (fmt) { _doprnt(fmt, pvar, stderr); } putc('\n', stderr); fflush(stderr); } void leave(s) char *s; { extern int errno; if (*s) com_err(whoami, errno, "%s: exiting", s); else com_err(whoami, errno, "exiting"); exit(errno); } void scream(argc, argv, hint) int argc; char **argv; int hint; { leave("Programmer botch"); } char *itoa(i) int i; { char buf[20]; sprintf(buf, "%d", i); return(strsave(buf)); } char *tkt_string() { return("/tmp/tkt_dcm"); } int maybe_lock_update(host, service, exclusive) char *host, *service; int exclusive; { char lock[BUFSIZ]; int fd; flock_t fl; sprintf(lock, "%s/%s.%s", LOCK_DIR, host, service); fl.l_type = exclusive ? F_WRLCK : F_RDLCK; fl.l_whence = fl.l_start = fl.l_len = 0; if ((fd = open(lock, O_TRUNC | O_CREAT | O_RDWR, 0)) < 0) com_err(whoami, errno, ": maybe_lock_update: opening %s", lock); else if (fcntl(fd, F_SETLK, &fl) != 0) { if (errno != EAGAIN) com_err(whoami, errno, ": maybe_lock_update: flock"); else if (dbg & DBG_VERBOSE) com_err(whoami, 0, "%s already locked\n", lock); close(fd); return -1; } else if (dbg & DBG_VERBOSE) com_err(whoami, 0, "%s now locked\n", lock); return fd; }