diff options
Diffstat (limited to 'training/utils/sentclient.c')
| -rw-r--r-- | training/utils/sentclient.c | 76 | 
1 files changed, 76 insertions, 0 deletions
| diff --git a/training/utils/sentclient.c b/training/utils/sentclient.c new file mode 100644 index 00000000..91d994ab --- /dev/null +++ b/training/utils/sentclient.c @@ -0,0 +1,76 @@ +/* Copyright (c) 2001 by David Chiang. All rights reserved.*/ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <netinet/in.h> +#include <netdb.h> +#include <string.h> + +#include "sentserver.h" + +int main (int argc, char *argv[]) { +  int sock, port; +  char *s, *key; +  struct hostent *hp; +  struct sockaddr_in server; +  int errors = 0; + +  if (argc < 3) { +    fprintf(stderr, "Usage: sentclient host[:port[:key]] command [args ...]\n"); +    exit(1); +  } + +  s = strchr(argv[1], ':'); +  key = NULL; + +  if (s == NULL) { +    port = DEFAULT_PORT; +  } else { +    *s = '\0'; +    s+=1; +	/* dumb hack */ +	key = strchr(s, ':'); +	if (key != NULL){ +		*key = '\0'; +		key += 1; +	} +    port = atoi(s); +  } + +  sock = socket(AF_INET, SOCK_STREAM, 0); + +  hp = gethostbyname(argv[1]); +  if (hp == NULL) { +    fprintf(stderr, "unknown host %s\n", argv[1]); +    exit(1); +  } + +  bzero((char *)&server, sizeof(server)); +  bcopy(hp->h_addr, (char *)&server.sin_addr, hp->h_length); +  server.sin_family = hp->h_addrtype; +  server.sin_port = htons(port); + +  while (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) { +    perror("connect()"); +    sleep(1); +    errors++; +    if (errors > 5) +      exit(1); +  } + +  close(0); +  close(1); +  dup2(sock, 0); +  dup2(sock, 1); + +  if (key != NULL){ +	write(1, key, strlen(key)); +	write(1, "\n", 1); +  } + +  execvp(argv[2], argv+2); +  return 0; +} | 
