uucp@relay.eu.net@@uunet.uu.net:tuvie.UUCP (08/31/90)
Posting-number: Volume 14, Issue 75 Submitted-by: uucp@relay.eu.net@@uunet.uu.net:tuvie.UUCP Archive-name: termserv/part01 I wrote that little program, because in out office there is a need to determine the real terminal of a user(terminal-type) and all out terminals are connected to our hosts via ethernet and terminal servers' So, coming thru a telnetd it's not easy to determine the terminal type OK, that is our solution of that problem. BTW: our name of the program is termserv, see the code for description Pleschutznig Andreas Bel Computer Systems (andy@mssx) -----------CUT HERE-------- #! /bin/sh # This file was wrapped with "dummyshar". "sh" this file to extract. # Contents: termserv.c echo extracting 'termserv.c' if test -f 'termserv.c' -a -z "$1"; then echo Not overwriting 'termserv.c'; else sed 's/^X//' << \EOF > 'termserv.c' X#include <stdio.h> X#include <fcntl.h> X#include <sys/signal.h> X#include <sys/types.h> X#include <sys/socket.h> X#include <netinet/in.h> X#include <netdb.h> X X/* for systems that don't have a modern select() */ X#ifndef FD_SETSIZE X#define FD_SETSIZE NOFILE X#endif X Xstruct servent *getservbyname(); X X Xvoid Xcatch(sig) Xint sig; X{ X fprintf(stderr,"termserv: catched signal %d\n",sig); X fprintf(stderr,"Exiting ...\n"); X} X Xmain(argc, argv) Xint argc; Xchar *argv[]; X{ X char buffer[1024]; X register int sfd, len; X struct sockaddr_in inaddr; X struct hostent *hp; X struct servent *service; X char buf; X int inout; X int sigs; X X /* catch all types of signals before exit */ X for ( sigs = 0; sigs < NSIG; sigs++) X signal(sigs, catch); X X /* check number of arguments */ X if (argc != 4) { X perror(argv[0]); X exit(1); X } X X /* create a socket */ X if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { X fprintf(stderr, "%s: can't open socket\n", argv[0]); X exit(2); X } X X /* resolve network address of NCD unit */ X inaddr.sin_family = AF_INET; X if ((service = getservbyname(argv[2],"tcp")) == NULL) X { X fprintf(stderr,"%s: unable to get service %s\n",argv[0],argv[2]); X exit(1); X } X#ifdef DEBUG Xfprintf(stderr,"Service Port ID: %d\n",ntohs(service->s_port)); X#endif X inaddr.sin_port = service->s_port; X if ((inaddr.sin_addr.s_addr = inet_addr(argv[1])) == -1) { X if ((hp = gethostbyname(argv[1])) == NULL X || hp->h_addrtype != AF_INET) { X fprintf(stderr, "%s: can't resolve name %s\n", X argv[0], argv[1]); X exit(3); X } X bcopy(hp->h_addr, &inaddr.sin_addr.s_addr, hp->h_length); X } X X /* connect to NCD RS-232 daemon */ X if (connect(sfd, &inaddr, sizeof(inaddr)) < 0) { X perror(argv[0]); X exit(4); X } X X inout= open(argv[3],O_RDWR); X if (inout < 0) { X fprintf(stderr,"%s can't open %s for communication",argv[0],argv[3]); X perror(argv[0]); X exit(5); X } X X close(0); X if (dup(inout) != 0) { X perror(argv[0]); X exit(6); X } X#ifdef DEBUG Xfprintf(stderr,"stdin redirected\n"); X#endif X close(1); X if (dup(inout) != 1) { X perror(argv[0]); X exit(7); X } X#ifdef DEBUG Xfprintf(stderr,"stdout redirected\n"); X#endif X X /* X * do bi-directional I/O until EOF or error X * X * The actions on EOF and error should be customized X * for the specific device and application. For example, X * one might want to continue reading from the network, X * even after EOF has been reached on stdin. X */ X while (1) { X fd_set rfds; X X FD_ZERO(&rfds); X FD_SET(sfd, &rfds); X FD_SET(0, &rfds); X if (select(FD_SETSIZE, &rfds, NULL, NULL, NULL) < 0) X break; X X /* read stdin, write output to network connection */ X if (FD_ISSET(0, &rfds)) { X if ((len = read(0, buffer, sizeof(buffer))) > 0) X write(sfd, buffer, len); X X/* else EOF or error X break; X*/ X } X X /* X * read any messages from the network, and write them to stdout X * X * Some printers, such as Laserwriters send back logging info. X */ X if (FD_ISSET(sfd, &rfds)) X { X if ((len = read(sfd, &buf, 1)) > 0) X if ( buf != '\0' ) X { X write(1, &buf, 1 ); X#ifdef DEBUG X fprintf(stderr,"%02x\n",(int)buf); X#endif X } X/* X else EOF or error X break; X*/ X } X } X X /* clean up */ X exit(0); X} EOF chars=`wc -c < 'termserv.c'` if test $chars != 3163; then echo 'termserv.c' is $chars characters, should be 3163 characters!; fi fi exit 0