hostname(1) change

Kent Ibbetson bsd at kibbet.com
Sun Jan 4 16:48:13 PST 2004


Hi all,

Attached is a patch for hostname(1) which allows you set the hostname
based on a supplied IP address.  I use it to set the hostname when I
dial in.

hostname -r IP_ADDR  is much easier to type than
hostname `host IP_ADDR | awk '{print $5}'`


Maybe someone else will find it useful, maybe its just junk :)


Cheers,

-- 
Kent Ibbetson
bsd at xxxxxxxxxx
*** bin/hostname/hostname.c.orig	Mon Jan  5 09:54:13 2004
--- bin/hostname/hostname.c	Mon Jan  5 09:57:43 2004
***************
*** 44,61 ****
  #include <string.h>
  #include <unistd.h>
  
  int main (int, char *[]);
  void usage (void);
  
  int
  main(int argc, char **argv)
  {
! 	int ch, sflag;
  	char *p, hostname[MAXHOSTNAMELEN];
  
! 	sflag = 0;
! 	while ((ch = getopt(argc, argv, "s")) != -1)
  		switch (ch) {
  		case 's':
  			sflag = 1;
  			break;
--- 44,82 ----
  #include <string.h>
  #include <unistd.h>
  
+ #include <netdb.h>
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ #include <arpa/inet.h>
+ 
+ 
  int main (int, char *[]);
  void usage (void);
  
  int
  main(int argc, char **argv)
  {
! 	int ch,sflag,rflag,ret;
  	char *p, hostname[MAXHOSTNAMELEN];
+ 	char *srflag;
+ 	struct hostent *hst = NULL;
+ 	struct in_addr ia;
+ 
+ 	srflag = NULL;
+ 	sflag = rflag = 0;
  
! 	while ((ch = getopt(argc, argv, "r:s")) != -1)
  		switch (ch) {
+ 		case 'r':
+ 			srflag = (char*)calloc(1,sizeof(char) * (strlen((char*)optarg)+1));
+ 			if(srflag) {
+ 				rflag = 1;
+ 				strlcpy(srflag, (char*)optarg, strlen((char*)optarg)+1);
+ 			} else {
+ 				errx(1, "malloc");
+ 			}
+ 			break;
  		case 's':
  			sflag = 1;
  			break;
***************
*** 69,75 ****
  	if (argc > 1)
  		usage();
  
! 	if (*argv) {
  		if (sethostname(*argv, (int)strlen(*argv)))
  			err(1, "sethostname");
  	} else {
--- 90,118 ----
  	if (argc > 1)
  		usage();
  
! 	if (rflag && *argv) {
! 		free(srflag);
! 		usage();
! 	}
! 
! 
! 	if(rflag) {
! 		ret = inet_pton(AF_INET, srflag, &ia);
! 		if(ret != 1) {
! 			free(srflag);
! 			errx(1, "invalid ip address");
! 		}
! 		
! 		hst = gethostbyaddr((const char*)&ia, sizeof(ia), AF_INET);
! 		if(!hst) {
! 			free(srflag);
! 			if(h_errno == HOST_NOT_FOUND) 
! 				errx(1,"host not found\n");
! 		}
! 
! 		if (sethostname(hst->h_name, (int)strlen(hst->h_name)))
! 			err(1, "sethostname");
! 	} else if (*argv) {
  		if (sethostname(*argv, (int)strlen(*argv)))
  			err(1, "sethostname");
  	} else {
***************
*** 86,91 ****
  usage(void)
  {
  
! 	(void)fprintf(stderr, "usage: hostname [-s] [name-of-host]\n");
  	exit(1);
  }
--- 129,134 ----
  usage(void)
  {
  
! 	(void)fprintf(stderr, "usage: hostname [-s] [name-of-host | -r ip-address]\n");
  	exit(1);
  }
*** bin/hostname/hostname.1.orig	Mon Jan  5 09:54:13 2004
--- bin/hostname/hostname.1	Mon Jan  5 09:54:38 2004
***************
*** 42,48 ****
  .Sh SYNOPSIS
  .Nm
  .Op Fl s
! .Op Ar name-of-host
  .Sh DESCRIPTION
  The
  .Nm
--- 42,48 ----
  .Sh SYNOPSIS
  .Nm
  .Op Fl s
! .Op Ar name-of-host | -r ip-address
  .Sh DESCRIPTION
  The
  .Nm
***************
*** 62,67 ****
--- 62,71 ----
  .It Fl s
  Trim off any domain information from the printed
  name.
+ .It Fl r
+ Retrive hostname via ip lookup.  The hostname is set to the first (official)
+ name returned for the supplied ip address.
+ 
  .El
  .Sh SEE ALSO
  .Xr gethostname 3 ,




More information about the Submit mailing list