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

📄 ypcat.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#ifndef lintstatic	char	*sccsid = "@(#)ypcat.c	4.3	(ULTRIX)	11/9/90";#endif lint/**************************************************************** *								* *  Licensed to Digital Equipment Corporation, Maynard, MA	* *		Copyright 1985 Sun Microsystems, Inc.		* *			All rights reserved.			* *								* ****************************************************************//*  * Modification history: * * 10/30/90     terry *              Changed services.byport back to services.byname for  *              backwards compatibility with ULTRIX v4.0 * * 08/30/90 	terry *		Changed default services map from services.byname to * 		services.byport, corresponding to changes made to the YP maps. *//* * This is a user command which dumps each entry in a yp data base. * It gets the info using the normal ypclnt package. * The user doesn't get to choose which server gives him the input. * Usage is: * ypcat [-k] [-d domain] [-t] map * ypcat -x * where the -k switch will dump keys followed by a single blank space * before the value, and the -d switch can be used to specify a domain * other than the default domain. *  * Normally, passwd gets converted to passwd.byname, and similarly for * the other standard files.  -t inhibits this translation. *  * The -x switch will dump the map nickname translation table.   */#ifdef NULL#undef NULL#endif#define NULL 0#include <stdio.h>#include <rpc/rpc.h>#include <rpcsvc/ypclnt.h>#include <rpcsvc/yp_prot.h>#include <rpcsvc/ypv1_prot.h>int dumpkeys = FALSE;int translate = TRUE;int dodump = FALSE;char *domain = NULL;char default_domain_name[YPMAXDOMAIN];char *map = NULL;char nullstring[] = "";char err_usage[] ="Usage:\n\	ypcat [-k] [-d domainname] [-t] mapname\n\	ypcat -x\n";char err_bad_args[] =	"ypcat:  %s argument is bad.\n";char err_cant_get_kname[] =	"ypcat:  can't get %s back from system call.\n";char err_null_kname[] =	"ypcat:  the %s hasn't been set on this machine.\n";char err_bad_mapname[] = "mapname";char err_bad_domainname[] = "domainname";char err_cant_bind[] =	"ypcat:  can't bind to yp server for domain %s.  Reason:  %s.\n";char err_first_failed[] =	"ypcat:  can't get first record from yp.  Reason:  %s.\n";char err_next_failed[] =	"ypcat:  can't get next record from yp.  Reason:  %s.\n";char *transtable[] = {	"passwd", "passwd.byname",	"group", "group.byname",	"networks", "networks.byaddr",	"hosts", "hosts.byaddr",	"protocols","protocols.bynumber",	"services","services.byname",	"aliases", "mail.aliases",	"ethers", "ethers.byname",	"rpc", "rpc.bynumber",	NULL};void get_command_line_args();void dumptable();int callback();void one_by_one_all();/* * This is the mainline for the ypcat process.  It pulls whatever arguments * have been passed from the command line, and uses defaults for the rest. */voidmain (argc, argv)	int argc;	char **argv;	{	char *key;	int keylen;	char *outkey;	int outkeylen;	char *val;	int vallen;	int err;	int i;	struct ypall_callback cbinfo;		get_command_line_args(argc, argv);	if (dodump) {		dumptable();		exit(0);	}	if (!domain) {				if (!getdomainname(default_domain_name, YPMAXDOMAIN) ) {			domain = default_domain_name;		} else {			fprintf(stderr, err_cant_get_kname, err_bad_domainname);			exit(1);		}		if (strlen(domain) == 0) {			fprintf(stderr, err_null_kname, err_bad_domainname);			exit(1);		}	}	if (err = yp_bind(domain) ) {		fprintf(stderr, err_cant_bind, domain,		    yperr_string(err) );		exit(1);	}	key = nullstring;	keylen = 0;	val = nullstring;	vallen = 0;		if (translate) {		for (i = 0; transtable[i]; i+=2)			if (strcmp(map, transtable[i]) == 0) {			    map = transtable[i+1];			    break;			}	}	cbinfo.foreach = callback;	cbinfo.data = (char *) NULL;	err = yp_all(domain, map, &cbinfo);	if (err == YPERR_VERS) {		one_by_one_all(domain, map);	}		exit(0);}/* * This does the command line argument processing. */static voidget_command_line_args(argc, argv)	int argc;	char **argv;	{	argv++;		while (--argc) {		if ( (*argv)[0] == '-') {			switch ((*argv)[1]) {			case 't': 				translate = FALSE;				argv++;				break;			case 'k': 				dumpkeys = TRUE;				argv++;				break;							case 'x': 				dodump = TRUE;				argv++;				break;			case 'd': 				if (argc > 1) {					argv++;					argc--;					domain = *argv;					argv++;					if (strlen(domain) > YPMAXDOMAIN) {						fprintf(stderr, err_bad_args,						    err_bad_domainname);						exit(1);					}									} else {					fprintf(stderr, err_usage);					exit(1);				}								break;							default: 				fprintf(stderr, err_usage);				exit(1);			}					} else {						if (!map) {				map = *argv;				if (!strcmp(map,"ypservers"))					dumpkeys = TRUE;				argv++;			} else {				fprintf(stderr, err_usage);				exit(1);			}		}	}	if (!map && !dodump) {		fprintf(stderr, err_usage);		exit(1);	}}/* * This will print out the map nickname translation table. */static voiddumptable(){	int i;	for (i = 0; transtable[i]; i += 2) {		printf("Use \"%s\" for map \"%s\"\n", transtable[i],		    transtable[i + 1]);	}}/* * This dumps out the value, optionally the key, and perhaps an error message. */static intcallback(status, key, kl, val, vl, notused)	int status;	char *key;	int kl;	char *val;	int vl;	char *notused;{	int e;		if (status == YP_TRUE) {		if (dumpkeys)			(void) printf("%.*s ", kl, key);		(void) printf("%.*s\n", vl, val);		return (FALSE);	} else {		e = ypprot_err(status);		if (e != YPERR_NOMORE)			(void) fprintf(stderr, "%s\n", yperr_string(e));				return (TRUE);	}}/* * This cats the map out by using the old one-by-one enumeration interface. * As such, it is prey to the old-style problems of rebinding to different * servers during the enumeration. */static voidone_by_one_all(domain, map){	char *key;	int keylen;	char *outkey;	int outkeylen;	char *val;	int vallen;	int err;	key = nullstring;	keylen = 0;	val = nullstring;	vallen = 0;		if (err = yp_first(domain, map, &outkey, &outkeylen, &val, &vallen) ) {		if (err == YPERR_NOMORE) {			exit(0);		} else {			fprintf(stderr, err_first_failed,			    yperr_string(err) );			exit(1);		}	}	while (TRUE) {		if (dumpkeys) {			printf("%.*s ", outkeylen, outkey);		}		printf("%.*s\n", vallen, val);		free(val);		key = outkey;		keylen = outkeylen;				if (err = yp_next(domain, map, key, keylen, &outkey, &outkeylen,		    &val, &vallen) ) {			if (err == YPERR_NOMORE) {				break;			} else {				fprintf(stderr, err_next_failed,				    yperr_string(err) );				exit(1);			}		}		free(key);	}}

⌨️ 快捷键说明

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