📄 sco.c
字号:
/**************************************************************************** Copyright (c) 1999,2000 WU-FTPD Development Group. All rights reserved. Portions Copyright (c) 1980, 1985, 1988, 1989, 1990, 1991, 1993, 1994 The Regents of the University of California. Portions Copyright (c) 1993, 1994 Washington University in Saint Louis. Portions Copyright (c) 1996, 1998 Berkeley Software Design, Inc. Portions Copyright (c) 1989 Massachusetts Institute of Technology. Portions Copyright (c) 1998 Sendmail, Inc. Portions Copyright (c) 1983, 1995, 1996, 1997 Eric P. Allman. Portions Copyright (c) 1997 by Stan Barber. Portions Copyright (c) 1997 by Kent Landfield. Portions Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. Use and distribution of this software and its source code are governed by the terms and conditions of the WU-FTPD Software License ("LICENSE"). If you did not receive a copy of the license, it may be obtained online at http://www.wu-ftpd.org/license.html. $Id: sco.c,v 1.7 2000/07/01 18:36:29 wuftpd Exp $ ****************************************************************************/#ifndef _SCO_DS /* none of this is required on SCO OpenServer 5 *//* Written in 1992, 1993 by Eduard Vopicka, Prague University of Economics */#include "../src/config.h"#include <sys/types.h>#include <stdio.h>#include <fcntl.h>#include <sys/immu.h>#include <sys/dir.h> /* required by <sys/user.h> */#include <sys/user.h>#include <sys/signal.h>#include <sys/fs/s5param.h>#include <string.h>#include <syslog.h>#include <sys/stat.h>#include <varargs.h>static int KmemFd = -1;kmem_open(){ if (KmemFd < 0 && (KmemFd = open("/dev/kmem", O_RDWR, 0)) < 0) { syslog(LOG_EMERG, "kmem open failed: %m"); exit(1); }}int wrub(addr, off, len) char *addr; off_t off; int len;{ off_t seek_off = UVUBLK + off; kmem_open(); /* make sure it is open */ if (lseek(KmemFd, (char *) seek_off, SEEK_SET) != seek_off) { syslog(LOG_EMERG, "lseek failed on /dev/kmem: %m"); exit(1); } if (write(KmemFd, addr, len) != len) { syslog(LOG_EMERG, "write failed on /dev/kmem: %m"); exit(1); } return (0);}/* UHUHUH, this crazy code is still required for 3.2v4.2 */uid_tseteuid(id) uid_t id;{ struct user u; return (wrub(&id, (off_t) & u.u_uid - (off_t) & u, sizeof(id)));}uid_tsetruid(id) uid_t id;{ struct user u; return (wrub(&id, (off_t) & u.u_ruid - (off_t) & u, sizeof(id)));}uid_tsetegid(id) uid_t id;{ struct user u; return (wrub(&id, (off_t) & u.u_gid - (off_t) & u, sizeof(id)));}uid_tsetrgid(id) uid_t id;{ struct user u; return (wrub(&id, (off_t) & u.u_rgid - (off_t) & u, sizeof(id)));}uid_tsetuid(id) uid_t id;{ (void) seteuid(id); (void) setruid(id); return (0);}uid_tsetgid(id) uid_t id;{ (void) setegid(id); (void) setrgid(id); return (0);}uid_tsetreuid(ruid, euid) uid_t ruid, euid;{ if (ruid != 0xffff) (void) setruid(ruid); if (euid != 0xffff) (void) seteuid(euid); return (0);}/* * Copyright (c) 1989, 1991 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(SYSLOGFILE)#include <sys/types.h>#include <sys/file.h>#include <sys/signal.h>#include <sys/syslog.h>#include <sys/uio.h>#include <fcntl.h>#include <varargs.h>#include <stdio.h>#include <string.h>#include <strings.h>#ifndef CONSOLE#define CONSOLE "/dev/console"#endifstatic int LogFile = -1; /* fd for log */static int LogStat = 0; /* status bits, set by openlog() */static char *LogTag = "syslog"; /* string to tag the entry with */static int LogFacility = LOG_USER; /* default facility code */static int LogMask = 0xff; /* mask of priorities to be logged */syslog(va_alist) va_dcl{ va_list args; int pri; char *fmt; va_start(args); pri = va_arg(args, int); fmt = va_arg(args, char *); vsyslog(pri, fmt, args); va_end(args);}vsyslog(pri, fmt, ap) int pri; register char *fmt; va_list ap;{ extern int errno; register int cnt; register char *p; time_t now, time(); int pid, saved_errno; char tbuf[2048], fmt_cpy[1024], *stdp, *ctime(); sigset_t newmask, oldmask; saved_errno = errno;#ifndef LOG_FAC#define LOG_FAC(pri) (((pri) & LOG_FACMASK) >> 3)#endif#ifndef LOG_PRI#define LOG_PRI(pri) ((pri) & LOG_PRIMASK)#endif /* see if we should just throw out this message */ if ((u_int) LOG_FAC(pri) >= (1 << LOG_NFACILITIES) || (!(LOG_MASK(LOG_PRI(pri)) & LogMask)) || (pri & ~(LOG_PRIMASK | LOG_FACMASK))) return; if (LogFile < 0) openlog(LogTag, LogStat | LOG_NDELAY, 0); /* set default facility if none specified */ if ((pri & LOG_FACMASK) == 0) pri |= LogFacility; /* build the message */ (void) time(&now); (void) sprintf(tbuf, "<%d>%.15s ", pri, ctime(&now) + 4);/**//* (void)sprintf(tbuf, "%3o %.15s ", pri, ctime(&now) + 4); /**/ for (p = tbuf; *p; ++p);#ifndef LOG_PERROR#define LOG_PERROR 0x20#endif if (LogStat & LOG_PERROR) stdp = p; if (LogTag) { (void) strcpy(p, LogTag); for (; *p; ++p); } if (LogStat & LOG_PID) { (void) sprintf(p, "[%d]", getpid()); for (; *p; ++p); } if (LogTag) { *p++ = ':'; *p++ = ' '; } /* substitute error message for %m */ { register char ch, *t1, *t2;/* char *strerror(); /* */ for (t1 = fmt_cpy; ch = *fmt; ++fmt) if (ch == '%' && fmt[1] == 'm') { ++fmt; for (t2 = strerror(saved_errno); *t1 = *t2++; ++t1); } else *t1++ = ch; *t1 = '\0'; } (void) vsprintf(p, fmt_cpy, ap); cnt = strlen(tbuf); tbuf[cnt++] = '\n'; /* output to stderr if requested */ if (LogStat & LOG_PERROR) write(2, stdp, cnt - (stdp - tbuf)); /* output the message to the local logger */ if (write(LogFile, tbuf, cnt) == cnt) return; /* output the message to the console */ pid = vfork(); if (pid == -1) return; if (pid == 0) { int fd; int saveerrno; sigfillset(&newmask); sigdelset(&newmask, SIGALRM); (void) sigprocmask(SIG_SETMASK, &newmask, &oldmask); (void) signal(SIGALRM, SIG_DFL); (void) alarm((u_int) 5); fd = open(CONSOLE, O_WRONLY, 0); saveerrno = errno; (void) alarm((u_int) 0); errno = saveerrno; if (fd < 0) return; (void) strcat(tbuf, "\r"); p = index(tbuf, '>') + 1; (void) write(fd, p, cnt + 1 - (p - tbuf)); (void) close(fd); _exit(0); } if (!(LogStat & LOG_NOWAIT)) while ((cnt = wait((int *) 0)) > 0 && cnt != pid);}/* * OPENLOG -- open system log */openlog(ident, logstat, logfac) char *ident; int logstat, logfac;{ if (ident != NULL) LogTag = ident; LogStat = logstat; if (logfac != 0 && (logfac & ~LOG_FACMASK) == 0) LogFacility = logfac; if (LogFile == -1) { LogFile = open(SYSLOGFILE, O_WRONLY | O_APPEND | O_SYNC); /**//* LogFile = open(SYSLOGFILE, O_WRONLY|O_APPEND); /**/ }}/* * CLOSELOG -- close the system log */closelog(){ (void) close(LogFile); LogFile = -1;}/* * SETLOGMASK -- set the log mask level */setlogmask(pmask) int pmask;{ int omask; omask = LogMask; if (pmask != 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -