Minor fix to Pathto
Marc Elvy
elvy at harvard.ARPA
Wed Aug 15 06:19:44 AEST 1984
()
It was pointed out that the pathto program had a minor bug in its error
reporting. Namely "pathto -h" passed the argument on to the host machine,
where it was rejected as an illegal switch. While it will not cause anything
to malfunction (now), if a -h flag is ever added to rpath, then things will
not work correctly, so I fixed it. The new version is enclosed.
Sorry about that.
Marc
Enc.
---------------------
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <netdb.h>
/*
** $Header: pathto.c,v 1.4 84/08/14 15:39:45 source Exp $
**
** This is the frontend TCP program for Harvard's pathalias database.
** It makes a connection with a host machine (default harvard.arpa)
** and queries that host about the paths from the HOST to other network
** sites around the world. The sites should be listed on the command
** line, and paths to them through various networks will be returned.
** At present the ARPANET and the UUCP network are known about. Others
** may be integrated later. Note that, unfortunately, the path given
** is from the host (usually harvard), so routing will be through it.
**
** Questions or comments should be posted to elvy at harvard.{uucp,arpa}.
** I would appreciate being warned of any bugs and fixes. Marc Elvy
*/
# define PATHHOST "harvard"
main (argc, argv)
int argc;
char **argv;
{
register int c, s;
register FILE *sfi, *sfo;
char *host = PATHHOST, *NAME = *argv;
char buffer[512], *strcat();
struct sockaddr_in sin;
struct hostent *hp;
struct servent *sp;
extern int errno;
--argc, ++argv;
/*
** If the "-h" option (which is, currently, the only option) is given,
** we reset the host to a machine other than PATHHOST. This should
** be done if another database machine is closer than PATHHOST. If
** another machine is ALWAYS closer, then PATHHOST should be changed.
*/
if ((argc < 1) || (strcmp (*argv, "-h") == 0))
{
if (argc > 2)
{
++argv, argc -= 2;
host = *argv++;
}
else
{
fprintf (stderr, "Usage: %s [ -h host ] site(s)\n", NAME);
exit (1);
}
}
if ((hp = gethostbyname (host)) == (struct hostent *) NULL)
{
fprintf (stderr, "%s: Unknown host (%s).\n", NAME, host);
exit (1);
}
host = hp->h_name;
if ((s = socket (hp->h_addrtype, SOCK_STREAM, 0)) < 0)
{
perror ("pathto (socket)");
exit (errno);
}
sin.sin_family = hp->h_addrtype;
if (bind (s, (struct sockaddr *) &sin, sizeof (sin)) < 0)
{
perror ("pathto (bind)");
exit (errno);
}
bcopy (hp->h_addr, &sin.sin_addr, hp->h_length);
if ((sp = getservbyname ("path", "tcp")) == NULL)
{
fprintf (stderr, "%s: TCP/path is an unknown service.\n", NAME);
exit (4);
}
sin.sin_port = sp->s_port;
if (connect (s, (struct sockaddr *) &sin, sizeof (sin)) < 0)
{
perror ("pathto (connect)");
exit (errno);
}
if (((sfi = fdopen (s, "r")) == (FILE *) NULL) ||
((sfo = fdopen (s, "w")) == (FILE *) NULL))
{
perror ("fdopen");
(void) close (s);
exit (errno);
}
*buffer = (char) NULL;
while (*argv)
{
(void) strcat (buffer, *argv++);
(void) strcat (buffer, " ");
}
(void) strcat (buffer, "\n");
(void) fputs (buffer, sfo);
(void) fflush(sfo);
while ((c = getc (sfi)) != EOF)
putchar (c);
(void) fclose(sfo);
(void) fclose(sfi);
}
Marc A. Elvy ( elvy at harvard.{arpa,uucp} )
Aiken Computation Laboratory
Harvard University
More information about the Comp.sources.unix
mailing list