fred.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 2,257 行 · 第 1/4 页

C
2,257
字号
	continue;    for (bdn = (*b) -> dns_dn; bdn -> dn_parent; bdn = bdn -> dn_parent)	continue;    i = rdn_cmp (adn -> dn_rdn, bdn -> dn_rdn);    return (i == (-1) || i == 1 ? i : 0);}static int	dns_sort (dns, i)struct dn_seq **dns;int	i;{    register struct dn_seq *ptr;    if (i == 0)	for (ptr = *dns; ptr; ptr = ptr -> dns_next)	    i++;    if (i > 1) {	struct dn_seq **base,		      **bp,		      **ep;	if (base = (struct dn_seq **) malloc ((unsigned) (i * sizeof *base))) {	    ep = base;	    for (ptr = *dns; ptr; ptr = ptr -> dns_next)		*ep++ = ptr;	    qsort ((char *) base, i, sizeof *base, (IFP) dns_compar);	    bp = base;	    ptr = *dns = *bp++;	    while (bp < ep) {		ptr -> dns_next = *bp;		ptr = *bp++;	    }	    ptr -> dns_next = NULL;	    free ((char *) base);	}    }}/*  */static	done_match (dns, fancy)struct dn_seq *dns;char   *fancy;{    int	    i;    register struct dn_seq *ptr;    if (dns == NULL) {	if (ufn_partials) {	    if (fred_list && frompipe && ufn_partials -> dns_next) {		char	buffer[BUFSIZ];		send_pipe_aux ("mUnable to resolve name, partial matches follow...\n");		if (read_pipe_aux (buffer, sizeof buffer) < 1) {		    (void) fprintf (stderr, "read failure\n");		    remote_prob = TRUE;		    goto losing;		}		dns = ufn_partials, ufn_partials = NULL;		goto fresh_start;	    }	    	    ps_printf (OPT,		       "Unable to resolve name, partial match%s available:\n",		       ufn_partials -> dns_next ? "es" : "");	    for (ptr = ufn_partials; ptr; ptr = ptr -> dns_next)		(void) showfred (ptr -> dns_dn,			  ufn_partials -> dns_next ? FALSE : TRUE, FALSE);losing: ;	    dn_seq_free (ufn_partials), ufn_partials = NULL;	    return;	}	ps_printf (OPT, "Search failed to find anything.\n");	return;    }fresh_start: ;    i = 0;    for (ptr = dns; ptr; ptr = ptr -> dns_next)	i++;    fred_long = i == 1;     fred_expand = fred_subdisplay = FALSE;    fred_sequence = !fred_list;    if (i > 1 || fancy) {	PS    aps;#ifndef	SOCKETS	if (frompipe)	    search_result = NOTOK;	aps = OPT;#else	if (frompipe	    	&& rps -> ps_byteno == 0	    	&& opt -> ps_byteno == 0	        && fdx_reset (opt) == OK) {		/* MAJOR HACK */	    char   *cp = fancy ? fancy : "3";	    	    (void) (*opt -> ps_writeP) (opt, cp, strlen (cp), 0);	    aps = opt;	}	else	    aps = RPS;#endif	ps_printf (aps, "%d matches found.\n", i);	(void) ps_flush (aps);	dns_sort (&dns, i);    }    for (ptr = dns; ptr; ptr = ptr -> dns_next)	(void) add_sequence (ptr -> dns_dn);    if (i == 1	    && !fancy	    && fred_list	    && frompipe	    && rps -> ps_byteno == 0	    && opt -> ps_byteno == 0	    && fdx_reset (rps) == OK) {		/* MAJOR HACK */	showfredDNs (dns -> dns_dn, fred_long);	(void) (*rps -> ps_writeP) (rps, "4", 1, 0);	ufn_dn_print_aux (rps, dns -> dns_dn, NULLDN, 0);	ps_print (RPS, "$");	dn_print (RPS, dns -> dns_dn, EDBOUT);	ps_print (rps, "\n");	(void) ps_flush (rps);			fred_list = FALSE;    }    for (i = 0, ptr = dns; ptr; ptr = ptr -> dns_next, i++) {	if (fred_list) {	    ufn_dn_print_aux (RPS, ptr -> dns_dn, NULLDN, 0);	    ps_print (RPS, "$");	    dn_print (RPS, ptr -> dns_dn, EDBOUT);	    ps_print (RPS, "\n");	    continue;	}	if (i > 0)	    (void) ps_flush (RPS);	 (void) showfred (ptr -> dns_dn, fred_long, fred_subdisplay);    }    dn_seq_free (dns);}/*    SHOWENTRY SUPPORT */extern int postal_indent;extern int qos_indent;extern int ufn_indent;static struct template {    char   *t_name;    char   *t_prefix;    int	    t_level;    AttributeType t_at;    } default_template[] = {    "title",				NULL,		0, NULL,    "documentTitle",			NULL,		0, NULL,#define	LEVEL_POSTAL	0    "organizationName", 		NULL,		0, NULL,    "organizationalUnitName",		NULL,		0, NULL,	"roomNumber",			"  Room ",		0, NULL,	"streetAddress",		"  ",		0, NULL,	"postOfficeBox",		"  POB ",		0, NULL,	"physicalDeliveryOfficeName",	"  ",		0, NULL,	"stateOrProvinceName",		"  ",		0, NULL,	"postalCode", 			"  ",		0, NULL,    "postalAddress",			NULL,		1, NULL,    "documentVersion",			"Version of: ",		1, NULL,    "registeredAddress",		"Registered Address: ",		2, NULL,        "telephoneNumber",			"Telephone: ",		3, NULL,    "mobileTelephoneNumber",		"Mobile:    ",		3, NULL,    "pagerTelephoneNumber",		"Pager:     ",		3, NULL,    "facsimileTelephoneNumber",		"FAX:       ",		3, NULL,    "telexNumber",			"Telex:     ",		3, NULL,    "teletexTerminalIdentifier",	"Teletex:   ",		3, NULL,    "x121Address",			"X.121:     ",		3, NULL,    "internationaliSDNNumber",		"ISDN:      ",		3, NULL,    "presentationAddress",		"OSI:       ",		3, NULL,    "documentLocation",			"Location:  ",		3, NULL,#define	LEVEL_MBOX	4    "rfc822Mailbox",			"  Mailbox: ",		4, NULL,        "otherMailbox",			"  ",		4, NULL,	"textEncodedORaddress",		"  ",		4, NULL,#ifdef USE_PP	"mhsORAddresses",		"  X.400:   ",		4, NULL,#endif    "destinationIndicator",		"Destination Indicator:     ",		5, NULL,    "preferredDeliveryMethod",		"Preferred Delivery Method: ",		5, NULL,    "supportedApplicationContext",      "Supports:  ",		5, NULL,    "personalTitle",			NULL,		6, NULL,    "description",			NULL,		6, NULL,    "info",				"Information: ",		7, NULL,    "supplementaryInformation",		"Note:        ",		7, NULL,    "businessCategory",			"Business:    ",		7, NULL,    "localityName",			"Locality:    ",    		7, NULL,    "userClass",			"User Class:  ",		7, NULL,    "owner",				"Owner:       ",		7, NULL,    "documentAuthor",			"Author:      ",		7, NULL,#define	LEVEL_AUTHOR	7    "documentAuthorCommonName",		"Author:      ",		7, NULL,    "documentAuthorSurName",		"Author:      ",		7, NULL,    "member",				"Members:   ",		8, NULL,    "dSAQuality",			"Server Quality:           ",		8, NULL,    "singleLevelQuality",		"Subordinate Data Quality: ",		8, NULL,    "subtreeMinimumQuality",		"Minimum Data Quality:     ",		8, NULL,    "subtreeMaximumQuality",		"Maximum Data Quality:     ",		8, NULL,    "aliasedObjectName",		"Alias to:  ",		9, NULL,    "roleOccupant",			"Occupant:  ",		9, NULL,    "seeAlso",				"See Also:  ",		9, NULL,    "secretary",			"Secretary: ",		9, NULL,    "manager",				"Manager:   ",		9, NULL,    "whoisIdent",			"WHOIS:     ",		9, NULL,    "namingLink",			"Link:      ",		9, NULL,    "reciprocalNamingLink",		"R-Link:    ",		9, NULL,    "homePostalAddress",		"Home Address: ",		10, NULL,    "homePhone",			"Home Phone:   ",		10, NULL,    "favouriteDrink",			"Drinks:       ",		10, NULL,    "photo",				"Picture:      ",		10, NULL,#ifdef	sparc    "audio",				"Audio:        ",		10, NULL,#endif    NULL};static int  ava_compar (a, b)RDN    *a,       *b;{	/* tricky, just check 'a' part, no need to check 'v' part! */    return (*a) -> rdn_at - (*b) -> rdn_at;}/*  */showfred (mydn, islong, subdisplay)DN	mydn;char	islong,	subdisplay;{    int	    didtime,	    hasauthor,	    haspost,	    level,	    nchild,	    pos,	    seqno;    register struct template *t;    register Attr_Sequence eptr;    register AV_Sequence avs,			 avp;    AttributeType rdn_at,		  inf_at;    AttributeValue rdn_av;    Entry	myentry;    PS	    ps = NULLPS;    RDN	    myrdn;    fred_init ();    myentry = fredentry (mydn = dn_cpy (mydn), islong);    pos = RPS -> ps_byteno;    seqno = fred_sequence ? add_sequence (mydn) : 0;    if (islong == FALSE) {	if (seqno)	    ps_printf (RPS, "%3d. ", seqno);	else	    ps_printf (RPS, "     ");    }    if (mydn) {	register DN	adn;	register RDN	rdn;/*	if (islong == FALSE) {	    ufn_dn_print_aux (RPS, mydn, NULLDN, 0);	    goto ufn_short;	} */	for (adn = mydn; adn -> dn_parent; adn = adn -> dn_parent)	    continue;	myrdn = adn -> dn_rdn;	if (myrdn -> rdn_next) {	    register int    i;	    RDN	    *base;	    i = 1;	    for (rdn = myrdn -> rdn_next; rdn; rdn = rdn -> rdn_next)		i++;	    if (base = (RDN *) malloc ((unsigned) (i * sizeof *base))) {		RDN    *bp,		       *ep;		ep = base;		for (rdn = myrdn; rdn; rdn = rdn -> rdn_next)		    *ep++ = rdn;		qsort ((char *) base, i, sizeof *base, (IFP) ava_compar);		bp = base;		rdn = myrdn = *bp++;		while (bp < ep) {		    rdn -> rdn_next = *bp;		    rdn = *bp++;		}		rdn -> rdn_next = NULL;		free ((char *) base);		adn -> dn_rdn = myrdn;	    }	}	rdn_at = myrdn -> rdn_at, rdn_av = &myrdn -> rdn_av;	AttrV_print (RPS, rdn_av, EDBOUT);	for (rdn = myrdn -> rdn_next; rdn; rdn = rdn -> rdn_next) {	    ps_print (RPS, " + ");	    AttrV_print (RPS, &rdn -> rdn_av, EDBOUT);	}    }    else {	myrdn = NULLRDN, rdn_at = NULLAttrT, rdn_av = NULLAttrV;	ps_print (RPS, "@");    }    if (islong == TRUE && seqno)	ps_printf (RPS, " (%d)", seqno);    if ((pos += 52 - RPS -> ps_byteno) <= 0)	pos = 1;    inf_at = NULLAttrT;    if (myentry) {	for (eptr = myentry -> e_attributes; eptr; eptr = eptr -> attr_link)	    if (!fred_phone && AttrT_cmp (eptr -> attr_type, t_mbox) == 0) {		inf_at = t_mbox;		if (avs = eptr -> attr_value) {		    ps_printf (RPS, "%*s", pos, "");		    showfredattr (&avs -> avseq_av);		}		break;	    }	    else		if (AttrT_cmp (eptr -> attr_type, t_phone) == 0) {		    inf_at = t_phone;		    avp = eptr -> attr_value;		}	if (inf_at == t_phone && avp) {	    ps_printf (RPS, "%*s", pos, "");	    showfredattr (&avp -> avseq_av);	}    }    ps_print (RPS, "\n");    if (myentry == NULLENTRY)	goto out;    if (islong == FALSE)	goto children;    if (!fred_photo)	for (eptr = myentry -> e_attributes; eptr; eptr = eptr -> attr_link)	    if (AttrT_cmp (eptr -> attr_type, t_photo) == 0) {		if (eptr -> attr_value) {		    if (rdn_av		            && (ps = ps_alloc (str_open)) != NULLPS		            && str_setup (ps, NULLCP, 0, 0) != NOTOK) {			register RDN rdn;			AttrV_print (ps, rdn_av, EDBOUT);			for (rdn = myrdn -> rdn_next;			         rdn;			         rdn = rdn -> rdn_next) {			    ps_print (ps, "/");			    AttrV_print (ps, &rdn -> rdn_av, EDBOUT);			}			ps_print (ps, " ");			*--ps -> ps_ptr = NULL, ps -> ps_cnt++;			(void) setenv ("RDN", ps -> ps_base);		    }		    else			(void) setenv ("RDN", "Photo");		}		break;	    }    level = 0;    for (eptr = myentry -> e_attributes; eptr; eptr = eptr -> attr_link)	if (AttrT_cmp (eptr -> attr_type, rdn_at) == 0) {	    for (avp = eptr -> attr_value; avp; avp = avp -> avseq_next)		if (AttrV_cmp (&avp -> avseq_av, rdn_av)) {		    ps_print (RPS, "     aka: ");		    showfredattr (&avp -> avseq_av);		    ps_print (RPS, "\n");		    level++;		}	    break;	}    hasauthor = haspost = 0;    for (eptr = myentry -> e_attributes; eptr; eptr = eptr -> attr_link)	if (AttrT_cmp (eptr -> attr_type, t_author) == 0) {	    if (eptr -> attr_value)		hasauthor = 1;	}	else	    if (AttrT_cmp (eptr -> attr_type, t_postal) == 0) {		if (eptr -> attr_value)		    haspost = 1;	    }    ps_print (RPS, "\n");    level = -1;    for (t = default_template; t -> t_name; t++) {	RDN	rdn;	for (rdn = myrdn; rdn; rdn = rdn -> rdn_next)	    if (AttrT_cmp (t -> t_at, rdn -> rdn_at) == 0)		break;	if (rdn)	    continue;	if (fred_photo && AttrT_cmp (t -> t_at, t_photo) == 0)	    continue;	for (eptr = myentry -> e_attributes;	         eptr;	         eptr = eptr -> attr_link)	    if (AttrT_cmp (eptr -> attr_type, t -> t_at) == 0) {		int	i;		if (AttrT_cmp (eptr -> attr_type, inf_at) == 0		        && (avs = eptr -> attr_value)		        && !avs -> avseq_next)		    continue;		if (t -> t_level == LEVEL_AUTHOR)		    if (AttrT_cmp (eptr -> attr_type, t_authorCN) == 0) {			if (hasauthor)			    continue;			hasauthor = 1;		    }		    else			if (hasauthor			        && AttrT_cmp (eptr -> attr_type, t_authorSN)			    		== 0)			    continue;		if (haspost			&& t -> t_level == LEVEL_POSTAL			&& AttrT_cmp (eptr -> attr_type, t_title)) {		    level = t -> t_level + 1;		    continue;		}		if (t -> t_level != level) {		    if (level >= 0)			ps_print (RPS, "\n");		    if ((level = t -> t_level) == LEVEL_MBOX)			ps_print (RPS, "Mailbox information:\n");		}				if (t -> t_prefix) {		    i = strlen (t -> t_prefix);		    ps_printf (RPS, "%s", t -> t_prefix);		}		else		    i = 0;		if (avs = eptr -> attr_value) {		    postal_indent = i;

⌨️ 快捷键说明

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