DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T c

⟦9387bec90⟧ TextFile

    Length: 19275 (0x4b4b)
    Types: TextFile
    Names: »calls.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« 
        └─⟦de7628f85⟧ 
            └─⟦this⟧ »isode-6.0/others/quipu/uips/widget/calls.c« 

TextFile

/* calls.c - */

#ifndef	lint
static char *rcsid = "$Header: /f/osi/others/quipu/uips/widget/RCS/calls.c,v 7.1 90/01/11 18:36:46 mrose Exp $";
#endif

/* 
 * $Header: /f/osi/others/quipu/uips/widget/RCS/calls.c,v 7.1 90/01/11 18:36:46 mrose Exp $
 *
 *
 * $Log:	calls.c,v $
 * Revision 7.1  90/01/11  18:36:46  mrose
 * real-sync
 * 
 * Revision 7.0  89/11/23  22:09:39  mrose
 * Release 6.0
 * 
 */

/*
 *				  NOTICE
 *
 *    Acquisition, use, and distribution of this module and related
 *    materials are subject to the restrictions of a license agreement.
 *    Consult the Preface in the User's Manual for the full terms of
 *    this agreement.
 *
 */

#include "quipu/util.h"
#include "quipu/common.h"
#include "quipu/entry.h"
#include "tailor.h"

#define DEFEDITOR "/usr/ucb/vi"
#define RESBUF 100000
#define debug(a,b)

PS opt;

int dn_print (), rdn_print(), as_print(), avs_comp_print();

char bound = FALSE;  /* indication of wether bound */
char * TidyString();

/* hack to get isode/curses compatability */
#define WINDOW char

#include "widget.h"
#include "wdgtdefs.h"

/* These are common operation variables */
char * addobj = NULLCP;

char            goto_path[128];         /* Used by the 'G:goto' command */
char            base_path[128];         /* Used by all DS operations    */
char            namestr[128];
char		cache [128];
char		bindpass [128];
char		srchvalue[128];		/* Used by search */
char		limit [128];		/* used by search / add */

char		mtype [128];
char		mvalue [128];

static char	*mtog[] = {"Modify ", "Add ", "Remove ", 
			   "Add Values ", "Remove Values ",
			  (char *)NULL };

static char     *xtntstrs[] = {"This object ","Children ",
			       "Subtree ", (char *)NULL};

static char     *filttype[] = {"commonName", "Surname", "UserClass","RoomNumber",
				"OrganizationName", "OrganizationalUnitName", "LocalityName","ObjectClass",
				"countryName", NULLCP};

static char     *filtmatch[]= {"= ","Substring ","> ","< ","Present ","Approx ",NULLCP};

#ifndef NO_STATS
extern LLog    *log_stat;
#endif 

/* These are used as the data for the binding connection */
char   passwd[16];
extern char     currentpath[];
extern char *   myname;

extern int sizelimit;
DN user_name;

Filter search_filter;


user_tailor ()
{
	char           *part1;
	char           *part2;
	char           *getenv ();
	char            Dish_Home[BUFSIZ];

	FILE           *file;
	char            Read_in_Stuff[132];
	char           *p, 
		       *TidyString(),
		       *SkipSpace();
	extern char    *local_dit;
	
#ifndef NO_STATS
    	ll_hdinit (log_stat,"widget");
#endif

    	if ((opt = ps_alloc (std_open)) == NULLPS)
             fatal (-1,"ps_alloc failed");
	if (std_setup (opt,stdout) == NOTOK)
             fatal (-1,"std_setup failed");

	(void) sprintf (limit,"%d",sizelimit);
	namestr[0] = '\0';
	*passwd = '\0';
	cache[0] = '\0';
	currentpath[0] = '\0';

	if (p = getenv ("QUIPURC"))
	    (void) strcpy (Dish_Home, p);
	else
	    if (p = getenv ("HOME"))
		(void) sprintf (Dish_Home, "%s/.quipurc", p);
	    else
		(void) strcpy (Dish_Home, "./.quipurc");

	if ((file = fopen (Dish_Home, "r")) == 0) 
		return;

	while (fgets (Read_in_Stuff, 80, file) != 0) {
		p = SkipSpace (Read_in_Stuff);
		if (( *p == '#') || (*p == '\0'))
			continue;  /* ignore comments and blanks */
			
		part1 = p;
		if ((part2 = index (p,':')) == NULLCP) 
			continue; /* ignore it */
		
		*part2++ = '\0';
		part2 = TidyString(part2);

		if (strcmp (part1, "username") == 0) 
			(void) strcpy (namestr, part2);
		else if (strcmp (part1, "password") == 0) 
			(void) strcpy (passwd, part2);
		else if (lexequ (part1, "dsap") == 0)
			(void) tai_string (part2);
		else if (lexequ (part1, "isode") == 0) {
			char * split;
			if ((split = index (part2,' ')) != NULLCP) {
				*split++ = 0;
				(void) isodesetvar (part2,split,0);
			}
		} else if (strcmp (part1, "service") == 0) 
			new_service (part2);
	}

	if (local_dit != NULLCP) {
		(void) strcpy (currentpath,local_dit);
		showcurrentpath(currentpath);
	}

	isodexport ();
}

/* These are the functions called by the main level of widgets */

main_quit()
{
    cleartext();
    setwidgets(quitwdgts,-1);
}

main_help()
{
    cleartext();
    killwidgets(mainwdgts);
    setwidgets(helpwdgts,-1);
}


main_bind()
{
    cleartext();
    if (*passwd != 0)
    	(void) strcpy(bindpass,"******");
    else
   	bindpass[0] = '\0';
	
    setdialogstr(getwidget(cnnctwdgts, 'p'), bindpass,255);
    setdialogstr(getwidget(cnnctwdgts, 'd'), myname,255);
    setdialogstr(getwidget(cnnctwdgts, 'u'), namestr,255);
    setdialogstr(getwidget(cnnctwdgts, 'c'), cache,255);
    setwidgets(cnnctwdgts, -1);
}

main_goto()
{
    cleartext();
/* If we've got a 'valid' path, then show it and add it to history */
	(void) strcpy(currentpath, goto_path);
	showcurrentpath(currentpath);

}

main_read()
{
    cleartext();
    killwidgets(mainwdgts);
    setdialogstr(getwidget(rdwdgts,'b'),base_path,256);
    (void) strcpy(base_path, currentpath);
    setwidgets(rdwdgts,-1);
}

main_list()
{
    cleartext(); 
    killwidgets(mainwdgts);
    setdialogstr(getwidget(listwdgts,'b'),base_path,256);
    setdialogstr(getwidget(listwdgts,'l'),limit,256);
    (void) strcpy(base_path, currentpath);
    setwidgets(listwdgts,-1);
}

main_search()
{
    cleartext();
    killwidgets(mainwdgts);
    (void) strcpy(base_path, currentpath);
    setdialogstr(getwidget(srchwdgts,'b'),base_path,256);
    setdialogstr(getwidget(srchwdgts,'v'),srchvalue,256);
    setdialogstr(getwidget(srchwdgts,'l'),limit,256);
    settogglstrs(getwidget(srchwdgts,'e'),xtntstrs,1);
    settogglstrs(getwidget(srchwdgts,'t'),filttype,0);
    settogglstrs(getwidget(srchwdgts,'m'),filtmatch,0);
    setwidgets(srchwdgts, -1);
}

main_modify()
{
    cleartext();

    killwidgets(mainwdgts);
    setdialogstr(getwidget(modwdgts,'b'),base_path,256);
    setdialogstr(getwidget(modwdgts,'v'),mvalue,256);
    setdialogstr(getwidget(modwdgts,'t'),mtype,256);
    settogglstrs(getwidget(modwdgts,'o'),mtog,0);
    (void) strcpy(base_path, currentpath);
    setwidgets(modwdgts, -1);

}

cache_quit()
{
	cleartext ();
	eprint ("Sorry can't write cache - not implemented\n");
}

cnnct_help()
{
    cleartext();
    help_connect();
}

cnnct_quit ()
{
	quit (-1);
}

cnnct_bind()
{
struct ds_bind_arg bindarg;
struct ds_bind_arg bindresult;
struct ds_bind_error binderr;
extern  char * dsa_address,
	     * myname;
extern  char * tailfile;
FILE * fp;
char buf [BUFSIZ];
char *cp;

    cleartext();

	/* set dsa_address */
	dsa_address = NULLCP;
	/* read tailor file to get address */
	if( (fp = fopen(cp = isodefile(tailfile, 0), "r")) == (FILE *)NULL) {
		tprint ("Cannot open tailor file %s\n",cp);
		return;
	}
	while(fgets(buf, sizeof(buf), fp) != NULLCP)
		if ( (*buf != '#') && (*buf != '\n') )
			(void) tai_string (buf);

	(void) fclose(fp);

	if (dsa_address == NULLCP)
		dsa_address = myname;

	/* set password */
	if (bindpass[0] != 0) {
		if (strcmp (bindpass,"******") != 0)
			(void) strcpy (passwd,bindpass);
	} else 
		passwd[0] = 0;
		
	/* now bind */
	bindarg.dba_version = DBA_VERSION_V1988;
	if (passwd[0] == 0) {
		bindarg.dba_passwd_len = 0;
		bindarg.dba_passwd [0] = '\0';
	} else {
		bindarg.dba_passwd_len = strlen (passwd);
		(void) strcpy (bindarg.dba_passwd,passwd);
	}

	if (*namestr == 0)
		bindarg.dba_dn = NULLDN;	
	else
		bindarg.dba_dn = str2dn (namestr);

	if (ds_bind (&bindarg,&binderr,&bindresult) != DS_OK) {
	   if (binderr.dbe_type == DBE_TYPE_SECURITY)
		tprint ("Bind security error - Check name and pasword"); 
	   else
		tprint ("Bind service error - Can't contact DSA"); 
	} else {
		killwidgets (cnnctwdgts);
		setwidgets (mainwdgts,-1);
		user_name = bindarg.dba_dn;
#ifndef NO_STATS
		LLOG (log_stat,LLOG_NOTICE,("bound ('%s' to '%s')",namestr,dsa_address));
#endif
		eprint("Directory Bind Successful.");
	}
}

cnnct_read ()
{
	cleartext();
	eprint ("Sorry - Disk cache not implemented yet\n");
}



/* These are the functions called by the read level widgets */

rd_start()
{
struct ds_read_arg read_arg;
struct ds_read_result   result;
struct DSError          error;
Entry read_entry;
		
    cleartext ();
    hide_picture(); 	

    tprint("Reading attributes of '%s'\n", base_path);

    if ( get_default_service (&read_arg.rda_common) != 0) {
   	eprint ("Default service error -> check your .quipurc\n");
	return ;
    }

	read_arg.rda_eis.eis_allattributes = TRUE;
	read_arg.rda_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
	read_arg.rda_eis.eis_select = NULLATTR;
	
	read_arg.rda_object = str2dn(base_path);

	if ((read_entry = local_find_entry (read_arg.rda_object, FALSE)) != NULLENTRY) {
		quipu_print (as_print,(caddr_t)read_entry->e_attributes);
		return;
	}
#ifndef NO_STATS
	LLOG (log_stat,LLOG_NOTICE,("read +%s",base_path));
#endif
	
	if (ds_read (&read_arg,&error,&result) != DS_OK) {
		/* deal with error */
		quipu_error (&error);
	} else {
		/* use data */
		if (result.rdr_entry.ent_attr == NULLATTR) {
			eprint("No attributes");
			return;
		}
		eprint("Result of look up ...\n");
		if (result.rdr_common.cr_aliasdereferenced)
			eprint("Alias dereferenced)\n");

		(void) dn_decode (result.rdr_entry.ent_dn);
		(void) as_decode (result.rdr_entry.ent_attr);
		cache_entry (&(result.rdr_entry),TRUE,TRUE);
		quipu_print (as_print,(caddr_t)result.rdr_entry.ent_attr);
	}
}

rd_help()
{
    cleartext(); 
    help_read();
}

/* These are the functions called by the list level widgets */

list_start()
{

struct ds_list_arg list_arg;

struct ds_list_result   result;
struct DSError          error;
struct subordinate      *ptr;
struct list_cache *cptr;

    cleartext();
    tprint("Listing children of '%s'...\n",base_path);

   if (get_default_service (&list_arg.lsa_common) != 0) {
   	eprint ("Default service error -> check your .quipurc\n");
	return ;
   }

	list_arg.lsa_common.ca_servicecontrol.svc_sizelimit = atoi(limit);

	list_arg.lsa_object = str2dn(base_path);
	
	if ((cptr = find_list_cache (list_arg.lsa_object,list_arg.lsa_common.ca_servicecontrol.svc_sizelimit)) != NULLCACHE) {
		for (ptr=cptr->list_subs;ptr!=NULLSUBORD;ptr=ptr->sub_next) {
			quipu_print (rdn_print,(caddr_t)ptr->sub_rdn);
			eprint("\n");
		}
		if (cptr->list_problem != LSR_NOLIMITPROBLEM)
			eprint("(Limit problem)\n");
        	return;
	}
	
#ifndef NO_STATS
	LLOG (log_stat,LLOG_NOTICE,("list +%s",base_path));
#endif
						               
	if (ds_list (&list_arg,&error,&result) != DS_OK) {
		/* deal with error */
		quipu_error (&error);
	} else {
		/* use data */
		eprint("Result of list operation ...\n");
		if (result.lsr_common.cr_aliasdereferenced) {
			eprint("Alias dereferenced - ");
			(void) dn_decode (result.lsr_object);
			quipu_print (dn_print,(caddr_t)result.lsr_object);
			dn_free (result.lsr_object);
			eprint("\n");
		}
		for (ptr=result.lsr_subordinates;ptr!=NULLSUBORD;ptr=ptr->sub_next) {
			(void) rdn_decode (ptr->sub_rdn);
			quipu_print (rdn_print,(caddr_t)ptr->sub_rdn);
			eprint("\n");
		}
		if (result.lsr_limitproblem != LSR_NOLIMITPROBLEM)
			eprint("(Limit problem)\n");

		cache_list (result.lsr_subordinates, result.lsr_limitproblem,list_arg.lsa_object,
			list_arg.lsa_common.ca_servicecontrol.svc_sizelimit);
	}


}

list_help()
{
    cleartext();
    help_list();
}


/* search ... */

void filt_substr (substr,at,str)
Filter_Substrings * substr;
AttributeType at;
char *str;
{
char * ptr;
AttributeValue av;

    if ((ptr = index (str,'*')) == NULLCP)
    	ptr = str + strlen (str);

    substr->fi_sub_initial = NULLAV;
    substr->fi_sub_any     = NULLAV;
    substr->fi_sub_final   = NULLAV;
    substr->fi_sub_type    = at;

/* This is the 'initial' section of the string - maybe NULL */
    *ptr = '\0';
    str = TidyString (str);
    if (*str != 0) {
	av = str2AttrV (str, at->at_table->oa_syntax);
	substr->fi_sub_initial = avs_comp_new (av);
    }
    str = ptr + 1;

/* Test for whether there are going to be any 'any' bits */
    if ((ptr = rindex(str, '*')) == NULLCP) {
	str = TidyString (str);
	if (*str != 0) {
		av = str2AttrV (str, at->at_table->oa_syntax);
		substr->fi_sub_final = avs_comp_new (av);
	}
	return;
    }

    *ptr = '\0';
    ptr = TidyString (ptr + 1);
    if ( *ptr != 0) {
	av = str2AttrV (str, at->at_table->oa_syntax);
	substr->fi_sub_final = avs_comp_new (av);
	}

/* There are some internal 'any's to be found */
    do {
	if ((ptr = index(str, '*')) != NULLCP)
	    *ptr = '\0';

	if (*str != 0) {
		str = TidyString (str);
			av = str2AttrV (str, at->at_table->oa_syntax);
		if (substr->fi_sub_any == NULLAV)
			substr->fi_sub_any = avs_comp_new (av);
		else
			substr->fi_sub_any = avs_merge (substr->fi_sub_any,avs_comp_new (av));
	}
	if (ptr != NULLCP)
	    str = ptr + 1;
    } while(ptr != NULLCP);
    

}

srch_start()
{
int                     extent;
struct ds_search_arg search_arg;
struct DSError error;
struct ds_search_result result;

   cleartext();

   if (get_default_service (&search_arg.sra_common) != 0) {
   	eprint ("Default service error -> check your .quipurc\n");
	return ;
   }

   tprint ("Searching ...");
   search_arg.sra_common.ca_servicecontrol.svc_sizelimit = atoi(limit);
   search_arg.sra_baseobject = str2dn (base_path);
   search_arg.sra_eis.eis_allattributes = TRUE;
   search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
   search_arg.sra_eis.eis_select = NULLATTR;

   extent = gettogglindx(getwidget(srchwdgts,'e'));
   switch (extent) {
   case 0: search_arg.sra_subset = SRA_BASEOBJECT;
	   break;
   case 1: search_arg.sra_subset = SRA_ONELEVEL;
	   break;
   default:search_arg.sra_subset = SRA_WHOLESUBTREE;
	   break;
   }
   search_arg.sra_filter = filter_alloc ();
   search_arg.sra_filter->flt_next = NULLFILTER;
   search_arg.sra_filter->flt_type = FILTER_ITEM;
   search_arg.sra_filter->FUITEM.fi_type = gettogglindx(getwidget(srchwdgts,'m'));

   switch (search_arg.sra_filter->FUITEM.fi_type) {
   case FILTERITEM_PRESENT:
        search_arg.sra_filter->FUITEM.UNTYPE = AttrT_new (filttype[gettogglindx(getwidget(srchwdgts,'t'))]);
	break;
   case FILTERITEM_SUBSTRINGS: {
	AttributeType at;

	at = AttrT_new (filttype[gettogglindx(getwidget(srchwdgts,'t'))]);
	if ( ! sub_string(at->at_table->oa_syntax)) {
		eprint ("Cant do a substring search if the type is not a string !!!");
		return;
	}
   	filt_substr(&search_arg.sra_filter->FUITEM.UNSUB,at,srchvalue);
	break;
   }
   default:
        search_arg.sra_filter->FUITEM.UNAVA.ava_type = AttrT_new (filttype[gettogglindx(getwidget(srchwdgts,'t'))]);
	search_arg.sra_filter->FUITEM.UNAVA.ava_value = str2AttrV (srchvalue,search_arg.sra_filter->FUITEM.UNAVA.ava_type->at_table->oa_syntax);
	break;
   }
#ifndef NO_STATS
	LLOG (log_stat,LLOG_NOTICE,("search +%s, extent %d, val %s",base_path,search_arg.sra_subset,srchvalue));
#endif
   if (ds_search (&search_arg,&error,&result) != DS_OK) {
	/* deal with error */
	quipu_error (&error);
    } else {
	correlate_search_results (&result);
	if (result.CSR_entries != NULLENTRYINFO) {
		 EntryInfo *ptr;
		 eprint ("Result of search ...\n");
		 if (result.CSR_common.cr_aliasdereferenced) {
			 eprint ("(Alias dereferenced - base object is ");
			 (void) dn_decode (result.CSR_object);
			 quipu_print (dn_print ,(caddr_t)result.CSR_object);
			 dn_free (result.CSR_object);
			 eprint (")\n");
		 }
  		 for (ptr = result.CSR_entries; ptr != NULLENTRYINFO; ptr = ptr->ent_next) {
			(void) dn_decode (ptr->ent_dn);
			quipu_print (dn_print,(caddr_t)ptr->ent_dn);
			eprint ("\n");
			cache_entry (ptr,TRUE,TRUE);
		 }

	 } else
		 eprint("Nothing found\n");
 	
	 if (result.CSR_limitproblem != LSR_NOLIMITPROBLEM) {
		if (result.CSR_limitproblem == LSR_TIMELIMITEXCEEDED)
			eprint ("(Time limit exceeded)\n");
		else
			eprint ("(Size limit exceeded)\n");
	 }
    }
}

srch_help()
{
    cleartext();
    help_search();
}

/* modify */

mod_help()
{
    cleartext(); 
    help_modify();
}

mod_start()
{
	struct ds_modifyentry_arg mod_arg;
	struct DSError  error;
	Attr_Sequence   as;
	AttributeType   at;
	AV_Sequence     avst;
	AttributeValue  av;

    cleartext();
    
    if (get_default_service (&mod_arg.mea_common) != 0) {
   	eprint ("Default service error -> check your .quipurc\n");
	return ;
    }

    if ((at = AttrT_new (mtype)) == NULLAttrT) {
    	eprint ("Invalid Attribute Type\n");
	return;
    } 

    if ((av =str_at2AttrV (mvalue,at)) == NULLAttrV) {
	eprint ("invalid Attribute Syntax");
	return;
    }

    if ((avst = avs_comp_new (av)) == NULLAV) {
	eprint ("error in attribute");
	return;
    }
    as = as_comp_new (at,avst,NULLACL_INFO);

    tprint ("Modification at '%s'\n ",base_path);

    switch (gettogglindx(getwidget(modwdgts,'o'))) {
    case 3: /* add value */
    	mod_arg.mea_changes = em_alloc ();
	mod_arg.mea_changes->em_type = EM_ADDVALUES;
	mod_arg.mea_changes->em_what = as;
	mod_arg.mea_changes->em_next = NULLMOD;
        break;
    case 4:
    	mod_arg.mea_changes = em_alloc ();
	mod_arg.mea_changes->em_type = EM_REMOVEVALUES;
	mod_arg.mea_changes->em_what = as;
	mod_arg.mea_changes->em_next = NULLMOD;
	break;
    case 2: /* remove */
	mod_arg.mea_changes = em_alloc ();
	mod_arg.mea_changes->em_type = EM_REMOVEATTRIBUTE;
	mod_arg.mea_changes->em_what = as;
	mod_arg.mea_changes->em_next = NULLMOD;
	break;
    case 1: /* add */
	mod_arg.mea_changes = em_alloc ();
	mod_arg.mea_changes->em_type = EM_ADDATTRIBUTE;
	mod_arg.mea_changes->em_what = as;
	mod_arg.mea_changes->em_next = NULLMOD;
    	break;
    default: /* replace */
    	mod_arg.mea_changes = em_alloc ();
	mod_arg.mea_changes->em_type = EM_REMOVEATTRIBUTE;
	mod_arg.mea_changes->em_what = as;
	mod_arg.mea_changes->em_next = em_alloc ();
	mod_arg.mea_changes->em_next->em_type = EM_ADDATTRIBUTE;
	mod_arg.mea_changes->em_next->em_what = as;
	mod_arg.mea_changes->em_next->em_next = NULLMOD;
    	break;
    }
   mod_arg.mea_object = str2dn (base_path);
   
#ifndef NO_STATS
	LLOG (log_stat,LLOG_NOTICE,("modify %s (%s)",base_path,mtype));
#endif

	if (ds_modifyentry (&mod_arg, &error) != DS_OK) {
		quipu_error (&error);
		return;
	}
	eprint ("Done\n");
	
	/* force re-read to update cache */
	delete_cache (mod_arg.mea_object);
}


quipu_print (func,ptr)
int (*func) ();         /* assumes func (PS ,dataptr,(int) format); */
caddr_t ptr;
{
	/* log info to pstream */
PS ps;
char buffer [RESBUF];
int i;
char *str, *sptr;
char save;

    if ((ps = ps_alloc (str_open)) == NULLPS) {
	return ;
    }
    if (str_setup (ps,buffer,RESBUF,1) == NOTOK) {
	return ;
    }

    (*func) (ps,ptr,READOUT);
    *ps->ps_ptr = 0;

    ps_free (ps);

    /* print in blocks of 100 bytes - larger appears to be too much for curses */
    str = buffer;
    sptr = str + 100;
    for (i=0; i< ps->ps_byteno; i += 100) {
	    save = *sptr;
	    *sptr = 0;
	    eprint (str);
	    *sptr = save;
	    str = sptr;
	    sptr = str + 100;
    }
}

quipu_error (err)
struct DSError * err;
{
PS ps;
char buffer [RESBUF];

    if ((ps = ps_alloc (str_open)) == NULLPS) {
	return ;
    }
    if (str_setup (ps,buffer,RESBUF,1) == NOTOK) {
	return ;
    }
    ds_error (ps,err);

    *ps->ps_ptr = 0;
    eprint (buffer);
}

returnmain ()
{
	QUITFN();
	setwidgets (mainwdgts,-1);
}

/* ARGSUSED */
set_sequence (a)
char * a;
{
;
}

unset_sequence ()
{
;
}