X-Git-Url: https://git.saurik.com/apple/syslog.git/blobdiff_plain/b16a592aee171655b85f8e45c0604c38494ab8ea..a83ff38ad0cc43a63f99b6982a830798989e73bb:/syslogd.tproj/bsd_in.c?ds=sidebyside diff --git a/syslogd.tproj/bsd_in.c b/syslogd.tproj/bsd_in.c index d1ccd50..fa10fd4 100644 --- a/syslogd.tproj/bsd_in.c +++ b/syslogd.tproj/bsd_in.c @@ -1,23 +1,22 @@ /* - * Copyright (c) 2004 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2004-2010 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * - * "Portions Copyright (c) 2004 Apple Computer, Inc. All Rights - * Reserved. This file contains Original Code and/or Modifications of - * Original Code as defined in and that are subject to the Apple Public - * Source License Version 1.0 (the 'License'). You may not use this file - * except in compliance with the License. Please obtain a copy of the - * License at http://www.apple.com/publicsource and read it before using - * this file. + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License." + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. * * @APPLE_LICENSE_HEADER_END@ */ @@ -35,12 +34,13 @@ #include #include "daemon.h" +#define BSD_SOCKET_NAME "BSDSystemLogger" #define MY_ID "bsd_in" -#define MAXLINE 1024 +#define MAXLINE 4096 static int sock = -1; -asl_msg_t * +aslmsg bsd_in_acceptmsg(int fd) { uint32_t len; @@ -54,45 +54,64 @@ bsd_in_acceptmsg(int fd) if (n <= 0) return NULL; line[n] = '\0'; - return asl_syslog_input_convert(line, n, NULL, 0); + + return asl_input_parse(line, n, NULL, SOURCE_BSD_SOCKET); } int bsd_in_init(void) { - struct sockaddr_un sun; int rbufsize; int len; + launch_data_t sockets_dict, fd_array, fd_dict; asldebug("%s: init\n", MY_ID); if (sock >= 0) return sock; - unlink(_PATH_SYSLOG_IN); - sock = socket(AF_UNIX, SOCK_DGRAM, 0); - if (sock < 0) + if (global.launch_dict == NULL) + { + asldebug("%s: launchd dict is NULL\n", MY_ID); + return -1; + } + + sockets_dict = launch_data_dict_lookup(global.launch_dict, LAUNCH_JOBKEY_SOCKETS); + if (sockets_dict == NULL) { - asldebug("%s: couldn't create socket for %s: %s\n", MY_ID, _PATH_SYSLOG_IN, strerror(errno)); + asldebug("%s: launchd lookup of LAUNCH_JOBKEY_SOCKETS failed\n", MY_ID); return -1; } - asldebug("%s: creating %s for fd %d\n", MY_ID, _PATH_SYSLOG_IN, sock); + fd_array = launch_data_dict_lookup(sockets_dict, BSD_SOCKET_NAME); + if (fd_array == NULL) + { + asldebug("%s: launchd lookup of BSD_SOCKET_NAME failed\n", MY_ID); + return -1; + } - memset(&sun, 0, sizeof(sun)); - sun.sun_family = AF_UNIX; - strcpy(sun.sun_path, _PATH_SYSLOG_IN); + len = launch_data_array_get_count(fd_array); + if (len <= 0) + { + asldebug("%s: launchd fd array is empty\n", MY_ID); + return -1; + } - len = sizeof(struct sockaddr_un); - if (bind(sock, (struct sockaddr *)&sun, len) < 0) + if (len > 1) { - asldebug("%s: couldn't bind socket %d for %s: %s\n", MY_ID, sock, _PATH_SYSLOG_IN, strerror(errno)); - close(sock); - sock = -1; + asldebug("%s: warning! launchd fd array has %d sockets\n", MY_ID, len); + } + + fd_dict = launch_data_array_get_index(fd_array, 0); + if (fd_dict == NULL) + { + asldebug("%s: launchd file discriptor array element 0 is NULL\n", MY_ID); return -1; } + sock = launch_data_get_fd(fd_dict); + rbufsize = 128 * 1024; len = sizeof(rbufsize); - + if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rbufsize, len) < 0) { asldebug("%s: couldn't set receive buffer size for socket %d (%s): %s\n", MY_ID, sock, _PATH_SYSLOG_IN, strerror(errno)); @@ -109,23 +128,23 @@ bsd_in_init(void) return -1; } - chmod(_PATH_SYSLOG_IN, 0666); - - return aslevent_addfd(sock, bsd_in_acceptmsg, NULL, NULL); + return aslevent_addfd(SOURCE_BSD_SOCKET, sock, ADDFD_FLAGS_LOCAL, bsd_in_acceptmsg, NULL, NULL); } int -bsd_in_reset(void) +bsd_in_close(void) { + if (sock < 0) return 1; + + aslevent_removefd(sock); + close(sock); + sock = -1; + return 0; } int -bsd_in_close(void) +bsd_in_reset(void) { - if (sock < 0) return 1; - - close(sock); - unlink(_PATH_SYSLOG_IN); return 0; }