int ls_rexecve (char *host, char **argv, int options, char **envp) { int d; int retsock; struct timeval timeout; socklen_t len; struct sockaddr_in sin; int max; char sock_buf[20]; char *new_argv[5]; char pathbuf[MAXPATHLEN]; int s; int descriptor[2]; struct resCmdBill cmdmsg; int resTimeout; if (genParams_[LSF_RES_TIMEOUT].paramValue) resTimeout = atoi (genParams_[LSF_RES_TIMEOUT].paramValue); else resTimeout = RES_TIMEOUT; if (_isconnected_ (host, descriptor)) s = descriptor[0]; else if ((s = ls_connect (host)) < 0) return (-1); if (!FD_ISSET (s, &connection_ok_)) { FD_SET (s, &connection_ok_); if (ackReturnCode_ (s) < 0) { closesocket (s); _lostconnection_ (host); return (-1); } } cmdmsg.options = options & ~REXF_TASKPORT; if (cmdmsg.options & REXF_SHMODE) cmdmsg.options |= REXF_USEPTY; if (!isatty (0) && !isatty (1)) cmdmsg.options &= ~REXF_USEPTY; else if (cmdmsg.options & REXF_USEPTY) { if (rstty_ (host) < 0) { _lostconnection_ (host); return (-1); } } if ((genParams_[LSF_INTERACTIVE_STDERR].paramValue != NULL) && (strcasecmp (genParams_[LSF_INTERACTIVE_STDERR].paramValue, "y") == 0)) { cmdmsg.options |= REXF_STDERR; } if (mygetwd_ (cmdmsg.cwd) == 0) { closesocket (s); _lostconnection_ (host); lserrno = LSE_WDIR; return (-1); } if (envp) { if (ls_rsetenv (host, envp) < 0) { _lostconnection_ (host); return (-1); } } if ((retsock = TcpCreate_ (TRUE, 0)) < 0) { closesocket (s); _lostconnection_ (host); return (-1); } len = sizeof (sin); if (getsockname (retsock, (struct sockaddr *) &sin, &len) < 0) { (void) closesocket (retsock); closesocket (s); _lostconnection_ (host); lserrno = LSE_SOCK_SYS; return (-1); } cmdmsg.retport = sin.sin_port; cmdmsg.rpid = 0; cmdmsg.argv = argv; cmdmsg.priority = 0; timeout.tv_usec = 0; timeout.tv_sec = resTimeout; if (sendCmdBill_ (s, (resCmd) RES_EXEC, &cmdmsg, &retsock, &timeout) == -1) { closesocket (retsock); closesocket (s); _lostconnection_ (host); return (-1); } (void) sprintf (sock_buf, "%d", retsock); if (initenv_ (NULL, NULL) < 0) return (-1); strcpy (pathbuf, genParams_[LSF_SERVERDIR].paramValue); strcat (pathbuf, "/nios"); new_argv[0] = pathbuf; new_argv[1] = "-n"; new_argv[2] = sock_buf; if (cmdmsg.options & REXF_USEPTY) { if (cmdmsg.options & REXF_SHMODE) new_argv[3] = "2"; else new_argv[3] = "1"; } else new_argv[3] = "0"; new_argv[4] = 0; max = sysconf (_SC_OPEN_MAX); for (d = 3; d < max; ++d) { if (d != retsock) (void) close (d); } (void) lsfExecvp (new_argv[0], new_argv); lserrno = LSE_EXECV_SYS; close (retsock); close (s); return (-1); }
struct jRusage *getJInfo_(int npgid, int *pgid, int options, int cpgid) { static char fname[] = "lib.pim.c/getJInfo_()"; struct jRusage *jru; static char pfile[MAXFILENAMELEN]; char *myHost; static struct sockaddr_in pimAddr; struct LSFHeader sendHdr, recvHdr, hdrBuf; int s, cc; struct timeval timeOut; static time_t lastTime = 0, lastUpdateNow = 0; time_t now; static time_t pimSleepTime = PIM_SLEEP_TIME; static bool_t periodicUpdateOnly = FALSE; now = time(0); if (logclass & LC_PIM) ls_syslog(LOG_DEBUG3,"now = %ld, lastTime = %ld, sleepTime = %ld", now, lastUpdateNow, pimSleepTime); argOptions = options; if (lastTime == 0) { struct hostent *hp; struct config_param *plp; for (plp = pimParams; plp->paramName != NULL; plp++) { if (plp->paramValue != NULL) { FREEUP (plp->paramValue); } } if (initenv_(pimParams, NULL) < 0) { if (logclass & LC_PIM) ls_syslog(LOG_DEBUG, "%s: initenv_() failed: %M", fname); return NULL; } if ((myHost = ls_getmyhostname()) == NULL) { if (logclass & LC_PIM) ls_syslog(LOG_DEBUG, "%s: ls_getmyhostname() failed: %m", fname); return (NULL); } if (pimParams[LSF_PIM_INFODIR].paramValue) sprintf(pfile, "%s/pim.info.%s", pimParams[LSF_PIM_INFODIR].paramValue, myHost); else { if (pimParams[LSF_LIM_DEBUG].paramValue) { if (pimParams[LSF_LOGDIR].paramValue) sprintf(pfile, "%s/pim.info.%s", pimParams[LSF_LOGDIR].paramValue, myHost); else sprintf(pfile, "/tmp/pim.info.%s.%d", myHost, (int)getuid()); } else { sprintf(pfile, "/tmp/pim.info.%s", myHost); } } if (pimParams[LSF_PIM_SLEEPTIME].paramValue) { if ((pimSleepTime = atoi(pimParams[LSF_PIM_SLEEPTIME].paramValue)) < 0) { if (logclass & LC_PIM) ls_syslog(LOG_DEBUG, "LSF_PIM_SLEEPTIME value <%s> must be a positive integer, defaulting to %d", pimParams[LSF_PIM_SLEEPTIME].paramValue, PIM_SLEEP_TIME); pimSleepTime = PIM_SLEEP_TIME; } } if (pimParams[LSF_PIM_SLEEPTIME_UPDATE].paramValue != NULL && strcasecmp(pimParams[LSF_PIM_SLEEPTIME_UPDATE].paramValue, "y") == 0) { periodicUpdateOnly = TRUE; if (logclass & LC_PIM) ls_syslog(LOG_DEBUG, "%s: Only to call pim each PIM_SLEEP_TIME interval", fname); } if ((hp = Gethostbyname_(myHost)) == NULL) { return NULL; } memset((char *) &pimAddr, 0, sizeof(pimAddr)); memcpy((char *) &pimAddr.sin_addr, (char *) hp->h_addr, (int)hp->h_length); pimAddr.sin_family = AF_INET; } if (now - lastUpdateNow >= pimSleepTime || (options & PIM_API_UPDATE_NOW)) { if (logclass & LC_PIM) ls_syslog(LOG_DEBUG,"%s: update now", fname); lastUpdateNow = now; if ((s = TcpCreate_(FALSE, 0)) < 0) { if (logclass & LC_PIM) ls_syslog(LOG_DEBUG, "%s: tcpCreate failed: %m", fname); return (NULL); } if (pimPort(&pimAddr, pfile) == -1) { close(s); return (NULL); } if (b_connect_(s, (struct sockaddr *) &pimAddr, sizeof(pimAddr), 0) == -1) { if (logclass & LC_PIM) ls_syslog(LOG_DEBUG, "%s: b_connect() failed: %m", fname); lserrno = LSE_CONN_SYS; close(s); return (NULL); } initLSFHeader_(&sendHdr); initLSFHeader_(&recvHdr); sendHdr.opCode = options; sendHdr.refCode = (short) now & 0xffff; sendHdr.reserved = cpgid; if ((cc = writeEncodeHdr_(s, &sendHdr, b_write_fix)) < 0) { if (logclass & LC_PIM) ls_syslog(LOG_DEBUG, "%s: writeEncodeHdr failed cc=%d: %M", fname, cc); close(s); return (NULL); } timeOut.tv_sec = 10; timeOut.tv_usec = 0; if ((cc = rd_select_(s, &timeOut)) < 0) { if (logclass & LC_PIM) ls_syslog(LOG_DEBUG, "%s: rd_select_ cc=%d: %m", fname, cc); close(s); return (NULL); } if ((cc = lsRecvMsg_(s, (char *) &hdrBuf, sizeof(hdrBuf), &recvHdr, NULL, NULL, b_read_fix)) < 0) { if (logclass & LC_PIM) ls_syslog(LOG_DEBUG, "%s: lsRecvMsg_ failed cc=%d: %M", fname, cc); close(s); return (NULL); } close(s); if (recvHdr.refCode != sendHdr.refCode) { if (logclass & LC_PIM) ls_syslog(LOG_DEBUG, "%s: recv refCode=%d not equal to send refCode=%d, server is not PIM", fname, (int) recvHdr.refCode, (int) sendHdr.refCode); return (NULL); } if (logclass & LC_PIM) ls_syslog(LOG_DEBUG,"%s updated now",fname); if (!readPIMFile(pfile)) { ls_syslog(LOG_ERR, I18N_FUNC_FAIL, fname, "readPIMFile"); return(NULL); } } lastTime = now; if ((jru = readPIMInfo(npgid, pgid)) == NULL && !(options & PIM_API_UPDATE_NOW) && (periodicUpdateOnly == FALSE || (periodicUpdateOnly == TRUE && now - lastUpdateNow >= pimSleepTime))) { if (hitPGid > 0) { jru = getJInfo_(npgid, pgid, options | PIM_API_UPDATE_NOW, hitPGid); hitPGid = 0; return jru; } else { return (getJInfo_(npgid, pgid, options | PIM_API_UPDATE_NOW, cpgid)); } } return jru; }
/* ls_startserver() */ int ls_startserver (char *host, char **server, int options) { int retsock; char official[MAXHOSTNAMELEN]; struct timeval timeout; struct sockaddr_in sin; int s; int descriptor[2]; struct resCmdBill cmdmsg; int resTimeout; socklen_t len; if (genParams_[LSF_RES_TIMEOUT].paramValue) resTimeout = atoi (genParams_[LSF_RES_TIMEOUT].paramValue); else resTimeout = RES_TIMEOUT; if (_isconnected_ (host, descriptor)) s = descriptor[0]; else if ((s = ls_connect (host)) < 0) return (-1); if (!FD_ISSET (s, &connection_ok_)) { FD_SET (s, &connection_ok_); if (ackReturnCode_ (s) < 0) { closesocket (s); _lostconnection_ (host); return (-1); } } if (!isatty (0) && !isatty (1)) options &= ~REXF_USEPTY; else if (options & REXF_USEPTY) { if (rstty_ (host) < 0) { _lostconnection_ (host); return (-1); } } if (mygetwd_ (cmdmsg.cwd) == 0) { closesocket (s); _lostconnection_ (host); lserrno = LSE_WDIR; return (-1); } if ((retsock = TcpCreate_ (TRUE, 0)) < 0) { closesocket (s); _lostconnection_ (host); return (-1); } len = sizeof (sin); if (getsockname (retsock, (struct sockaddr *) &sin, &len) < 0) { closesocket (retsock); closesocket (s); _lostconnection_ (host); lserrno = LSE_SOCK_SYS; return (-1); } cmdmsg.retport = sin.sin_port; cmdmsg.options = options & ~REXF_TASKPORT; cmdmsg.rpid = 0; cmdmsg.argv = server; timeout.tv_usec = 0; timeout.tv_sec = resTimeout; if (sendCmdBill_ (s, (resCmd) RES_SERVER, &cmdmsg, &retsock, &timeout) == -1) { closesocket (retsock); closesocket (s); _lostconnection_ (host); return (-1); } if (ackReturnCode_ (s) < 0) { closesocket (retsock); closesocket (s); _lostconnection_ (host); return (-1); } if (retsock <= 2 && (retsock = get_nonstd_desc_ (retsock)) < 0) { closesocket (s); _lostconnection_ (host); lserrno = LSE_SOCK_SYS; return (-1); } gethostbysock_ (s, official); (void) connected_ (official, -1, retsock, currentSN); return (retsock); } /* ls_startserver() */
/* 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); }