Esempio n. 1
0
int
ls_stdinmode(int onoff)
{
    fd_set rmask;
    struct timeval timeout;
    struct lslibNiosHdr reqHdr, replyHdr;
    sigset_t newMask, oldMask;
    int cc;

    if (!nios_ok_) {
        lserrno = LSE_NIOS_DOWN;
        return(-1);
    }

    if (blockALL_SIGS_(&newMask, &oldMask) < 0)
        return (-1);

    SET_LSLIB_NIOS_HDR(reqHdr,
			(onoff ? LIB_NIOS_REM_ON : LIB_NIOS_REM_OFF), 0);

    FD_ZERO(&rmask);
    FD_SET(cli_nios_fd[0], &rmask);
    timeout.tv_sec = NIOS_TIMEOUT; 
    timeout.tv_usec = 0;

    if (b_write_fix(cli_nios_fd[0], (char *) &reqHdr, sizeof(reqHdr)) !=
	sizeof(reqHdr)) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    
    if ((cc = select(cli_nios_fd[0] + 1, &rmask, 0, 0, &timeout)) <= 0) {
	if (cc == 0)
	    lserrno = LSE_TIME_OUT;
        else
	    lserrno = LSE_SELECT_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    if (b_read_fix(cli_nios_fd[0], (char *) &replyHdr, sizeof(replyHdr))
	== -1) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    if (replyHdr.opCode != REM_ONOFF) {
	lserrno = LSE_PROTOC_NIOS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    sigprocmask(SIG_SETMASK, &oldMask, NULL); 
    return(0);
} 
Esempio n. 2
0
int
ls_donerex(void)
{
    fd_set rmask;
    struct timeval timeout;
    struct lslibNiosHdr reqHdr, replyHdr;
    sigset_t newMask, oldMask;

    if (!nios_ok_) {
        lserrno = LSE_NIOS_DOWN;
        return(-1);
    }

    if (blockALL_SIGS_(&newMask, &oldMask) < 0)
        return (-1);

    SET_LSLIB_NIOS_HDR(reqHdr, LIB_NIOS_EXIT, 0);

    FD_ZERO(&rmask);
    FD_SET(cli_nios_fd[0], &rmask);
    timeout.tv_sec = NIOS_TIMEOUT; 
    timeout.tv_usec = 0;

    if (b_write_fix(cli_nios_fd[0], (char *)&reqHdr, sizeof(reqHdr)) !=
	sizeof(reqHdr)) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    
    if (select(cli_nios_fd[0] + 1, &rmask, 0, 0, &timeout) <= 0) {
	lserrno = LSE_SELECT_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    if (b_read_fix(cli_nios_fd[0], (char *) &replyHdr, sizeof(replyHdr))
	== -1) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    if (replyHdr.opCode != NIOS_OK) {
	lserrno = LSE_PROTOC_NIOS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    nios_ok_ = FALSE;

    sigprocmask(SIG_SETMASK, &oldMask, NULL); 
    return(0);
} 
Esempio n. 3
0
int 
ls_sndmsg(int tid, char *buf, int count, task_sock)
{
    int cc, sock;
    struct tid *tid;

    if (amSlave_ == TRUE)
	sock = msock_;
    else {
        if ((tid = tid_find(tid, task_sock)) == NULL)
	    return (-1);
	sock = tid->sock;
    }

    return(b_write_fix( sock, buf, count) );
}
Esempio n. 4
0
int
ls_rtaske(char *host, char **argv, int options, char **envp)
{
    static u_short          retport;
    static int              rpid;
    static int              reg_ls_donerex = FALSE;
    struct sockaddr_in      sin;
    int                     max;
    char                    c_chfd[8];
    char                    pathbuf[MAXPATHLEN];
    int                     d;
    int                     niosOptions = 0;
    char                    *new_argv[5];
    int                     pid;
    int                     s;
    int                     descriptor[2];
    struct resCmdBill       cmdmsg;
    struct lslibNiosRTask   taskReq;
    u_short                 taskPort = 0;
    sigset_t                newMask;
    sigset_t                oldMask;
    socklen_t               len;

    if (!reg_ls_donerex) {

        atexit( (void (*) ()) ls_donerex);   
 	reg_ls_donerex = TRUE;
    }

    if (_isconnected_(host, descriptor))
	s = descriptor[0];
    else if ((s = ls_connect(host)) < 0)
	return(-1);

    if (blockALL_SIGS_(&newMask, &oldMask) < 0)
        return (-1);

    if (!FD_ISSET(s,&connection_ok_)){
	FD_SET(s,&connection_ok_);
	if (ackReturnCode_(s) < 0){
	    closesocket(s);
	    _lostconnection_(host);
	    sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	    return (-1);
	}
    }

    if (!nios_ok_) 
        niosOptions = options & REXF_SYNCNIOS;
    options &= ~REXF_SYNCNIOS;

    cmdmsg.options = options;
    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 (options & REXF_TTYASYNC){
            if (rstty_async_(host) < 0) {
                sigprocmask(SIG_SETMASK, &oldMask, NULL); 
                return (-1);
            }
        } else {
	    if (rstty_(host) < 0) { 
                sigprocmask(SIG_SETMASK, &oldMask, NULL); 
                return (-1);
            }
        }
    }
    
    if ( (genParams_[LSF_INTERACTIVE_STDERR].paramValue != NULL)
	 && (strcasecmp(genParams_[LSF_INTERACTIVE_STDERR].paramValue, 
			"y") == 0) ) {
	cmdmsg.options |= REXF_STDERR;
    }

    if (!nios_ok_) {
       
        initSigHandler(SIGTSTP);
        initSigHandler(SIGTTIN);
        initSigHandler(SIGTTOU);

       
        if (socketpair(AF_UNIX, SOCK_STREAM, 0, cli_nios_fd) < 0) {
            lserrno = LSE_SOCK_SYS;
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
            closesocket(s);
            return(-1);
        }

        if ((pid = fork()) != 0) { 
            int mypid;

            close(cli_nios_fd[1]);
            mypid = getpid();
            if (b_write_fix(cli_nios_fd[0], (char *) &mypid, sizeof (mypid)) !=
                sizeof (mypid)) {
                close(cli_nios_fd[0]);
                sigprocmask(SIG_SETMASK, &oldMask, NULL); 
                lserrno = LSE_MSG_SYS;
                return (-1);
            }

            if (b_read_fix(cli_nios_fd[0], (char *) &retport, sizeof (u_short))
                != sizeof(u_short) ) {
                close(cli_nios_fd[0]);
                sigprocmask(SIG_SETMASK, &oldMask, NULL); 
                lserrno = LSE_MSG_SYS;
                return (-1);
            }

            nios_ok_ = TRUE;

            if (waitpid(pid, 0, 0) <0) { 
                if (errno != ECHILD) {
                    close(cli_nios_fd[0]);
                    nios_ok_ = FALSE;
                    sigprocmask(SIG_SETMASK, &oldMask, NULL); 
                    lserrno = LSE_WAIT_SYS;
                    return (-1);
                }
            }
        } else {
            if (fork()) { 
                max = sysconf(_SC_OPEN_MAX);
                for (d = 3; d < max; ++d) { 
                    (void)close(d);
                }
                exit(0);
            }
          

            if (initenv_(NULL, NULL) <0)
                exit (-1);
            strcpy(pathbuf, genParams_[LSF_SERVERDIR].paramValue);
            strcat(pathbuf, "/nios");
            sprintf(c_chfd, "%d", cli_nios_fd[1]);  
            new_argv[0] = pathbuf;
            new_argv[1] = c_chfd;
            if (cmdmsg.options & REXF_USEPTY) {
                if (cmdmsg.options & REXF_SHMODE)
                    new_argv[2] = "2";
                else
                    new_argv[2] = "1";
            }
            else
                new_argv[2] = "0";
            new_argv[3] = NULL;

            max = sysconf(_SC_OPEN_MAX);
            for (d = 3; d < max; ++d) { 
                if (d != cli_nios_fd[1])
                    (void)close(d);
            }
          
            for (d = 1; d < NSIG; d++)     
                Signal_(d, SIG_DFL);

          
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
            (void)lsfExecvp(new_argv[0], new_argv);
            exit(-1);
        }
    }

    if (envp) {
        if (ls_rsetenv_async (host, envp) < 0) {
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
            return (-1);
        }
    }

    if (rexcwd_[0] != '\0')
        strcpy(cmdmsg.cwd, rexcwd_);
    else if (mygetwd_(cmdmsg.cwd) == 0) {
	closesocket(s);
	_lostconnection_(host);
        lserrno = LSE_WDIR;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
        return (-1);
    }

    
    rpid++;

    cmdmsg.rpid = rpid;
    cmdmsg.retport = retport;

    cmdmsg.argv = argv;
    cmdmsg.priority = 0;   

    if (sendCmdBill_(s, (resCmd) RES_EXEC, &cmdmsg, NULL, NULL) == -1) {
	closesocket(s);
	_lostconnection_(host);
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    if (cmdmsg.options & REXF_TASKPORT) {
	
	if ((taskPort = getTaskPort(s)) == 0) {
	    closesocket(s);
	    _lostconnection_(host);
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	    return(-1);
	}
    }

    len = sizeof(sin);
    if (getpeername(s, (struct sockaddr *) &sin, &len) <0) {
	closesocket(s);
	_lostconnection_(host);
	lserrno = LSE_SOCK_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    SET_LSLIB_NIOS_HDR(taskReq.hdr, LIB_NIOS_RTASK, sizeof(taskReq.r));
    taskReq.r.pid = rpid;
    taskReq.r.peer = sin.sin_addr;
    
    taskReq.r.pid = (niosOptions & REXF_SYNCNIOS)? -rpid : rpid;

    if (b_write_fix(cli_nios_fd[0], (char *) &taskReq, sizeof(taskReq))
	!= sizeof(taskReq)) {
	closesocket(s);
	_lostconnection_(host);
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return (-1);
    }

    if (tid_register(rpid, s, taskPort, host, options & REXF_TASKINFO) == -1) {
	closesocket(s);
	_lostconnection_(host);
	lserrno = LSE_MALLOC;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return (-1);
    }

    sigprocmask(SIG_SETMASK, &oldMask, NULL);

    return (rpid);
} 
Esempio n. 5
0
static int
rwait_(int tid, LS_WAIT_T *status, int options, struct rusage *ru)
{
    int rpid;
    struct lslibNiosWaitReq req;
    struct lslibNiosHdr hdr;
    fd_set rmask;
    struct timeval timeout;
    sigset_t newMask, oldMask;
    int cc;

    if (tid < 0) {
	lserrno = LSE_BAD_ARGS;
	return -1;
    }

    if (!nios_ok_)  {
	lserrno = LSE_NORCHILD;
	return -1;
    }

    blockALL_SIGS_(&newMask, &oldMask);

  Start:

    FD_ZERO(&rmask);
    FD_SET(cli_nios_fd[0], &rmask);
    timeout.tv_sec = NIOS_TIMEOUT;
    timeout.tv_usec = 0;

    SET_LSLIB_NIOS_HDR(req.hdr, LIB_NIOS_RWAIT, sizeof(req.r));
    req.r.options = options;
    req.r.tid = tid;

    if (b_write_fix(cli_nios_fd[0], (char *) &req, sizeof(req))
	!= sizeof(req)) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL);
	return -1;
    }


    cc = select(cli_nios_fd[0] + 1, &rmask, 0, 0, &timeout);
    if (cc <= 0) {
	if (cc < 0)
	    lserrno = LSE_SELECT_SYS;
	else
	    lserrno = LSE_TIME_OUT;
        sigprocmask(SIG_SETMASK, &oldMask, NULL);
	return -1;
    }

    if (b_read_fix(cli_nios_fd[0], (char *) &hdr, sizeof(hdr)) == -1) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL);
	return -1;
    }

    if (WAIT_BLOCK(options) && hdr.opCode == NONB_RETRY) {

	restartRWait(oldMask);


	if(!isPamBlockWait){

	    goto Start;
	}
    }

    switch (hdr.opCode) {
      case CHILD_FAIL:
	lserrno = LSE_NORCHILD;
        sigprocmask(SIG_SETMASK, &oldMask, NULL);
	return -1;

      case NONB_RETRY:
        sigprocmask(SIG_SETMASK, &oldMask, NULL);
	return 0;

      case CHILD_OK:
	rpid = readWaitReply(status, ru);
        sigprocmask(SIG_SETMASK, &oldMask, NULL);
	return (rpid);

      default:

	lserrno = LSE_PROTOC_NIOS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL);
	return -1;
    }

}
Esempio n. 6
0
int
verifyEAuth_(struct lsfAuth *auth, struct sockaddr_in *from)
{
    static char fname[] = "verifyEAuth/lib.eauth.c";
    char path[MAXPATHLEN], uData[256], ok;
    char *eauth_client, *eauth_server, *eauth_aux_data, *eauth_aux_status;
    int cc, i;
    static int connected = FALSE;
    static int in[2], out[2];

    if (logclass & LC_TRACE)
        ls_syslog(LOG_DEBUG, "%s ...", fname);

    if (!(genParams_[LSF_AUTH].paramValue &&
          !strcmp(genParams_[LSF_AUTH].paramValue, AUTH_PARAM_EAUTH)))
        return -1;

    eauth_client = getenv("LSF_EAUTH_CLIENT");
    eauth_server = getenv("LSF_EAUTH_SERVER");
    eauth_aux_data = getenv("LSF_EAUTH_AUX_DATA");
    eauth_aux_status = getenv("LSF_EAUTH_AUX_STATUS");

    sprintf(uData, "%d %d %s %s %d %d %s %s %s %s\n", auth->uid, auth->gid,
            auth->lsfUserName, inet_ntoa(from->sin_addr),
            (int) ntohs(from->sin_port), auth->k.eauth.len,
            (eauth_client ? eauth_client : "NULL"),
            (eauth_server ? eauth_server : "NULL"),
            (eauth_aux_data ? eauth_aux_data : "NULL"),
            (eauth_aux_status ? eauth_aux_status : "NULL"));

    memset(path,0,sizeof(path));
    ls_strcat(path,sizeof(path),genParams_[LSF_SERVERDIR].paramValue);
    ls_strcat(path,sizeof(path),"/");
    ls_strcat(path,sizeof(path),EAUTHNAME);

    if (logclass & (LC_AUTH | LC_TRACE))
        ls_syslog(LOG_DEBUG, "%s: <%s> path <%s> connected=%d", fname, uData,
                  path, connected);

    if (connected) {
        struct timeval tv;
        fd_set  mask;

        FD_ZERO(&mask);
        FD_SET(out[0], &mask);

        tv.tv_sec = 0;
        tv.tv_usec = 0;

        if ((cc = select(out[0] + 1, &mask, NULL, NULL, &tv)) > 0) {
            if (logclass & (LC_AUTH | LC_TRACE))
                ls_syslog(LOG_DEBUG, "%s: <%s> got exception",
                          fname, uData);
            connected = FALSE;
            close(in[1]);
            close(out[0]);
        } else {
            if (cc < 0)
                ls_syslog(LOG_ERR, I18N_FUNC_S_FAIL_M, fname, "select", uData);
        }

        if (logclass & (LC_AUTH | LC_TRACE))
            ls_syslog(LOG_DEBUG, "%s: <%s> select returned cc=%d", fname,
                      uData, cc);

    }

    if (!connected) {

        int pid;
        char *user;

        {
            if ((user = getLSFAdmin()) == NULL) {
                return -1;
            }
        }

        if (pipe(in) < 0) {
            ls_syslog(LOG_ERR, I18N_FUNC_S_FAIL_M, fname, "pipe(in)", uData);
            lserrno = LSE_SOCK_SYS;
            return -1;
        }

        if (pipe(out) < 0) {
            ls_syslog(LOG_ERR, I18N_FUNC_S_FAIL_M, fname, "pipe(out)", uData);
            lserrno = LSE_SOCK_SYS;
            return -1;
        }


        if ((pid = fork()) == 0) {
            char *myargv[3];
            struct passwd *pw;

            if ((pw = getpwnam(user)) == (struct passwd *)NULL) {
                ls_syslog(LOG_ERR, I18N_FUNC_S_FAIL_M, fname, "getpwnam", user);
                exit(-1);
            }

            if (setuid(pw->pw_uid) < 0) {
                ls_syslog(LOG_ERR, I18N_FUNC_D_FAIL_M, fname, "setuid", (int)pw->pw_uid);
                exit(-1);
            }

            for (i = 1; i < NSIG; i++)
                Signal_(i, SIG_DFL);

            alarm(0);

            close(in[1]);
            if (dup2(in[0], 0) == -1) {
                ls_syslog(LOG_ERR, I18N_FUNC_S_FAIL_M, fname, "dup2(in[0])", uData);
            }

            close(out[0]);
            if (dup2(out[1], 1) == -1) {
                ls_syslog(LOG_ERR, I18N_FUNC_S_FAIL_M, fname, "dup2(out[1])", uData);
            }

            for (i = 3; i < sysconf(_SC_OPEN_MAX); i++)
                close(i);

            myargv[0] = path;
            myargv[1] = "-s";
            myargv[2] = NULL;

            execvp(myargv[0], myargv);
            ls_syslog(LOG_ERR, I18N_FUNC_S_FAIL_M, fname, "execvp", myargv[0]);
            exit(-1);
        }

        close(in[0]);
        close(out[1]);

        if (pid == -1) {
            ls_syslog(LOG_ERR, I18N_FUNC_S_FAIL_M, fname, "fork", path);
            close(in[1]);
            close(out[0]);
            lserrno = LSE_FORK;
            return -1;
        }

        connected = TRUE;
    }

    i = strlen(uData);

    if ((cc = b_write_fix(in[1], uData, i)) != i) {
        ls_syslog(LOG_ERR, _i18n_msg_get(ls_catd , NL_SETN, 5513,
                                         "%s: b_write_fix <%s> failed, cc=%d, i=%d: %m"), /* catgets 5513 */
                  fname, uData, cc, i);
        CLOSEHANDLE(in[1]);
        CLOSEHANDLE(out[0]);
        connected = FALSE;
        return -1;
    }
    if(logclass & (LC_AUTH | LC_TRACE))
        ls_syslog(LOG_DEBUG, _i18n_msg_get(ls_catd , NL_SETN, 5514,
                                           "%s: b_write_fix <%s> ok, cc=%d, i=%d"),
                  fname, uData, cc, i);

    if ((cc = b_write_fix(in[1], auth->k.eauth.data, auth->k.eauth.len))
        != auth->k.eauth.len) {
        ls_syslog(LOG_ERR, _i18n_msg_get(ls_catd , NL_SETN, 5515,
                                         "%s: b_write_fix <%s> failed, eauth.len=%d, cc=%d"), /* catgets 5515 */
                  fname, uData, auth->k.eauth.len, cc);
        CLOSEHANDLE(in[1]);
        CLOSEHANDLE(out[0]);
        connected = FALSE;
        return -1;
    }
    if(logclass & (LC_AUTH | LC_TRACE))
        ls_syslog(LOG_DEBUG, _i18n_msg_get(ls_catd , NL_SETN, 5516,
                                           "%s: b_write_fix <%s> ok, eauth.len=%d, eauth.data=%.*s cc=%d:"),
                  fname, uData, auth->k.eauth.len,
                  auth->k.eauth.len, auth->k.eauth.data,cc);

    if ((cc = b_read_fix(out[0], &ok, 1)) != 1) {
        ls_syslog(LOG_ERR, _i18n_msg_get(ls_catd , NL_SETN, 5517,
                                         "%s: b_read_fix <%s> failed, cc=%d: %m"), /* catgets 5517 */
                  fname, uData, cc);
        CLOSEHANDLE(in[1]);
        CLOSEHANDLE(out[0]);
        connected = FALSE;
        return -1;
    }

    if (ok != '1') {
        ls_syslog(LOG_ERR, _i18n_msg_get(ls_catd , NL_SETN, 5518,
                                         "%s: eauth <%s> len=%d failed, rc=%c"), /* catgets 5518 */
                  fname, uData, auth->k.eauth.len, ok);
        return -1;
    }

    return 0;
}
Esempio n. 7
0
int
ls_getstdin(int on, int *rpidlist, int maxlen)
{
    fd_set rmask;
    struct timeval timeout;
    struct lslibNiosStdin req;
    struct lslibNiosGetStdinReply reply;
    sigset_t newMask, oldMask;

    if (!nios_ok_) {
	lserrno = LSE_NIOS_DOWN;
	return(-1);
    }

    if (blockALL_SIGS_(&newMask, &oldMask) < 0)
        return (-1);

    FD_ZERO(&rmask);
    FD_SET(cli_nios_fd[0], &rmask);
    timeout.tv_sec = NIOS_TIMEOUT;
    timeout.tv_usec = 0;

    SET_LSLIB_NIOS_HDR(req.hdr, LIB_NIOS_GETSTDIN, sizeof(req.r.set_on));
    req.r.set_on = on;

    if (b_write_fix(cli_nios_fd[0], (char *)&req, sizeof(req.hdr) +
		    sizeof(req.r.set_on)) != sizeof(req.hdr) +
	sizeof(req.r.set_on)) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    
    if (select(cli_nios_fd[0] + 1, &rmask, 0, 0, &timeout) <= 0) {
	lserrno = LSE_SELECT_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    if (b_read_fix(cli_nios_fd[0], (char *) &reply.hdr, sizeof(reply.hdr))
	== -1) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }
    switch(reply.hdr.opCode) {
        case STDIN_OK:
	    break;
        default:               
	    lserrno = LSE_PROTOC_NIOS;
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	    return(-1);
    }

    if (reply.hdr.len)
        if (b_read_fix(cli_nios_fd[0], (char *)reply.rpidlist, reply.hdr.len)
            != reply.hdr.len) {
            lserrno = LSE_MSG_SYS;
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
            return(-1);
        }

    if (reply.hdr.len <= maxlen*sizeof(int)) {
        memcpy((char *)rpidlist, (char *)reply.rpidlist, reply.hdr.len);
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(reply.hdr.len/sizeof(int));
    } else {
	lserrno = LSE_RPIDLISTLEN;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }
} 
Esempio n. 8
0
int
ls_setstdin(int on, int *rpidlist, int len)
{
    fd_set rmask;
    struct timeval timeout;
    struct lslibNiosStdin req;
    struct lslibNiosHdr replyHdr;
    sigset_t newMask, oldMask;

    if (!nios_ok_) {
	lserrno = LSE_NIOS_DOWN;
	return(-1);
    }

    if (blockALL_SIGS_(&newMask, &oldMask) < 0)
        return (-1);

    if ((rpidlist == NULL && len != 0)
	|| (len < 0) || (len > NOFILE)) {
	lserrno = LSE_SETPARAM;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    FD_ZERO(&rmask);
    FD_SET(cli_nios_fd[0], &rmask);
    timeout.tv_sec = NIOS_TIMEOUT;
    timeout.tv_usec = 0;

    SET_LSLIB_NIOS_HDR(req.hdr, LIB_NIOS_SETSTDIN, sizeof(req.r) +
		       len * sizeof(int));
    req.r.set_on = on;
    req.r.len = len;

    if (b_write_fix(cli_nios_fd[0], (char *)&req, sizeof(req.hdr) +
		    sizeof(req.r)) != sizeof(req.hdr) + sizeof(req.r)) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    if (rpidlist != NULL && len != 0) {
	

	if (b_write_fix(cli_nios_fd[0], (char *)rpidlist, len*sizeof(int))
	    != len * sizeof(int)) {
	    lserrno = LSE_MSG_SYS;
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	    return(-1);
        }
    }

    
    if (select(cli_nios_fd[0] + 1, &rmask, 0, 0, &timeout) <= 0) {
	lserrno = LSE_SELECT_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    if (b_read_fix(cli_nios_fd[0], (char *) &replyHdr, sizeof(replyHdr))
	== -1) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }
    switch(replyHdr.opCode) {
	case STDIN_FAIL:
	    lserrno = LSE_SETPARAM;
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	    return(-1);
        case STDIN_OK:
	    break;
        default:
	    lserrno = LSE_PROTOC_NIOS;
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	    return(-1);
    }

    sigprocmask(SIG_SETMASK, &oldMask, NULL); 
    return(0);
} 
Esempio n. 9
0
int
ls_setstdout(int on, char *format)
{
    fd_set rmask;
    struct timeval timeout;
    struct lslibNiosStdout req;
    struct lslibNiosHdr replyHdr;
    sigset_t newMask, oldMask;

    if (!nios_ok_) {
	lserrno = LSE_NIOS_DOWN;
	return(-1);
    }

    if (blockALL_SIGS_(&newMask, &oldMask) < 0)
        return (-1);

    FD_ZERO(&rmask);
    FD_SET(cli_nios_fd[0], &rmask);
    timeout.tv_sec = NIOS_TIMEOUT;
    timeout.tv_usec = 0;

    req.r.set_on = on;
    req.r.len = (format == NULL) ? 0 : strlen(format);
    if (req.r.len > 0)
	req.r.len++;    

    SET_LSLIB_NIOS_HDR(req.hdr, LIB_NIOS_SETSTDOUT, sizeof(req.r) +
		       req.r.len*sizeof(char));

    if (b_write_fix(cli_nios_fd[0], (char *)&req, sizeof(req.hdr) +
		    sizeof(req.r)) != sizeof(req.hdr) + sizeof(req.r)) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    if (req.r.len > 0) {
	

	if (b_write_fix(cli_nios_fd[0], (char *)format, req.r.len*sizeof(char))
	    != req.r.len * sizeof(char)) {
	    lserrno = LSE_MSG_SYS;
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	    return(-1);
        }
    }

    
    if (select(cli_nios_fd[0] + 1, &rmask, 0, 0, &timeout) <= 0) {
	lserrno = LSE_SELECT_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    if (b_read_fix(cli_nios_fd[0], (char *) &replyHdr, sizeof(replyHdr))
	== -1) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }
    switch(replyHdr.opCode) {
	case STDOUT_FAIL:
	    lserrno = LSE_SETPARAM;
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	    return(-1);
        case STDOUT_OK:
	    break;
        default:
	    lserrno = LSE_PROTOC_NIOS;
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	    return(-1);
    }

    sigprocmask(SIG_SETMASK, &oldMask, NULL); 
    return(0);
} 
Esempio n. 10
0
int
ls_niossync(int numTasks)
{
    fd_set rmask;
    struct timeval timeout;
    struct lslibNiosHdr replyHdr, reqHdr;
    sigset_t newMask, oldMask;

    if (!nios_ok_) {
	lserrno = LSE_NIOS_DOWN;
	return(-1);
    }

    if (numTasks < 0) {
	lserrno = LSE_BAD_ARGS;
	return(-1);
    }

    if (blockALL_SIGS_(&newMask, &oldMask) < 0)
        return (-1);

    FD_ZERO(&rmask);
    FD_SET(cli_nios_fd[0], &rmask);
    timeout.tv_sec = NIOS_TIMEOUT;
    timeout.tv_usec = 0;

    SET_LSLIB_NIOS_HDR(reqHdr, LIB_NIOS_SYNC, numTasks);

    if (b_write_fix(cli_nios_fd[0], (char *)&reqHdr, sizeof(reqHdr))
	    != sizeof(reqHdr)) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    
    if (select(cli_nios_fd[0] + 1, &rmask, 0, 0, &timeout) <= 0) {
	lserrno = LSE_SELECT_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }

    if (b_read_fix(cli_nios_fd[0], (char *) &replyHdr, sizeof(replyHdr))
	== -1) {
	lserrno = LSE_MSG_SYS;
        sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	return(-1);
    }
    switch(replyHdr.opCode) {
	case SYNC_FAIL:
	    lserrno = LSE_SETPARAM;
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	    return(-1);
        case SYNC_OK:
	    break;
        default:
	    lserrno = LSE_PROTOC_NIOS;
            sigprocmask(SIG_SETMASK, &oldMask, NULL); 
	    return(-1);
    }

    sigprocmask(SIG_SETMASK, &oldMask, NULL); 
    return(0);
} 
Esempio n. 11
0
int
resParent (int s, struct passwd *pw, struct lsfAuth *auth,
	   struct resConnect *connReq, struct hostent *hostp)
{
  static char fname[] = "resParent";
  int cc;
  char *argv[7];
  char hndlbuf[64];
  struct resChildInfo childInfo;
  char buf[2 * MSGSIZE];
  XDR xdrs;
  int len;
  struct LSFHeader hdr;
  int hpipe[2];
  int wrapPipe[2];
  int pid;

  if (resParams[LSF_SERVERDIR].paramValue != NULL)
    {
      argv[0] = getDaemonPath_ ("/res", resParams[LSF_SERVERDIR].paramValue);
    }
  else
    {
      argv[0] = "res";
    }

  childInfo.resConnect = connReq;
  childInfo.lsfAuth = auth;
  childInfo.pw = pw;
  childInfo.host = hostp;
  childInfo.parentPort = ctrlAddr.sin_port;
  childInfo.currentRESSN = currentRESSN;


  if (resLogOn == 1)
    {
      char strLogCpuTime[32];

      sprintf (strLogCpuTime, "%d", resLogcpuTime);
      putEnv ("LSF_RES_LOGON", "1");
      putEnv ("LSF_RES_CPUTIME", strLogCpuTime);
      putEnv ("LSF_RES_ACCTPATH", resAcctFN);
    }
  else if (resLogOn == 0)
    {
      putEnv ("LSF_RES_LOGON", "0");
    }
  else if (resLogOn == -1)
    {
      putEnv ("LSF_RES_LOGON", "-1");
    }

  xdrmem_create (&xdrs, buf, 2 * MSGSIZE, XDR_ENCODE);
  memset ((void *) &hdr, 0, sizeof (struct LSFHeader));
  hdr.version = OPENLAVA_VERSION;
  if (!xdr_resChildInfo (&xdrs, &childInfo, &hdr))
    {
      ls_syslog (LOG_ERR, I18N_FUNC_FAIL, fname, "xdr_resChildInfo");
      return (-1);
    }
  len = XDR_GETPOS (&xdrs);

  if (socketpair (AF_UNIX, SOCK_STREAM, 0, hpipe) < 0)
    {
      ls_syslog (LOG_ERR, I18N_FUNC_FAIL_M, fname, "socketpair");
      return (-1);
    }
  if (socketpair (AF_UNIX, SOCK_STREAM, 0, wrapPipe) < 0)
    {
      ls_syslog (LOG_ERR, I18N_FUNC_FAIL_M, fname, "socketpair");
      return (-1);
    }
  sprintf (hndlbuf, "%d:%d", hpipe[1], s);

  cc = 1;
  argv[cc++] = "-d";
  argv[cc++] = env_dir;
  if (debug)
    {
      if (debug == 1)
	argv[cc++] = "-1";
      else
	argv[cc++] = "-2";
      argv[cc++] = "-s";
      argv[cc++] = hndlbuf;
      argv[cc++] = NULL;
    }
  else
    {
      argv[cc++] = "-s";
      argv[cc++] = hndlbuf;
      argv[cc++] = NULL;
    }


  if (getenv ("LSF_SETDCEPAG") == NULL)
    putEnv ("LSF_SETDCEPAG", "Y");

  pid = fork ();
  if (pid < 0)
    {
      ls_syslog (LOG_ERR, I18N_FUNC_FAIL_M, fname, "fork");
      close (hpipe[0]);
      close (hpipe[1]);
      close (wrapPipe[0]);
      close (wrapPipe[1]);
      return (-1);
    }

  if (pid == 0)
    {
      if (logclass & LC_TRACE)
	{
	  if (debug)
	    {
	      ls_syslog (LOG_DEBUG2, "%s: executing %s %s %s %s %s %s ",
			 fname, argv[0], argv[1], argv[2], argv[3], argv[4],
			 argv[5]);
	    }
	  else
	    {
	      ls_syslog (LOG_DEBUG2, "%s: executing %s %s %s %s %s ",
			 fname, argv[0], argv[1], argv[2], argv[3], argv[4]);
	    }
	}
      close (hpipe[0]);
      close (wrapPipe[0]);


      if (dup2 (wrapPipe[1], 0) == -1)
	{
	  ls_syslog (LOG_ERR, I18N_FUNC_FAIL_M, fname, "dup2");
	  exit (-1);
	}
      close (wrapPipe[1]);
      lsfExecv (argv[0], argv);
      ls_syslog (LOG_ERR, I18N_FUNC_FAIL_M, fname, "execv");
      exit (-1);
    }

  close (hpipe[1]);
  close (wrapPipe[1]);

  if (connReq->eexec.len > 0)
    {
      int cc1;
      if ((cc1 = b_write_fix (wrapPipe[0], connReq->eexec.data,
			      connReq->eexec.len)) != connReq->eexec.len)
	{
	  ls_syslog (LOG_ERR, _i18n_msg_get (ls_catd, NL_SETN, 5333, "%s: Falied in sending data to wrap for user <%s>, length = %d, cc=1%d: %m"), fname, pw->pw_name, connReq->eexec.len, cc1)	/* catgets 5333 */
	    ;
	  close (wrapPipe[0]);
	  close (hpipe[0]);
	  return (-1);
	}
    }
  close (wrapPipe[0]);

  if (write (hpipe[0], (char *) &len, sizeof (len)) != sizeof (len))
    {
      ls_syslog (LOG_ERR, I18N_FUNC_FAIL_M, fname, "write");
      xdr_destroy (&xdrs);
      close (hpipe[0]);
      return (-1);
    }

  if (write (hpipe[0], buf, len) != len)
    {
      ls_syslog (LOG_ERR, I18N_FUNC_FAIL_M, fname, "write");
      xdr_destroy (&xdrs);
      close (hpipe[0]);
      return (-1);
    }
  xdr_destroy (&xdrs);
  close (hpipe[0]);
  return (0);
}
Esempio n. 12
0
int
lsMsgSnd_(int taskid, char *buffer, int len, int options)
{
    struct LSFHeader header;
    char headerBuf[sizeof(struct LSFHeader)];
    XDR xdrs;
    struct tid *tEnt;
    int rc;
    char hostname[MAXHOSTNAMELEN];

    tEnt = tid_find(taskid);
    if (! tEnt)
	return -1;

    if (tEnt->sock < 0) {
	lserrno = LSE_LOSTCON;
	return -1;
    }

#ifdef OS_HAS_PTHREAD
    pthread_mutex_lock(&fdLSLIBWriteMutex);
#endif

    header.opCode = RES_NONRES;
    header.refCode = currentSN = REQUESTSN;
    header.length = len;
    header.reserved = taskid;

    gethostbysock_(tEnt->sock, hostname);
    if (strcmp(hostname, "LSF_HOST_NULL"))
	_setcurseqno_(hostname, currentSN);

    xdrmem_create(&xdrs, headerBuf, LSF_HEADER_LEN, XDR_ENCODE);
    if (!xdr_LSFHeader(&xdrs, &header)) {
	lserrno = LSE_BAD_XDR;
	xdr_destroy(&xdrs);
	rc = -1;
        goto AbortSnd;
    }
    xdr_destroy(&xdrs);

    rc = b_write_fix(tEnt->sock, headerBuf, LSF_HEADER_LEN);
    if (rc < 0) {
	if (errno == EPIPE) {

	    close(tEnt->sock);
	    tEnt->sock = -1;
	    _lostconnection_(hostname);
	    lserrno = LSE_LOSTCON;
	}
        rc = -1;
        goto AbortSnd;
    }

    rc = b_write_fix(tEnt->sock, buffer, len);
    if (rc < 0) {
	if (errno == EPIPE) {
	    close(tEnt->sock);
	    tEnt->sock = -1;
	    _lostconnection_(hostname);
	    lserrno = LSE_LOSTCON;
	}
        rc = -1;
        goto AbortSnd;
    }
    if (ackReturnCode_(tEnt->sock) < 0) {
        rc = -1;
        goto AbortSnd;
    }

  AbortSnd:

#ifdef OS_HAS_PTHREAD
    pthread_mutex_unlock(&fdLSLIBWriteMutex);
#endif

    return rc;

}
Esempio n. 13
0
int
runEexec_(char *option, int job, struct lenData *eexec, char *path)
{
    static char fname[] = "runEexec";
    char eexecPath[MAXFILENAMELEN], *myargv[3];
    int pid = -1, i, p[2], cc, isRenew = FALSE;
    struct stat sbuf;

    if (strcmp (option, "-r") == 0)
	isRenew = TRUE;

    if (isRenew == TRUE) {
	if (path[0] == '\0')
	    strcpy(eexecPath, EEXECNAME);
	else
	    sprintf(eexecPath, "%s/%s", path, EEXECNAME);
    } else {
        sprintf(eexecPath, "%s/%s", genParams_[LSF_SERVERDIR].paramValue, EEXECNAME);
    }

    if (logclass & LC_TRACE)
        ls_syslog(LOG_DEBUG,"%s: eexec path, option and data length of job/task <%d> are <%s>, <%s> and <%d>",fname, job, eexecPath, option, eexec->len);


    if (stat(eexecPath, &sbuf) < 0) {
	    if (logclass & LC_TRACE)
	        ls_syslog(LOG_DEBUG,
		      "%s: Job/task <%d> eexec will not be run, stat(%s) failed: %m", fname, job, eexecPath);
	        lserrno = LSE_ESUB;
	        return -1;
    }

    i = 0;
    myargv[i++] = eexecPath;
    if (strcmp (option, "-r") == 0)
        myargv[i++] = "-r";

    myargv[i] = NULL;


    if (pipe(p) < 0) {
	lserrno = LSE_PIPE;
	return -1;
    }

    if ((pid = fork()) == 0) {
	char *user;
        uid_t uid;

        {
            struct passwd *pw;

            if ((user = getenv("LSFUSER")) != NULL) {
                if (getUid(user, &uid) < 0) {
                    ls_syslog(LOG_ERR, I18N_FUNC_S_FAIL_MM, fname, "getUid", user);
                    exit(-1);
                }
            } else {

                user = getenv("USER");
                if ((pw = getpwnam(user)) == NULL) {
                    ls_syslog(LOG_ERR, I18N_FUNC_S_FAIL_M, fname, "getpwnam", user);
                    exit(-1);
                }
                uid = pw->pw_uid;
            }
        }

	if (setuid(uid) < 0) {
	    ls_syslog(LOG_ERR, I18N_FUNC_D_FAIL_M, fname, "setuid", (int) uid);
	    exit (-1);
	}

	if (setpgid(0, getpid()) <0) {
	    ls_syslog(LOG_ERR, I18N_FUNC_FAIL_M, fname, "setpgid");
	    exit (-1);
	}

	for (i = 1; i < NSIG; i++)
	    Signal_(i, SIG_DFL);

	alarm(0);

	close(p[1]);
	if (dup2(p[0], 0) == -1) {
	    ls_syslog(LOG_ERR, I18N_FUNC_FAIL_M,  fname, "dup2(stdin,0)");
	}

	for (i = 3; i < sysconf(_SC_OPEN_MAX); i++)
            close(i);

        execvp(myargv[0], myargv);
	ls_syslog(LOG_ERR, I18N_FUNC_S_FAIL_M, fname, "execvp", myargv[0]);
        exit(-1);
    }

    if (pid == -1) {
	ls_syslog(LOG_ERR, I18N_FUNC_FAIL_M, fname, "fork");
	close(p[0]);
	close(p[1]);
	lserrno = LSE_FORK;
	return -1;
    }

    close(p[0]);

    if (eexec->len > 0) {
	if ((cc = b_write_fix(p[1], eexec->data, eexec->len)) != eexec->len &&
	    strcmp (option, "-p")) {
	    ls_syslog(LOG_ERR, I18N_FUNC_D_FAIL_M, fname, "b_write_fix", eexec->len);
	}
    }

    close(p[1]);

    while (waitpid(pid, NULL, 0) < 0 && errno == EINTR)
	;

    return 0;

}