⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 registerhost.c

📁 早期freebsd实现
💻 C
字号:
/* $Header: registerhost.c,v 2.5 87/04/01 11:48:11 jqj Exp $ *//* * This program enters a Unix host into the Clearinghouse as a server and * workstation, hence eligible for gap telnet  *//* * $Log:	registerhost.c,v $ * Revision 2.5  87/04/01  11:48:11  jqj * merged Webster changes: added -f switch for registering as file service *  * Revision 2.4  87/02/19  13:29:59  jqj * If hostname() returns a fully qualified Internet domain name, use only * the leaf (first) componenent. *  * Revision 2.3  86/12/15  11:27:06  jqj * rework address code to permit multihomed hosts. *  * Revision 2.2  86/05/07  14:05:27  jqj * eliminated use of ns_netof, since it has alignment problems on Gould *  * Revision 2.1  85/12/17  10:25:34  jqj * from Sklower:  default to our address as set by ifconfig *  * Revision 2.0  85/11/21  07:22:36  jqj * 4.3BSD standard release *  * Revision 1.1  85/11/20  13:54:08  jqj * Initial revision *  */#include <stdio.h>#include <sys/types.h>#include <netns/ns.h>#include "Clearinghouse2_defs.h"#include <xnscourier/CHEntries.h>#include <xnscourier/CH.h>#include <xnscourier/except.h>char *ItemToString(item)	Item item;{	char *strval;	Unspecified buf[501], *bp;	Cardinal len;	externalize_Item(&item, buf);	bp = buf;	bp += internalize_Cardinal(&len, bp);	bp += internalize_String(&strval, bp);		return(strval);}ItemStringToItem(strval)	String strval;{	Unspecified buf[501], *bp;	Item item;	Cardinal len;	bp = buf + sizeof_Cardinal(len);	len = externalize_String(&strval, bp);	(void) externalize_Cardinal(&len, buf);	internalize_Item(&item, buf);	return(item);}intisprop(prop, proplist)	Property prop;	Properties proplist;{	int i;	prop = prop<<16;	/* correct for bug in Clearinghouse v 2 */	for (i=0; i < proplist.length; i++) {		if (proplist.sequence[i] == prop) return(1);	}	return(0);		/* not found */}char *XNSaddrToString(addr)	struct ns_addr *addr;{	u_char *s;	static char buf[21];	union {		u_short y_net[2];		u_long y_long;	} netvalue;	s = addr->x_host.c_host;	netvalue.y_net[0] = addr->x_net.s_net[0];	netvalue.y_net[1] = addr->x_net.s_net[1];	sprintf(buf,"%lx#%x.%x.%x.%x.%x.%x#%x",		ntohl(netvalue.y_long),		s[0], s[1], s[2], s[3], s[4], s[5],		ntohs(addr->x_port));	return(buf);}addNAelem(nalistp, addr)	NetworkAddressList *nalistp;	struct ns_addr *addr;{	register NetworkAddress *naddrp;		naddrp = nalistp->sequence + nalistp->length;				nalistp->length++;	naddrp->network[0] = htons(addr->x_net.s_net[0]);	naddrp->network[1] = htons(addr->x_net.s_net[1]);	naddrp->host[0] = htons(addr->x_host.s_host[0]);	naddrp->host[1] = htons(addr->x_host.s_host[1]);	naddrp->host[2] = htons(addr->x_host.s_host[2]);}Itemgetaddresslist(myaddr)	struct ns_addr *myaddr;{	char addrstr[200];	struct ns_addr addr;	extern struct ns_addr ns_addr();	NetworkAddressList nalist;	Unspecified buf[501], *bp;	Item item;	Cardinal len;	NetworkAddress naddrs[10];		nalist.length = 0;	nalist.sequence = naddrs;	printf("NS address (e.g. 2-273#2-613-688-939-672, - for default, CR to end):\nPrimary NS address: ");		/* get list of addresses */	gets(addrstr);	while (*addrstr != 0) {		if (*addrstr=='-') {			addNAelem(&nalist, myaddr);		} else {			addr = ns_addr(addrstr);			addNAelem(&nalist, &addr);		}		printf("Additional NS address (CR for none): ");		gets(addrstr);	}		/* canonicalize socket #s */	for (len = 0; len < nalist.length; len++)		nalist.sequence[len].socket = 0;			/* encode */	bp = buf + sizeof_Cardinal(len);	len = externalize_NetworkAddressList(&nalist, bp);	(void) externalize_Cardinal(&len, buf);	internalize_Item(&item, buf);	return(item);}main(argc, argv)	int argc;	char *argv[];{	ObjectName myname, name, defname, fsname;	struct ns_addr *destaddr, *getXNSaddr(), *myaddr;	struct sockaddr_ns sns;	Authenticator agent;	CourierConnection *conn;	int i;	ListPropertiesResults LPresult;	RetrieveItemResults RIresult;	ChangeItemResults CIresult;	AddItemPropertyResults AIPresult;	char *pwd, *propval, *getXNSpass(), *malloc(), *gets(), 		mystrname[200], *myhostname;	String ItemToString();	Item item, StringToItem(), addrToItem();	Property propnum;	struct ns_addr *addr;	static Boolean authseq[2] = {1, 0};	/* simple, not strong */	Boolean fileservice= 0;	int opt;	extern int optind;	extern char *optarg;	if (argc < 1 || argc > 5) {		fprintf(stderr,"Usage: %s [-f] [hostname]\n",argv[0]);		exit(1);	}	while ( (opt= getopt(argc, argv, "f")) != EOF )		switch (opt) {			case 'f' :				fileservice++;				break;			default :				fprintf(stderr,  "Invalid command option -%c\n", opt);				exit(1);		}	CH_NameDefault(&defname);	if (argc == optind) {	    char *tmp; extern char *index();	    gethostname(myhostname=malloc(100), 100);	    if ((tmp = index(myhostname,'.')) != NULL)	    	*tmp = '\0';	    name = CH_StringToName(myhostname, &defname);	} else	    name = CH_StringToName(argv[optind], &defname);	printf("Registering host %s\n",		CH_NameToString(name) );	printf("XNS UserName: ");	gets(mystrname);	myname = CH_StringToName(mystrname, &name);	pwd = getXNSpass("Password:");	MakeSimpleCredsAndVerifier(&myname,pwd,			&agent.credentials, &agent.verifier);	conn = CH_GetFirstCH();	i = sizeof(sns); myaddr = &sns.sns_addr;	getsockname(*(int *)conn, &sns, &i); myaddr->x_port = 0;	DURING {		LPresult = ListProperties(conn,NULL,name,agent);	} HANDLER {		if (Exception.Code == ArgumentError) {		  DURING CreateObject(conn,NULL,name,agent);		  HANDLER {			fprintf(stderr,"Can't create object. Error %d\n",				Exception.Code);			exit(1);		  } END_HANDLER;		  LPresult.properties.length = 0;		}		else {		  fprintf(stderr,"ListProperties failed.  Error %d\n",			Exception.Code);		  exit(1);		}	} END_HANDLER;	/* AddressList property */	if (isprop(4,LPresult.properties)) {		addr = CH_LookupAddr(name,4);		if (addr==0) {		    fprintf(stderr,"NetworkAddress is in property list, but CH_LookupAddr failed\n");		    exit(1);		}		printf("Old address: %s\n",XNSaddrToString(addr));		myaddr->x_port = 0;		item = getaddresslist(myaddr);		DURING CIresult = ChangeItem(conn,NULL, name,4,item,agent);		HANDLER {		  fprintf(stderr,"Can't change address.  Error %d\n",			 Exception.Code);		  exit(1);		} END_HANDLER;	} else {		item = getaddresslist(myaddr);		DURING		  AIPresult = AddItemProperty(conn,NULL,name,4,item,agent);		HANDLER {		  fprintf(stderr,"Can't add address property.  Error %d\n",			Exception.Code);		  exit(1);		} END_HANDLER;	}	/* AuthenticationLevel property */	if (!isprop(8,LPresult.properties)) {		item.length = 2;		item.sequence = (Unspecified *) authseq;		DURING		  AIPresult = AddItemProperty(conn,NULL,name,8,item,agent);		HANDLER {		  fprintf(stderr,"Can't add AuthenticationLevel property.\n");		  exit(1);		} END_HANDLER;	}	/* description */	DURING {		propnum = 10005; /* 10005<<16; */		if (isprop(propnum,LPresult.properties)) {			RIresult = RetrieveItem(conn, NULL,					name,					propnum, agent);			propval = ItemToString(RIresult.value);			printf("Workstation description (Property 10005) has value ``%s''\n",			       propval );			clear_RetrieveItemResults(&RIresult);		}		propnum = 10024; /* 10024<<16; */		if (isprop(propnum,LPresult.properties)) {			RIresult = RetrieveItem(conn, NULL,					name,					propnum, agent);			propval = ItemToString(RIresult.value);			printf("Server description (Property 10024) has value ``%s''\nNew value: ",			       propval );			propval = gets(malloc(100));			item = StringToItem(propval);			CIresult = ChangeItem(conn, NULL,					name,					propnum, item, agent);			clear_RetrieveItemResults(&RIresult);		} else {			printf("Enter new description: ");			propval = gets(malloc(100));			item = StringToItem(propval);			AIPresult = AddItemProperty(conn, NULL,					name,					propnum, item, agent);		}		if ( fileservice ) {			propnum= 10000; /* 10000<<16 */			if (isprop(10000,LPresult.properties)) {				RIresult = RetrieveItem(conn, NULL,						name,						propnum, agent);				propval = ItemToString(RIresult.value);				printf("FileService description (Property 10000) has value ``%s''\nNew value: ",				       propval );				propval = gets(malloc(100));				item = StringToItem(propval);				CIresult = ChangeItem(conn, NULL,						name,						propnum, item, agent);			} else {				printf("Enter new FileService description: ");				propval = gets(malloc(100));				item = StringToItem(propval);				AIPresult = AddItemProperty(conn, NULL,						name,						propnum, item, agent);			}		}	} HANDLER {		fprintf(stderr,			"Error during Property manipulations, %d (%d)\n",			Exception.Code,			CourierErrArgs(Clearinghouse2_CallErrorArgs,problem) );	} END_HANDLER;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -