|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 19281 (0x4b51) Types: TextFile Names: »calls.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/others/quipu/uips/widget/calls.c«
/* calls.c - */ #ifndef lint static char *rcsid = "$Header: /f/osi/others/quipu/uips/widget/RCS/calls.c,v 6.0 89/03/18 23:34:44 mrose Rel $"; #endif /* * $Header: /f/osi/others/quipu/uips/widget/RCS/calls.c,v 6.0 89/03/18 23:34:44 mrose Rel $ * * * $Log: calls.c,v $ * Revision 6.0 89/03/18 23:34:44 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 "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 static LLog lstat_log = { "widget.log", NULLCP, NULLCP, LLOG_NOTICE, LLOG_NONE, 50, LLOGCLS | LLOGCRT | LLOGZER, NOTOK, }; LLog *log_stat = &lstat_log; #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 *ptr = "/.quipurc"; 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'; (void) strcpy (Dish_Home, getenv ("HOME")); (void) strcat (Dish_Home, ptr); 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; 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]; cleartext(); /* set dsa_address */ dsa_address = NULLCP; /* read tailor file to get address */ if( (fp = fopen(isodefile(tailfile), "r")) == (FILE *)NULL) { tprint ("Cannot open tailor file %s\n",isodefile(tailfile)); 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"); dn_decode (result.rdr_entry.ent_dn); 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 - "); 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) { 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 ((at->at_table->oa_syntax != AV_CASEEXACTSTRING) || (at->at_table->oa_syntax != AV_CASEIGNORESTRING)) { 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 "); 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) { 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 () { ; }