syslog.c
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:6k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. #include "port.h"
  2. /*
  3.  * Copyright (c) 1983, 1988 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the University of
  17.  * California, Berkeley and its contributors.
  18.  * 4. Neither the name of the University nor the names of its contributors
  19.  *    may be used to endorse or promote products derived from this software
  20.  *    without specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  */
  34. #if defined(LIBC_SCCS) && !defined(lint)
  35. static char sccsid[] = "@(#)syslog.c 5.34 (Berkeley) 6/26/91";
  36. #endif /* LIBC_SCCS and not lint */
  37. #include <sys/types.h>
  38. #include <sys/socket.h>
  39. #include <fcntl.h>
  40. #include <netinet/in.h>
  41. #include <sys/file.h>
  42. #include <syslog.h>
  43. #include <sys/uio.h>
  44. #include <errno.h>
  45. #include <netdb.h>
  46. #include <string.h>
  47. #include <stdarg.h>
  48. #include <time.h>
  49. #include <unistd.h>
  50. #include <stdio.h>
  51. #ifndef _PATH_LOG
  52. #define _PATH_LOG "/dev/log"
  53. #endif
  54. #ifndef _PATH_CONSOLE
  55. #define _PATH_CONSOLE "/dev/console"
  56. #endif
  57. #define PORT_SYSLOG 514 /* default port */
  58. char*     index(const char*, int);
  59. static int LogFile = -1; /* fd for log */
  60. static int connected; /* have done connect */
  61. static int LogStat = 0; /* status bits, set by openlog() */
  62. static const char *LogTag = "syslog"; /* string to tag the entry with */
  63. static int LogFacility = LOG_USER; /* default facility code */
  64. static int LogMask = 0xff; /* mask of priorities to be logged */
  65. /*
  66.  * syslog, vsyslog --
  67.  * print message on log file; output is intended for syslogd(8).
  68.  */
  69. void
  70. syslog(int pri, const char *fmt, ...)
  71. {
  72. va_list ap;
  73. va_start(ap, fmt);
  74. vsyslog(pri, fmt, ap);
  75. va_end(ap);
  76. }
  77. void
  78. vsyslog(int pri, register const char* fmt, va_list ap)
  79. {
  80. register int cnt;
  81. register char *p;
  82. time_t now, time();
  83. int fd, saved_errno;
  84. char tbuf[2048], fmt_cpy[1024], *stdp, *ctime();
  85. /* check for invalid bits or no priority set */
  86. if (!LOG_PRI(pri) || (pri &~ (LOG_PRIMASK|LOG_FACMASK)) ||
  87.     !(LOG_MASK(LOG_PRI(pri)) & LogMask))
  88. return;
  89. saved_errno = errno;
  90. /* set default facility if none specified */
  91. if ((pri & LOG_FACMASK) == 0)
  92. pri |= LogFacility;
  93. /* build the message */
  94. (void)time(&now);
  95. (void)snprintf(tbuf, sizeof(tbuf), "<%d>%.15s ", pri, ctime(&now) + 4);
  96. for (p = tbuf; *p; ++p);
  97. if (LogStat & LOG_PERROR)
  98. stdp = p;
  99. if (LogTag) {
  100. (void)strcpy(p, LogTag);
  101. for (; *p; ++p);
  102. }
  103. if (LogStat & LOG_PID) {
  104. (void)snprintf(p, tbuf + sizeof(tbuf) - p, "[%d]", getpid());
  105. for (; *p; ++p);
  106. }
  107. if (LogTag) {
  108. *p++ = ':';
  109. *p++ = ' ';
  110. }
  111. /* substitute error message for %m */
  112. {
  113. register char ch, *t1, *t2;
  114. char *strerror();
  115. for (t1 = fmt_cpy; ch = *fmt; ++fmt)
  116. if (ch == '%' && fmt[1] == 'm') {
  117. ++fmt;
  118. for (t2 = strerror(saved_errno);
  119.     *t1 = *t2++; ++t1);
  120. }
  121. else
  122. *t1++ = ch;
  123. *t1 = '';
  124. }
  125. (void)vsnprintf(p, tbuf + sizeof(tbuf) - p, fmt_cpy, ap);
  126. cnt = strlen(tbuf);
  127. /* output to stderr if requested */
  128. if (LogStat & LOG_PERROR) {
  129. struct iovec iov[2];
  130. register struct iovec *v = iov;
  131. v->iov_base = stdp;
  132. v->iov_len = cnt - (stdp - tbuf);
  133. ++v;
  134. v->iov_base = "n";
  135. v->iov_len = 1;
  136. (void)writev(STDERR_FILENO, iov, 2);
  137. }
  138. /* get connected, output the message to the local logger */
  139. if (!connected)
  140. openlog(LogTag, LogStat | LOG_NDELAY, 0);
  141. if (send(LogFile, tbuf, cnt, 0) >= 0)
  142. return;
  143. /* see if should attempt the console */
  144. if (!(LogStat&LOG_CONS))
  145. return;
  146. /*
  147.  * Output the message to the console; don't worry about blocking,
  148.  * if console blocks everything will.  Make sure the error reported
  149.  * is the one from the syslogd failure.
  150.  */
  151. if ((fd = open(_PATH_CONSOLE, O_WRONLY, 0)) >= 0) {
  152. (void)strcat(tbuf, "rn");
  153. cnt += 2;
  154. p = index(tbuf, '>') + 1;
  155. (void)write(fd, p, cnt - (p - tbuf));
  156. (void)close(fd);
  157. }
  158. }
  159. static struct sockaddr SyslogAddr; /* address of local logger */
  160. void
  161. openlog(const char* ident, int logstat, int logfac)
  162. {
  163. if (ident != NULL)
  164. LogTag = ident;
  165. LogStat = logstat;
  166. if (logfac != 0 && (logfac &~ LOG_FACMASK) == 0)
  167. LogFacility = logfac;
  168. if (LogFile == -1) {
  169. if (LogStat & LOG_NDELAY) {
  170. #ifdef AF_UNIX
  171. if (LogFile == -1) {
  172. SyslogAddr.sa_family = AF_UNIX;
  173. (void) strncpy(SyslogAddr.sa_data, _PATH_LOG,
  174.     sizeof(SyslogAddr.sa_data));
  175. LogFile = socket(AF_UNIX, SOCK_DGRAM, 0);
  176. }
  177. #endif
  178. #ifdef AF_INET
  179. if (LogFile == -1) {
  180. struct servent* sp =
  181.     getservbyname("syslog", "udp");
  182. struct sockaddr_in* sin =
  183.     (struct sockaddr_in*) &SyslogAddr;
  184. sin->sin_family = AF_INET;
  185. if (sp)
  186. sin->sin_port = sp->s_port;
  187. else
  188. sin->sin_port = htons(PORT_SYSLOG);
  189. sin->sin_addr.s_addr = htonl(INADDR_ANY);
  190. LogFile = socket(AF_INET, SOCK_DGRAM, 0);
  191. }
  192. #endif
  193. if (LogFile == -1)
  194. return;
  195. (void) fcntl(LogFile, F_SETFD, 1);
  196. }
  197. }
  198. if (LogFile != -1 && !connected)
  199. if (connect(LogFile, &SyslogAddr, sizeof(SyslogAddr)) == -1) {
  200. (void)close(LogFile);
  201. LogFile = -1;
  202. } else
  203. connected = 1;
  204. }
  205. void
  206. closelog()
  207. {
  208. (void)close(LogFile);
  209. LogFile = -1;
  210. connected = 0;
  211. }
  212. /* setlogmask -- set the log mask level */
  213. int
  214. setlogmask(int pmask)
  215. {
  216. int omask;
  217. omask = LogMask;
  218. if (pmask != 0)
  219. LogMask = pmask;
  220. return (omask);
  221. }