From: Ben Gras Date: Mon, 31 Oct 2005 14:31:05 +0000 (+0000) Subject: Giovanni's symlink (+syslog+flock) patches. X-Git-Tag: v3.1.2a~536 X-Git-Url: http://zhaoyanbai.com/repos/%22https:/www.google.com/jsapi/static/mdoc.3.html?a=commitdiff_plain;h=b94a639398af72a8058c5d6ed015d32b3f640e64;p=minix.git Giovanni's symlink (+syslog+flock) patches. --- diff --git a/lib/other/Makefile b/lib/other/Makefile index afb7f116b..b77275814 100755 --- a/lib/other/Makefile +++ b/lib/other/Makefile @@ -28,6 +28,7 @@ libc_OBJECTS = \ errno.o \ fdopen.o \ ffs.o \ + flock.o \ fslib.o \ fsversion.o \ getgrent.o \ @@ -61,11 +62,12 @@ libc_OBJECTS = \ swab.o \ syscall.o \ sysconf.o \ + syslog.o \ telldir.o \ termcap.o \ ttyname.o \ ttyslot.o \ v8regexp.o \ - v8regsub.o \ + v8regsub.o include ../Makefile.inc diff --git a/lib/other/flock.c b/lib/other/flock.c new file mode 100644 index 000000000..5535a6dd8 --- /dev/null +++ b/lib/other/flock.c @@ -0,0 +1,32 @@ + +/* Library routines + * + * Porting to Minix 2.0.0 + * Author: Giovanni Falzoni + * + * $Id$ + */ +#include +#include +#include +#include +#include + +/* + * Name: int flock(int fd, int mode); + * Function: Implements the flock function in Minix. + */ +int flock(int fd, int mode) +{ + struct flock lck; + register int retcode; + + memset((void *) &lck, 0, sizeof(struct flock)); + lck.l_type = mode & ~LOCK_NB; + lck.l_pid = getpid(); + if ((retcode = fcntl(fd, mode & LOCK_NB ? F_SETLK : F_SETLKW, &lck)) < 0 && errno == EAGAIN) + errno = EWOULDBLOCK; + return retcode; +} + +/** flock.c **/ diff --git a/lib/other/syslog.c b/lib/other/syslog.c new file mode 100644 index 000000000..9d8048c19 --- /dev/null +++ b/lib/other/syslog.c @@ -0,0 +1,172 @@ +/* Copyright (c) 1983, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * #if defined(LIBC_SCCS) && !defined(lint) + * static char sccsid[] = "@(#)syslog.c 8.4 (Berkeley) 3/18/94"; + * #endif + * + * Author: Eric Allman + * Modified to use UNIX domain IPC by Ralph Campbell + * Patched March 12, 1996 by A. Ian Vogelesang + * Rewritten by Martin Mares on May 14, 1997 + * Rewritten by G. Falzoni for porting to Minix + * + * $Log$ + * Revision 1.1 2005/10/31 14:31:05 beng + * Giovanni's symlink (+syslog+flock) patches. + * + * Revision 1.2 2001/01/04 11:54:26 root + * Removed variable to store PID which is computed + * at each call to avoid reporting parent's pid. + * + * $Id$ + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int nfd = (-1); +static int LogFacility = LOG_USER; +static int LogFlags = 0; +static char TagBuffer[40] = "syslog"; + +/* +** OPENLOG -- open system log +** - establishes a channel to syslogd using UDP device +** (port 514 is used _ syslog/udp) +** - stores program tag (if not NULL) and other options +** for use by syslog +*/ +void openlog(const char *ident, int option, int facility) +{ + struct nwio_udpopt udpopt; + + /* Stores logging flags */ + LogFlags = option & (LOG_PID | LOG_PERROR | LOG_CONS); + /* Stores the requested facility */ + LogFacility = facility; + /* Stores log tag if supplied */ + if (ident != NULL && *ident != '0' && ident != TagBuffer) { + strncpy(TagBuffer, ident, sizeof(TagBuffer)); + TagBuffer[sizeof(TagBuffer) - 1] = '0'; + } + + /* Opens channel to syslog daemon via UDP device */ + /* Static values used to minimize code */ + if (option & LOG_NDELAY) { + /* Opens UDP device */ + if ((nfd = open(UDP_DEVICE, O_RDWR)) < 0) { + /* Report error */ ; + } + /* Sets options for UDP device */ + udpopt.nwuo_flags = NWUO_SHARED | NWUO_LP_SET | NWUO_DI_LOC | + NWUO_DI_BROAD | NWUO_RP_SET | NWUO_RA_SET | + NWUO_RWDATONLY | NWUO_DI_IPOPT; + udpopt.nwuo_locaddr = udpopt.nwuo_remaddr = htonl(0x7F000001L); + udpopt.nwuo_locport = udpopt.nwuo_remport = htons(514); + if (ioctl(nfd, NWIOSUDPOPT, &udpopt) < 0 || + ioctl(nfd, NWIOGUDPOPT, &udpopt) < 0) { + /* Report error */ ; + } + } + return; +} + +/* +** SYSLOG -- print message on log file +** +** This routine looks a lot like printf, except that it outputs to the +** log file instead of the standard output. Also: +** - adds a timestamp, +** - prints the module name in front of the message, +** - has some other formatting types (or will sometime), +** - adds a newline on the end of the message. +** +** The output of this routine is intended to be read by syslogd(8). +*/ +void syslog(int lprty, const char *msg,...) +{ + time_t now; + char buff[512]; + int len, rc; + va_list ap; + + /* First log message opens a channel to syslog */ + if (nfd < 0) openlog(TagBuffer, LogFlags | LOG_NDELAY, LogFacility); + time(&now); + len = sprintf(buff, "<%d>%.15s %s: ", + LogFacility | lprty, ctime(&now) + 4, TagBuffer); + if (LogFlags & LOG_PID) { + len -= 2; + len += sprintf(buff + len, "[%d]: ", getpid()); + } + va_start(ap, msg); + len += vsprintf(buff + len, msg, ap); + va_end(ap); + rc = write(nfd, buff, len); + if ((rc != len && LogFlags & LOG_CONS) || LogFlags & LOG_PERROR) { + write(STDERR_FILENO, buff, len); + write(STDERR_FILENO, "\n", 1); + } + return; +} + +/* +** CLOSELOG -- close access to syslogd +** - closes UDP channel +** - restores default values +*/ +void closelog(void) +{ + + close(nfd); + nfd = -1; + LogFacility = LOG_USER; + LogFlags = 0; + return; +} + +/** syslog.c **/