Ejemplo n.º 1
0
/* 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;
}
Ejemplo n.º 2
0
/* 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);
}