int TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret, XtransConnInfo **ciptrs_ret) { char buffer[256]; /* ??? What size ?? */ XtransConnInfo ciptr, temp_ciptrs[NUMTRANS]; int status, i, j; #if defined(IPv6) && defined(AF_INET6) int ipv6_succ = 0; #endif PRMSG (2,"MakeAllCOTSServerListeners(%s,%p)\n", port ? port : "NULL", ciptrs_ret, 0); *count_ret = 0; #ifdef XQUARTZ_EXPORTS_LAUNCHD_FD fprintf(stderr, "Launchd socket fd: %d\n", xquartz_launchd_fd); if(xquartz_launchd_fd != -1) { if((ciptr = TRANS(ReopenCOTSServer(TRANS_SOCKET_LOCAL_INDEX, xquartz_launchd_fd, getenv("DISPLAY"))))==NULL) fprintf(stderr,"Got NULL while trying to Reopen launchd port\n"); else temp_ciptrs[(*count_ret)++] = ciptr; } #endif for (i = 0; i < NUMTRANS; i++) { Xtransport *trans = Xtransports[i].transport; unsigned int flags = 0; if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN) continue; snprintf(buffer, sizeof(buffer), "%s/:%s", trans->TransName, port ? port : ""); PRMSG (5,"MakeAllCOTSServerListeners: opening %s\n", buffer, 0, 0); if ((ciptr = TRANS(OpenCOTSServer(buffer))) == NULL) { if (trans->flags & TRANS_DISABLED) continue; PRMSG (1, "MakeAllCOTSServerListeners: failed to open listener for %s\n", trans->TransName, 0, 0); continue; } #if defined(IPv6) && defined(AF_INET6) if ((Xtransports[i].transport_id == TRANS_SOCKET_INET_INDEX && ipv6_succ)) flags |= ADDR_IN_USE_ALLOWED; #endif if ((status = TRANS(CreateListener (ciptr, port, flags))) < 0) { if (status == TRANS_ADDR_IN_USE) { /* * We failed to bind to the specified address because the * address is in use. It must be that a server is already * running at this address, and this function should fail. */ PRMSG (1, "MakeAllCOTSServerListeners: server already running\n", 0, 0, 0); for (j = 0; j < *count_ret; j++) TRANS(Close) (temp_ciptrs[j]); *count_ret = 0; *ciptrs_ret = NULL; *partial = 0; return -1; } else { PRMSG (1, "MakeAllCOTSServerListeners: failed to create listener for %s\n", trans->TransName, 0, 0); continue; } } #if defined(IPv6) && defined(AF_INET6) if (Xtransports[i].transport_id == TRANS_SOCKET_INET6_INDEX) ipv6_succ = 1; #endif PRMSG (5, "MakeAllCOTSServerListeners: opened listener for %s, %d\n", trans->TransName, ciptr->fd, 0); temp_ciptrs[*count_ret] = ciptr; (*count_ret)++; } *partial = (*count_ret < complete_network_count()); PRMSG (5, "MakeAllCOTSServerListeners: partial=%d, actual=%d, complete=%d \n", *partial, *count_ret, complete_network_count()); if (*count_ret > 0) { if ((*ciptrs_ret = (XtransConnInfo *) xalloc ( *count_ret * sizeof (XtransConnInfo))) == NULL) { return -1; } for (i = 0; i < *count_ret; i++) { (*ciptrs_ret)[i] = temp_ciptrs[i]; } } else *ciptrs_ret = NULL; return 0; }
int TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret, XtransConnInfo **ciptrs_ret) { char buffer[256]; /* ??? What size ?? */ XtransConnInfo ciptr, temp_ciptrs[NUMTRANS]; int status, i, j; PRMSG (2,"MakeAllCOTSServerListeners(%s,%x)\n", port ? port : "NULL", ciptrs_ret, 0); *count_ret = 0; for (i = 0; i < NUMTRANS; i++) { Xtransport *trans = Xtransports[i].transport; if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN) continue; sprintf(buffer,"%s/:%s", trans->TransName, port ? port : ""); PRMSG (5,"MakeAllCOTSServerListeners: opening %s\n", buffer, 0, 0); if ((ciptr = TRANS(OpenCOTSServer(buffer))) == NULL) { if (trans->flags & TRANS_DISABLED) continue; PRMSG (1, "MakeAllCOTSServerListeners: failed to open listener for %s\n", trans->TransName, 0, 0); continue; } if ((status = TRANS(CreateListener (ciptr, port))) < 0) { if (status == TRANS_ADDR_IN_USE) { /* * We failed to bind to the specified address because the * address is in use. It must be that a server is already * running at this address, and this function should fail. */ PRMSG (1, "MakeAllCOTSServerListeners: server already running\n", 0, 0, 0); for (j = 0; j < *count_ret; j++) TRANS(Close) (temp_ciptrs[j]); *count_ret = 0; *ciptrs_ret = NULL; *partial = 0; return -1; } else { PRMSG (1, "MakeAllCOTSServerListeners: failed to create listener for %s\n", trans->TransName, 0, 0); continue; } } PRMSG (5, "MakeAllCOTSServerListeners: opened listener for %s, %d\n", trans->TransName, ciptr->fd, 0); temp_ciptrs[*count_ret] = ciptr; (*count_ret)++; } *partial = (*count_ret < complete_network_count()); PRMSG (5, "MakeAllCLTSServerListeners: partial=%d, actual=%d, complete=%d \n", *partial, *count_ret, complete_network_count()); if (*count_ret > 0) { if ((*ciptrs_ret = (XtransConnInfo *) xalloc ( *count_ret * sizeof (XtransConnInfo))) == NULL) { return -1; } for (i = 0; i < *count_ret; i++) { (*ciptrs_ret)[i] = temp_ciptrs[i]; } } else *ciptrs_ret = NULL; return 0; }
int TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret, XtransConnInfo **ciptrs_ret) { char buffer[256]; /* ??? What size ?? */ XtransConnInfo ciptr, temp_ciptrs[NUMTRANS]; int status, i, j; #ifdef HAVE_LAUNCHD int launchd_fd; launch_data_t sockets_dict, checkin_request, checkin_response; launch_data_t listening_fd_array, listening_fd; #endif #if defined(IPv6) && defined(AF_INET6) int ipv6_succ = 0; #endif PRMSG (2,"MakeAllCOTSServerListeners(%s,%p)\n", port ? port : "NULL", ciptrs_ret, 0); *count_ret = 0; #ifdef HAVE_LAUNCHD /* Get launchd fd */ if ((checkin_request = launch_data_new_string(LAUNCH_KEY_CHECKIN)) == NULL) { fprintf(stderr,"launch_data_new_string(\"" LAUNCH_KEY_CHECKIN "\") Unable to create string.\n"); goto not_launchd; } if ((checkin_response = launch_msg(checkin_request)) == NULL) { fprintf(stderr,"launch_msg(\"" LAUNCH_KEY_CHECKIN "\") IPC failure: %s\n",strerror(errno)); goto not_launchd; } if (LAUNCH_DATA_ERRNO == launch_data_get_type(checkin_response)) { // ignore EACCES, which is common if we weren't started by launchd if (launch_data_get_errno(checkin_response) != EACCES) fprintf(stderr,"launchd check-in failed: %s\n",strerror(launch_data_get_errno(checkin_response))); goto not_launchd; } sockets_dict = launch_data_dict_lookup(checkin_response, LAUNCH_JOBKEY_SOCKETS); if (NULL == sockets_dict) { fprintf(stderr,"launchd check-in: no sockets found to answer requests on!\n"); goto not_launchd; } if (launch_data_dict_get_count(sockets_dict) > 1) { fprintf(stderr,"launchd check-in: some sockets will be ignored!\n"); goto not_launchd; } listening_fd_array = launch_data_dict_lookup(sockets_dict, ":0"); if (NULL == listening_fd_array) { fprintf(stderr,"launchd check-in: No known sockets found to answer requests on!\n"); goto not_launchd; } if (launch_data_array_get_count(listening_fd_array)!=1) { fprintf(stderr,"launchd check-in: Expected 1 socket from launchd, got %d)\n", launch_data_array_get_count(listening_fd_array)); goto not_launchd; } listening_fd=launch_data_array_get_index(listening_fd_array, 0); launchd_fd=launch_data_get_fd(listening_fd); fprintf(stderr,"Xquartz: run by launchd for fd %d\n",launchd_fd); if((ciptr = TRANS(ReopenCOTSServer(TRANS_SOCKET_LOCAL_INDEX, launchd_fd, getenv("DISPLAY"))))==NULL) fprintf(stderr,"Got NULL while trying to Reopen launchd port\n"); else temp_ciptrs[(*count_ret)++] = ciptr; not_launchd: #endif for (i = 0; i < NUMTRANS; i++) { Xtransport *trans = Xtransports[i].transport; unsigned int flags = 0; if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN) continue; snprintf(buffer, sizeof(buffer), "%s/:%s", trans->TransName, port ? port : ""); PRMSG (5,"MakeAllCOTSServerListeners: opening %s\n", buffer, 0, 0); if ((ciptr = TRANS(OpenCOTSServer(buffer))) == NULL) { if (trans->flags & TRANS_DISABLED) continue; PRMSG (1, "MakeAllCOTSServerListeners: failed to open listener for %s\n", trans->TransName, 0, 0); continue; } #if defined(IPv6) && defined(AF_INET6) if ((Xtransports[i].transport_id == TRANS_SOCKET_INET_INDEX && ipv6_succ)) flags |= ADDR_IN_USE_ALLOWED; #endif if ((status = TRANS(CreateListener (ciptr, port, flags))) < 0) { if (status == TRANS_ADDR_IN_USE) { /* * We failed to bind to the specified address because the * address is in use. It must be that a server is already * running at this address, and this function should fail. */ PRMSG (1, "MakeAllCOTSServerListeners: server already running\n", 0, 0, 0); for (j = 0; j < *count_ret; j++) TRANS(Close) (temp_ciptrs[j]); *count_ret = 0; *ciptrs_ret = NULL; *partial = 0; return -1; } else { PRMSG (1, "MakeAllCOTSServerListeners: failed to create listener for %s\n", trans->TransName, 0, 0); continue; } } #if defined(IPv6) && defined(AF_INET6) if (Xtransports[i].transport_id == TRANS_SOCKET_INET6_INDEX) ipv6_succ = 1; #endif PRMSG (5, "MakeAllCOTSServerListeners: opened listener for %s, %d\n", trans->TransName, ciptr->fd, 0); temp_ciptrs[*count_ret] = ciptr; (*count_ret)++; } *partial = (*count_ret < complete_network_count()); PRMSG (5, "MakeAllCOTSServerListeners: partial=%d, actual=%d, complete=%d \n", *partial, *count_ret, complete_network_count()); if (*count_ret > 0) { if ((*ciptrs_ret = (XtransConnInfo *) xalloc ( *count_ret * sizeof (XtransConnInfo))) == NULL) { return -1; } for (i = 0; i < *count_ret; i++) { (*ciptrs_ret)[i] = temp_ciptrs[i]; } } else *ciptrs_ret = NULL; return 0; }