DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T r

⟦601e20b2a⟧ TextFile

    Length: 2560 (0xa00)
    Types: TextFile
    Notes: Tarfile:Truncated
    Names: »rsh.c«

Derivation

└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
    └─⟦653021b30⟧ »EurOpenD3/utils/downtime.tar.Z« 
        └─⟦946c717da⟧ 
            └─⟦this⟧ »libgen/rsh.c« 

TextFile

#ifndef lint
static char *RCSid = "$Header: rsh.c,v 1.1 88/04/19 14:08:55 mcooper Exp $";
#endif

/*
 *------------------------------------------------------------------
 *
 * $Source: /usr/skat3/src/common/usc/lib/libgen/RCS/rsh.c,v $
 * $Revision: 1.1 $
 * $Date: 88/04/19 14:08:55 $
 * $State: Exp $
 * $Author: mcooper $
 * $Locker:  $
 *
 *------------------------------------------------------------------
 *
 * Michael A. Cooper
 * Research and Development Group
 * University Computing Services 
 * University of Southern California
 * (mcooper@oberon.USC.EDU)
 *
 *------------------------------------------------------------------
 *
 * $Log:	rsh.c,v $
 * Revision 1.1  88/04/19  14:08:55  mcooper
 * Initial revision
 * 
 * 
 *------------------------------------------------------------------
 */


#include <stdio.h>
#include <sys/signal.h>
#include <sys/wait.h>
#include <setjmp.h>

#define RSH        "/usr/ucb/rsh"
#define TESTCMD    "/bin/date"

/*
 * rshcheck - Stupid kludge to make sure rsh(1c) and other remote 
 *            clientswill not hang.
 *            This often happens with Yellow Page clients who lose
 *            there domain server(s).
 */

int pid;
jmp_buf env;

rshcheck(host, user)
     char *host, *user;
{
  int rshtime();
  int rshtimeout = 180;  /* time out of 3 minutes */
  int status, i;
  
  if (host == NULL) {
    return(2);
  }

  signal(SIGALRM, rshtime);
  
  alarm(rshtimeout);
  
  if (setjmp(env)) {
    return(1);
  } else {
    if ((pid = fork()) == 0) {
      (void) close(0);
      (void) close(1);
      (void) close(2);
      if (user != NULL) {
	execl(RSH, argv_zero(RSH), host, "-l", user, TESTCMD, 0);
      } else {
	execl(RSH, argv_zero(RSH), host, TESTCMD, 0);
      }
      perror("exec failed");
      exit(127);
    } else {
      while ((i = wait(&status)) != pid && i != -1)
	;
    }
  }
  
  alarm(0);
  
  return(0);
}

rshtime()
{
  if (pid > 1) {
    kill(pid, SIGKILL);
  }
  longjmp(env, 1);
}


/*
 * rsh - Run an rsh(1c) request given a host, username, and 
 *       a command to run.
 */

rsh(host, user, cmd)
     char *host;
     char *user;
     char **cmd;
{
  char **buf, **pp;
  int w, pid, x;
  union wait status;
  
  if (host == NULL) {
    return(-1);
  }
  
  pp = cmd;
  x = 0;
  while(*pp++ != NULL)
    x++;
  
  if ((buf = (char **) calloc(x+10, sizeof (char *))) == NULL) {
    perror("calloc");
    return(-1);
  }
  
  pp = buf;
  
  *buf++ = (char *) argv_zero(RSH);
  *buf++ = host;
  if (user != NULL) {
    *buf++ = "-l";
    *buf++ = user;
  }
  
  while