|
|
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 s
Length: 6239 (0x185f)
Types: TextFile
Names: »search.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/quipu/dish/search.c«
#include "quipu/util.h"
#include "quipu/ds_search.h"
#include "quipu/list.h"
#include "quipu/entry.h"
#include "quipu/sequence.h"
extern DN dn,
current_dn;
extern PS opt;
extern PS rps;
extern Entry current_entry;
DN rel_dn = NULLDN;
extern LLog *log_dua;
Filter get_filter ();
char *TidyString ();
char allow_move = TRUE;
call_search (argc, argv)
int argc;
char **argv;
{
struct ds_search_arg search_arg;
struct DSError error;
struct ds_search_result result;
DN save_dn;
extern int sizelimit;
extern char flag_show;
int x;
Entry save_entry;
char rel_flag = TRUE;
char *save_arg = NULLCP;
extern char doneget;
extern char value_flag;
extern char all_flag;
extern char show_all_flag;
extern char key_flag;
static char *nvec[2] = {"search"};
extern Attr_Sequence as_flag;
int seqno;
value_flag = TRUE;
all_flag = FALSE;
if (as_flag != NULLATTR) {
as_free (as_flag);
as_flag = NULLATTR;
}
flag_show = TRUE;
key_flag = TRUE;
search_arg.sra_filter = NULLFILTER;
search_arg.sra_subset = SRA_ONELEVEL;
search_arg.sra_common.ca_servicecontrol.svc_sizelimit = sizelimit;
if ((argc = service_control (opt, argc, argv, &search_arg.sra_common)) == -1)
return;
allow_move = FALSE;
if ( (argc = set_read_flags (argc,argv)) == -1) {
allow_move = TRUE;
return;
}
allow_move = TRUE;
for (x = 1; x < argc; x++) {
if (test_arg (argv[x], "-baseobject",1)) {
DLOG (log_dua, LLOG_TRACE, ("We have a -baseobject flag\n"));
search_arg.sra_subset = SRA_BASEOBJECT;
} else if (test_arg (argv[x], "-singlelevel",2)) {
DLOG (log_dua, LLOG_TRACE, ("We have a -singlelevel flag\n"));
search_arg.sra_subset = SRA_ONELEVEL;
} else if (test_arg (argv[x], "-subtree",2)) {
DLOG (log_dua, LLOG_TRACE, ("We have a -subtree flag\n"));
search_arg.sra_subset = SRA_WHOLESUBTREE;
} else if (test_arg (argv[x], "-relative",3))
rel_flag = TRUE;
else if (test_arg (argv[x], "-norelative",5))
rel_flag = FALSE;
else if (test_arg (argv[x], "-filter",1)) {
if ((search_arg.sra_filter = get_filter (argv[++x])) == NULLFILTER) {
ps_printf (opt,"Invalid filter %s\n",argv[x]);
Usage (argv[0]);
return;
}
shuffle_up (argc--,argv,x--);
} else if (test_arg (argv[x], "-object",1)) {
if (move (argv[++x]) != OK) {
ps_printf (opt,"Invalid move object %s\n",argv[x]);
Usage (argv[0]);
return;
}
shuffle_up (argc--,argv,x--);
} else if (*argv[x] != '-') {
if (save_arg != NULLCP) {
ps_printf (opt,"Need flags to parse argument '%s'!\n",argv[x]);
Usage (argv[0]);
return;
} else
save_arg = argv[x];
} else
continue; /* a read type flag !!! */
shuffle_up (argc--,argv,x--);
}
if (save_arg != NULLCP) {
/* There is an unflagged argument */
if (search_arg.sra_filter == NULLFILTER) {
if ((search_arg.sra_filter = get_filter (save_arg)) == NULLFILTER) {
ps_printf (opt,"Invalid filter %s\n",save_arg);
Usage (argv[0]);
return;
}
} else if (move (save_arg) != OK) {
ps_printf (opt,"Invalid move object %s\n",save_arg);
Usage (argv[0]);
return;
}
}
if (search_arg.sra_filter == NULLFILTER) {
/* set default */
search_arg.sra_filter = filter_alloc ();
search_arg.sra_filter->flt_next = NULLFILTER;
search_arg.sra_filter->flt_type = FILTER_AND;
search_arg.sra_filter->FUFILT = NULLFILTER;
}
if (argc != 1) {
Usage (argv[0]);
return;
}
search_arg.sra_eis.eis_infotypes = value_flag;
search_arg.sra_eis.eis_allattributes = all_flag;
search_arg.sra_eis.eis_select = as_flag;
search_arg.sra_baseobject = dn;
DLOG (log_dua, LLOG_TRACE, ("Dish:- We are about to call the ds_search\n"));
if (rebind () != OK)
return;
show_all_flag = FALSE;
if (ds_search (&search_arg, &error, &result) != DS_OK) {
DLOG (log_dua, LLOG_TRACE, ("Dealing with The error in searching.\n"));
ds_error (opt, &error); /* deal with error */
} else {
correlate_search_results (&result);
if (result.CSR_entries == NULLENTRYINFO)
ps_printf (opt, "Search failed to find anything.\n");
else {
EntryInfo *ptr;
save_dn = dn_cpy(current_dn);
save_entry = current_entry;
doneget = TRUE;
if (rel_flag)
rel_dn = dn_cpy(dn);
for (ptr = result.CSR_entries; ptr != NULLENTRYINFO; ptr = ptr->ent_next) {
as_decode (ptr->ent_attr); /* decode it immediately
* so we only have to do
* it once. */
dn_decode (ptr->ent_dn);
cache_entry (ptr, all_flag, value_flag);
seqno = add_sequence (ptr->ent_dn);
if (seqno != 0)
ps_printf (rps,"%-3d ",seqno);
nvec[1] = "-compact";
if (flag_show) {
call_showname (2, nvec);
if (! all_flag) {
Attr_Sequence eptr;
for (eptr = search_arg.sra_eis.eis_select; eptr != NULLATTR; eptr = eptr->attr_link)
showattribute (eptr->attr_type);
} else {
nvec [1] = "-noname";
call_showentry (2, nvec);
}
} else
ps_print (rps,"\n");
}
if (rel_dn != NULLDN) {
dn_free (rel_dn);
rel_dn = NULLDN;
}
dn_free (current_dn);
current_dn = save_dn;
current_entry = save_entry;
entryinfo_free (result.CSR_entries,0);
}
handle_problems (rps,result.CSR_cr,result.CSR_limitproblem);
}
filter_free (search_arg.sra_filter);
}
handle_problems (aps,cr,limit)
PS aps;
ContinuationRef cr;
int limit;
{
if (limit != LSR_NOLIMITPROBLEM)
switch (limit) {
case LSR_TIMELIMITEXCEEDED:
ps_print (aps, "(Time limit exceeded)\n");
break;
default: /* admin and user size limit */
ps_print (aps, "(Size limit exceeded)\n");
break;
}
/* always give references for now
* else
*/
if (cr != NULLCONTINUATIONREF) {
ContinuationRef crptr;
ps_print (aps, "NOTE partial results only:- could not contact following DSA(s):-\n");
for (crptr=cr; crptr != NULLCONTINUATIONREF; crptr=crptr->cr_next) {
dn_decode (crptr->cr_accesspoints.ap_name);
ps_print (aps," ");
dn_print (aps,crptr->cr_accesspoints.ap_name,EDBOUT);
dn_decode (crptr->cr_name);
ps_print (aps," (holding ");
dn_print (aps,crptr->cr_name,EDBOUT);
ps_print (aps,")\n");
}
}
}