/* ls_popen() * * Implements popen() with a timeout */ FILE * ls_popen(const char *cmd, const char *type, struct timeval *t) { FILE *fp; struct stat buf; int s; int cc; fd_set rmask; if (stat(cmd, &buf) < 0) return NULL; fp = popen(cmd, type); if (fp == NULL) return NULL; s = fileno(fp); io_nonblock_(s); znovu: FD_ZERO(&rmask); FD_SET(s, &rmask); cc = select(s + 1, &rmask, NULL, NULL, t); if (cc < 0 && errno == EINTR) goto znovu; if (cc < 0) { pclose(fp); lserrno = LSE_SELECT_SYS; return NULL; } if (cc == 0) { pclose(fp); lserrno = LSE_TIME_OUT; return NULL; } io_block_(s); return fp; }
/* init_AcceptSock() */ static void init_AcceptSock (void) { static char fname[] = "init_AcceptSock()"; struct servent *sv; struct sockaddr_in svaddr; socklen_t len; int one = 1; struct hostent *hp; memset ((char *) &svaddr, 0, sizeof (svaddr)); if ((accept_sock = socket (AF_INET, SOCK_STREAM, 0)) < 0) { ls_syslog (LOG_ERR, I18N_FUNC_S_FAIL_M, fname, "socket", "RES"); resExit_ (1); } setsockopt (accept_sock, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof (int)); if (io_nonblock_ (accept_sock) < 0) ls_syslog (LOG_ERR, I18N_FUNC_D_FAIL_M, fname, "io_nonblock_", accept_sock); fcntl (accept_sock, F_SETFD, (fcntl (accept_sock, F_GETFD) | FD_CLOEXEC)); if (resParams[LSF_RES_PORT].paramValue) { if ((svaddr.sin_port = atoi (resParams[LSF_RES_PORT].paramValue)) == 0) { ls_syslog (LOG_ERR, _i18n_msg_get (ls_catd, NL_SETN, 5307, "%s: LSF_RES_PORT in lsf.conf (%s) must be positive integer; exiting"), fname, resParams[LSF_RES_PORT].paramValue); /* catgets 5307 */ resExit_ (1); } svaddr.sin_port = htons (svaddr.sin_port); } else if (debug) { svaddr.sin_port = htons (RES_PORT); } else { if ((sv = getservbyname ("res", "tcp")) == NULL) { ls_syslog (LOG_ERR, _i18n_msg_get (ls_catd, NL_SETN, 5309, "%s: res/tcp: unknown service, exiting"), fname); /* catgets 5309 */ resExit_ (1); } svaddr.sin_port = sv->s_port; } svaddr.sin_family = AF_INET; svaddr.sin_addr.s_addr = INADDR_ANY; if (Bind_ (accept_sock, (struct sockaddr *) &svaddr, sizeof (svaddr)) < 0) { ls_syslog (LOG_ERR, I18N_FUNC_D_FAIL_M, fname, "accept_sock", ntohs (svaddr.sin_port)); resExit_ (1); } if (listen (accept_sock, 1024) < 0) { ls_syslog (LOG_ERR, I18N_FUNC_FAIL_M, fname, "listen"); resExit_ (1); } if ((ctrlSock = TcpCreate_ (TRUE, 0)) < 0) { ls_syslog (LOG_ERR, I18N_FUNC_FAIL_M, fname, "TcpCreate_"); resExit_ (1); } len = sizeof (ctrlAddr); memset ((char *) &ctrlAddr, 0, sizeof (ctrlAddr)); if (getsockname (ctrlSock, (struct sockaddr *) &ctrlAddr, &len) < 0) { ls_syslog (LOG_ERR, I18N_FUNC_D_FAIL_M, fname, "getsockname", ctrlSock); resExit_ (-1); } if ((hp = Gethostbyname_ (Myhost))) memcpy ((char *) &ctrlAddr.sin_addr, (char *) hp->h_addr, (int) hp->h_length); }