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 b

⟦13f292d7e⟧ TextFile

    Length: 9570 (0x2562)
    Types: TextFile
    Names: »bind.c«

Derivation

└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
    └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« 
        └─⟦d3ac74d73⟧ 
            └─⟦this⟧ »isode-5.0/quipu/dish/bind.c« 

TextFile

/* bind.c - */

#ifndef	lint
static char *rcsid = "$Header: /f/osi/quipu/dish/RCS/bind.c,v 6.0 89/03/18 23:40:37 mrose Rel $";
#endif

/* 
 * $Header: /f/osi/quipu/dish/RCS/bind.c,v 6.0 89/03/18 23:40:37 mrose Rel $
 *
 *
 * $Log:	bind.c,v $
 * Revision 6.0  89/03/18  23:40:37  mrose
 * Release 5.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 <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include "quipu/dua.h"
#include "quipu/name.h"
#include "quipu/bind.h"
#include "quipu/dsp.h"
#include "quipu/ds_error.h"
#include "tailor.h"

#ifndef ETCDIR
#define ETCDIR "/etc/"
#endif

extern DN       fixed_pos;
DN	        user_name;

extern LLog    *log_dua;

extern PS 	opt,
		rps;

extern char	retpipe[],
		inbuf [],
		bound,
		frompipe;

extern int	fd;
extern unsigned	connect_time,
		cache_time;

static char	username [LINESIZE];
static char	password [LINESIZE];
static char	first_bind = TRUE;

static struct ds_bind_arg bindarg;
static struct ds_bind_arg bindresult;
static struct ds_bind_error binderr;


#ifndef NO_STATS
extern LLog * log_stat;
#endif 

SFD unbind_sig ()
{
SFD dish_quit ();

#ifndef NO_STATS
	LLOG (log_stat,LLOG_NOTICE,("Connection closed"));
#endif

	if (bound) 
		(void) ds_unbind ();
		
	bound = FALSE;
	if (frompipe) {
		(void) signal (SIGALRM, dish_quit);
		(void) alarm (cache_time);
	}
}



call_bind (argc,argv)
int argc;
char ** argv;
{
int 	x;
char    noconnect = FALSE;
char    bpass [LINESIZE];
char    bname [LINESIZE];
char    bdsa  [LINESIZE];
char   *save_address;
extern  char * dsa_address,
	     * myname;
FILE    *fp;
char    buf[BUFSIZ];
extern  char * tailfile;

	(void) strcpy (bpass,password);
	(void) strcpy (bname,username);
	bdsa[0] = 0;
	save_address = dsa_address;

	for (x=1; x<argc; x++) {
		if (test_arg (argv[x], "-noconnect",1))
			noconnect = TRUE;
#ifdef PDU_DUMP
		else if (test_arg (argv[x], "-pdus",2)) {
			if (++x == argc) {
				ps_print (opt,"PDU file name missing\n");
				Usage (argv[0]);
				return (NOTOK);
			}
			ps_printf (rps,"Dumping PDUs in directory %s\n",argv[x]);
			pdu_dump_init (argv[x]);
		}
#endif		
 		else if (test_arg (argv[x], "-user",1)) {
			if ((++x == argc) || (*argv[x] == '-')) {
				x--;
				*bname = 0;
			} else
				(void) strcpy (bname,argv[x]);
		} else if (test_arg (argv[x], "-pipe",2)) {
			if (strcmp (argv[0],"dish") == 0)
				ps_print (opt,"Sorry... '-pipe' must be the first argument to dish.\n");
			else 
				Usage (argv[0]);
			return (NOTOK);
		} else if (test_arg (argv[x], "-password",2)) {
			if ((++x == argc)  || (*argv[x] == '-')) {
				x--;
				*bpass = 0;
			} else
				(void) strcpy (bpass,argv[x]);
		} else if (test_arg (argv[x], "-call",1)) {
			if (++x == argc) {
				ps_print (opt,"dsa name missing\n");
				Usage (argv[0]);
				return (NOTOK);
			}
			(void) strcpy (bdsa,argv[x]);
		} else {
			ps_printf (opt,"Unknown option %s\n",argv[x]);
			Usage (argv[0]);
			return (NOTOK);
		}

	}

	if (noconnect)
		return (OK);

	if (*bpass == 0) {
		bindarg.dba_passwd_len = 0;
		bindarg.dba_passwd[0]  = 0;
		if (*bname != 0) {
			get_password (bname,&bindarg.dba_passwd[0]);
			if (bindarg.dba_passwd[0] != 0)
				bindarg.dba_passwd_len = strlen	(&bindarg.dba_passwd[0]);
		}
	} else {
		bindarg.dba_passwd_len = strlen (bpass);
		(void) strcpy (bindarg.dba_passwd,bpass);
	}

	if (*bname == 0)
		bindarg.dba_dn = NULLDN;
	else {
		char * bnameptr;
		bnameptr = bname;
		if (*bnameptr == '@')
			bnameptr++;
		if ((bindarg.dba_dn = str2dn (bnameptr)) == NULLDN) {
			ps_printf (opt,"Invalid user name %s",bname);
			Usage (argv[0]);
			return (NOTOK);
		}
	}

	/* now set dsa_address */
	if (bdsa[0] != 0) {
		myname = bdsa;
		dsa_address = NULLCP;

		/* read tailor file to get address */
		
		if( (fp = fopen(isodefile(tailfile), "r")) == (FILE *)NULL) {
			LLOG (log_dua,LLOG_FATAL,("can't open tailor file '%s'", isodefile(tailfile)));
			fatal (-72, "Cannot open tailor file");
		}

		while(fgets(buf, sizeof(buf), fp) != NULLCP)
			if ( (*buf != '#') && (*buf != '\n') )
				/* not a comment or blank */
				if (tai_string (buf) == NOTOK)
					LLOG (log_dua,LLOG_DEBUG,("tai_string failed %s",buf));

		(void) fclose(fp);
		
		if (dsa_address == NULLCP)
			dsa_address = myname;
	}

	if (bound) 
		(void) unbind_sig ();

	first_bind = FALSE;

	if (ds_bind (&bindarg, &binderr, &bindresult) != OK) {
		if (binderr.dbe_type == DBE_TYPE_SECURITY)
			ps_print (opt, "Security error - Check name and password\n");
		else
			ps_print (opt, "Service error - Unable to contact DSA\n");
		dsa_address = save_address;
		return (NOTOK);
	} 
#ifndef NO_STATS
	LLOG (log_stat,LLOG_NOTICE,("Bound '%s' to '%s'",bname,dsa_address));
#endif

	bound = TRUE;
	user_name = bindarg.dba_dn;

	if (frompipe) 
		ps_print (rps,"Connected\n");

 	return (OK);
	
}

rebind () {

	if (first_bind) {
		char * buff = "bind";
		return (call_bind (1,&buff));
	}

	if (bound)
		return (OK);
		
	if (ds_bind (&bindarg, &binderr, &bindresult) != OK) {
		if (binderr.dbe_type == DBE_TYPE_SECURITY)
			ps_print (opt, "Bind security error\n");
		else
			ps_print (opt, "Bind service error\n");
		return (NOTOK);
	} 
#ifndef NO_STATS
	LLOG (log_stat,LLOG_NOTICE,("re-connect"));
#endif

	bound = TRUE;
	user_name = bindarg.dba_dn;
	return (OK);
}

call_unbind (argc,argv)
int argc;
char ** argv;
{
	int             file;
	int		x;
	char		noquit = FALSE;
	extern char	resbuf [];
	extern int	wfd;

	for (x=1; x<argc; x++) {
		if (test_arg (argv[x], "-noquit",3))
			noquit = TRUE;
		else {
			Usage (argv[0]);
			return;
		}
	}

	if (bound)
		(void) unbind_sig ();
		
	if (! noquit) {
		if (frompipe) {
			if ((file = open (inbuf, O_WRONLY)) <= 0)
				(void) fprintf (stderr,"Quitting...");
			else {
				*resbuf = '2';
				(void) write (file, resbuf, 1);
				(void) close (file);
			}
			(void) close (fd);
			(void) close (wfd);
			(void) unlink (retpipe);
		} else {
			ps_free (opt);
			ps_free (rps);
		}
		exit (0);
	}
}

user_tailor ()
{
	char           *part1;
	char           *part2;
	char           *getenv ();
	char           *ptr = "/.quipurc";
	char            Dish_Home[LINESIZE];

	FILE           *file;
	char            Read_in_Stuff[132];
	char           *p, 
		       *TidyString();
	extern char    *local_dit;
	extern char	dishinit;

	*password = 0;
	*username = 0;

	set_sequence ("default");

	bindarg.dba_version = DBA_VERSION_V1988;
	bindarg.dba_dn = NULLDN;
	bindarg.dba_passwd_len = 0;
	bindarg.dba_passwd[0] = 0;
	
	(void) strcpy (Dish_Home, getenv ("HOME"));
	(void) strcat (Dish_Home, ptr);

	if ((file = fopen (Dish_Home, "r")) == 0) 
		if (dishinit) {
			char cmd_buf [LINESIZE];
			int msk;

			ps_print (opt,"Please wait whilst I initialise everything...\n");
			msk = umask (0111);
			(void) sprintf (cmd_buf,"%snew_quipurc",ETCDIR);
			if ((file = fopen (Dish_Home, "w")) == 0) 
				return (OK);	/* cant make one */
			(void) umask (msk);
			(void) fclose (file);
			if (system (cmd_buf) == 0) {
				(void) chmod (Dish_Home,0600);
				if ((file = fopen (Dish_Home, "r")) == 0) {
					(void) fprintf (stderr,"Cant open .quipurc - BUT I just created it!!!\n");
					return (NOTOK);
				}
			} else {
				(void) unlink (Dish_Home);
				return (NOTOK);
			}

		} else
			return (OK);  /* no .quipurc */

	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) {
			ps_printf (opt,"Seperator missing '%s'\n",p);
			return (NOTOK);
		} 
		
		*part2++ = '\0';
		part2 = TidyString (part2);
		DLOG (log_dua, LLOG_TRACE, ("Collected '%s', and '%s'.\n", part1, p));

		if (lexequ (part1, "username") == 0) {
			if ((user_name = str2dn (part2)) == NULLDN) {
				ps_printf (opt,"Invalid username %s\n",part2);
				return (NOTOK);
			}
			(void) strcpy (username, part2);
			bindarg.dba_dn = user_name;
		}
		else if (lexequ (part1, "password") == 0) {
			(void) strcpy (bindarg.dba_passwd,part2);
			(void) strcpy (password, part2);
			bindarg.dba_passwd_len = strlen (part2);
		} else if (lexequ (part1, "cache_time") == 0) 
			cache_time = MIN (atoi(part2) * 60, 180000);
					/* enforce 5 hour maximum */
		else if (lexequ (part1, "connect_time") == 0) 
			connect_time = MIN (atoi(part2) * 60, 300);
					/* enforce 5 minute maximum */
		else if (lexequ (part1, "service") == 0) 
			new_service (part2);
		else if (lexequ (part1, "type") == 0) {
			if (lexequ (part2,"unknown") == 0)
				show_unknown();
		} else if (lexequ (part1, "notype") == 0)
			new_ignore (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,strdup(split),0);
			}
		} else if (set_cmd_default (part1,part2) != OK) 
			if (add_alias (part1,part2) != OK) {
				ps_printf (opt,"Unknown parameter %s\n",part1);
				return (NOTOK);
			}
	}

	if (local_dit != NULLCP)
		if ((fixed_pos = str2dn (TidyString(local_dit))) == NULLDN) {
			ps_printf (opt,"Invalid default position (dsaptailor) %s\n",local_dit);
			return (NOTOK);
		}

	(void) strcpy (bindarg.dba_passwd,password);
	bindarg.dba_passwd_len = strlen (password);

	isodexport ();
	
	return (OK);
}