]> git.saurik.com Git - apple/launchd.git/blobdiff - launchd/src/launchproxy.c
launchd-329.3.1.tar.gz
[apple/launchd.git] / launchd / src / launchproxy.c
index 039c81afc3c0a60959b92f52117de72b8070e4ec..3a909359607182c8f7dca676f337b54b186724af 100644 (file)
  * 
  * @APPLE_APACHE_LICENSE_HEADER_END@
  */
+#include "config.h"
+#if HAVE_SECURITY
 #include <Security/Authorization.h>
 #include <Security/AuthorizationTags.h>
 #include <Security/AuthSession.h>
+#endif
 #include <sys/types.h>
 #include <sys/select.h>
 #include <sys/event.h>
@@ -40,7 +43,7 @@
 
 #include "launch.h"
 
-#if __GNUC__ >= 4
+#if __GNUC__ >= 4 && HAVE_SECURITY
 OSStatus SessionCreate(SessionCreationFlags flags, SessionAttributeBits attributes) __attribute__((weak));
 #endif
 
@@ -48,12 +51,12 @@ static int kq = 0;
 
 static void find_fds(launch_data_t o, const char *key __attribute__((unused)), void *context __attribute__((unused)))
 {
-        struct kevent kev;
-        size_t i;
+       struct kevent kev;
+       size_t i;
        int fd;
 
-        switch (launch_data_get_type(o)) {
-        case LAUNCH_DATA_FD:
+       switch (launch_data_get_type(o)) {
+       case LAUNCH_DATA_FD:
                fd = launch_data_get_fd(o);
                if (-1 == fd)
                        break;
@@ -61,24 +64,24 @@ static void find_fds(launch_data_t o, const char *key __attribute__((unused)), v
                EV_SET(&kev, fd, EVFILT_READ, EV_ADD, 0, 0, NULL);
                if (kevent(kq, &kev, 1, NULL, 0, NULL) == -1)
                        syslog(LOG_DEBUG, "kevent(%d): %m", fd);
-                break;
-        case LAUNCH_DATA_ARRAY:
-                for (i = 0; i < launch_data_array_get_count(o); i++)
-                        find_fds(launch_data_array_get_index(o, i), NULL, NULL);
-                break;
-        case LAUNCH_DATA_DICTIONARY:
-                launch_data_dict_iterate(o, find_fds, NULL);
-                break;
-        default:
-                break;
-        }
+               break;
+       case LAUNCH_DATA_ARRAY:
+               for (i = 0; i < launch_data_array_get_count(o); i++)
+                       find_fds(launch_data_array_get_index(o, i), NULL, NULL);
+               break;
+       case LAUNCH_DATA_DICTIONARY:
+               launch_data_dict_iterate(o, find_fds, NULL);
+               break;
+       default:
+               break;
+       }
 }
 
 int main(int argc __attribute__((unused)), char *argv[])
 {
        struct timespec timeout = { 10, 0 };
        struct sockaddr_storage ss;
-       socklen_t slen = sizeof(ss);
+       socklen_t slen = (socklen_t)sizeof ss;
        struct kevent kev;
        int r, ec = EXIT_FAILURE;
        launch_data_t tmp, resp, msg = launch_data_alloc(LAUNCH_DATA_STRING);
@@ -108,7 +111,7 @@ int main(int argc __attribute__((unused)), char *argv[])
 
        tmp = launch_data_dict_lookup(resp, LAUNCH_JOBKEY_TIMEOUT);
        if (tmp)
-               timeout.tv_sec = launch_data_get_integer(tmp);
+               timeout.tv_sec = (int)launch_data_get_integer(tmp);
 
        tmp = launch_data_dict_lookup(resp, LAUNCH_JOBKEY_PROGRAM);
        if (tmp)
@@ -140,40 +143,47 @@ int main(int argc __attribute__((unused)), char *argv[])
                }
 
                if (w) {
-                       dup2(kev.ident, STDIN_FILENO);
+                       dup2((int)kev.ident, STDIN_FILENO);
                        if (dupstdout)
-                               dup2(kev.ident, STDOUT_FILENO);
+                               dup2((int)kev.ident, STDOUT_FILENO);
                        if (dupstderr)
-                               dup2(kev.ident, STDERR_FILENO);
+                               dup2((int)kev.ident, STDERR_FILENO);
                        execv(prog, argv + 1);
                        syslog(LOG_ERR, "execv(): %m");
                        exit(EXIT_FAILURE);
                }
 
-               if ((r = accept(kev.ident, (struct sockaddr *)&ss, &slen)) == -1) {
+               if ((r = accept((int)kev.ident, (struct sockaddr *)&ss, &slen)) == -1) {
                        if (errno == EWOULDBLOCK)
                                continue;
-                       syslog(LOG_DEBUG, "accept(): %m");
+                       syslog(LOG_WARNING, "accept(): %m");
                        goto out;
                } else {
-                       char fromhost[NI_MAXHOST];
-                       char fromport[NI_MAXSERV];
-                       int gni_r;
-
-                       gni_r = getnameinfo((struct sockaddr *)&ss, slen,
-                                       fromhost, sizeof(fromhost),
-                                       fromport, sizeof(fromport),
-                                       NI_NUMERICHOST | NI_NUMERICSERV);
-
-                       if (gni_r) {
-                               syslog(LOG_WARNING, "%s: getnameinfo(): %s", prog, gai_strerror(gni_r));
+                       if (ss.ss_family == AF_INET || ss.ss_family == AF_INET6) {
+                               char fromhost[NI_MAXHOST];
+                               char fromport[NI_MAXSERV];
+                               int gni_r;
+
+                               gni_r = getnameinfo((struct sockaddr *)&ss, slen,
+                                               fromhost, (socklen_t) sizeof fromhost,
+                                               fromport, (socklen_t) sizeof fromport,
+                                               NI_NUMERICHOST | NI_NUMERICSERV);
+
+                               if (gni_r) {
+                                       syslog(LOG_WARNING, "%s: getnameinfo(): %s", prog, gai_strerror(gni_r));
+                               } else {
+                                       syslog(LOG_INFO, "%s: Connection from: %s on port: %s", prog, fromhost, fromport);
+                               }
                        } else {
-                               syslog(LOG_INFO, "%s: Connection from: %s on port: %s", prog, fromhost, fromport);
+                               syslog(LOG_WARNING, "%s: getnameinfo() only supports IPv4/IPv6. Connection from address family: %u", prog, ss.ss_family);
                        }
 
                        switch (fork()) {
                        case -1:
                                syslog(LOG_WARNING, "fork(): %m");
+                               if( errno != ENOMEM ) {
+                                       continue;
+                               }
                                goto out;
                        case 0:
                                break;
@@ -182,6 +192,9 @@ int main(int argc __attribute__((unused)), char *argv[])
                                continue;
                        }
 
+                       setpgid(0, 0);
+
+#if HAVE_SECURITY
                        if ((tmp = launch_data_dict_lookup(resp, LAUNCH_JOBKEY_SESSIONCREATE)) && launch_data_get_bool(tmp)) {
                                if (SessionCreate) {
                                        OSStatus scr = SessionCreate(0, 0);
@@ -191,7 +204,9 @@ int main(int argc __attribute__((unused)), char *argv[])
                                        syslog(LOG_NOTICE, "%s: SessionCreate == NULL!", prog);
                                }
                        }
+#endif
                        fcntl(r, F_SETFL, 0);
+                       fcntl(r, F_SETFD, 1);
                        dup2(r, STDIN_FILENO);
                        if (dupstdout)
                                dup2(r, STDOUT_FILENO);