|
|
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 d
Length: 29971 (0x7513)
Types: TextFile
Names: »dl.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Chans/dirlist/dl.c«
/* dl.c: */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/dirlist/RCS/dl.c,v 5.0 90/09/20 15:45:29 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Chans/dirlist/RCS/dl.c,v 5.0 90/09/20 15:45:29 pp Exp Locker: pp $
*
* $Log: dl.c,v $
* Revision 5.0 90/09/20 15:45:29 pp
* rcsforce : 5.0 public release
*
*/
#include "dlist.h"
#include "retcode.h"
#include <isode/quipu/ds_search.h>
#include <isode/quipu/connection.h> /* ds_search uses di_block - include this for lint !!! */
#include <isode/quipu/dua.h>
#include <varargs.h>
#include <isode/tailor.h>
extern LLog *log_dsap;
extern char * tailfile;
extern char * dsa_address;
extern char * myname;
extern char * local_dit;
extern char *postmaster;
extern Attr_Sequence current_print;
extern AttributeType at_Member;
extern AttributeType at_ObjectClass;
extern char * dn2str();
extern char * dn2ufn();
extern Filter strfilter(), ocfilter(), joinfilter();
DN localdn = NULLDN;
DN user = NULLDN;
DN str2dl();
DN get_manager_dn();
DN str2ufn ();
char * userstr;
char * strdl = NULLCP;
char forced_write = FALSE;
Attr_Sequence ufn_dl;
ORName * ufn_orName_parse();
extern OR_ptr orAddr_parse();
char * pager;
FILE * out;
ORName * user_in_list ();
ORName * addr_in_list ();
main (argc, argv)
int argc;
char **argv;
{
DN dl = NULLDN;
quipu_syntaxes ();
pp_syntaxes ();
sys_init(argv[0]);
or_myinit();
dsap_init ((int*)NULL,(char***)NULL);
(void) pp_quipu_run ();
if ((pager = getenv("PAGER")) == NULL)
pager = "more";
if (local_dit)
localdn = str2dn (local_dit);
do_args (argc,argv, &dl);
if (dl)
do_list (dl,strdl);
else
do_select ();
dl_unbind ();
}
do_args (argc,argv,dl)
int argc;
char **argv;
DN *dl;
{
int x;
char * dsa = NULLCP;
char * passwd = NULLCP;
char buf [LINESIZE];
for (x=1; x<argc; x++) {
if (strcmp (argv[x], "-u") == 0) {
if (++x == argc) {
(void) fprintf (stderr,"user name missing\n");
exit (-1);
}
userstr = argv[x];
if ((user = str2dn (argv[x])) == NULLDN) {
(void) fprintf (stderr,"Error in DN '%s'\n",argv[x]);
exit (-1);
}
} else if (strcmp(argv[x], "-c") == 0) {
if (++x == argc) {
(void) fprintf (stderr,"dsa name missing\n");
exit (-1);
}
dsa = argv[x];
} else if (strcmp(argv[x], "-f") == 0) {
forced_write = TRUE;
} else if (*argv[x] == '-') {
(void) fprintf (stderr,"Usage: %s [-u <DN>] [-c <dsa>] [listname] -f\n",argv[0]);
exit (-1);
} else
strdl = argv[x];
}
if (dsa != NULLCP) {
FILE *fp;
char save_bdsa[LINESIZE];
(void) strcpy (myname = save_bdsa, dsa);
dsa_address = NULLCP;
/* read tailor file to get address */
if( (fp = fopen(isodefile(tailfile, 0), "r")) == (FILE *)NULL) {
(void) fprintf (stderr,"can't open %s",tailfile);
exit (-1);
}
while(fgets(buf, sizeof(buf), fp) != NULLCP)
if ( (*buf != '#') && (*buf != '\n') )
/* not a comment or blank */
(void) tai_string (buf);
(void) fclose(fp);
if (dsa_address == NULLCP)
dsa_address = myname;
}
if (user == NULLDN) {
/* try ~/.quipurc */
FILE * file;
char * home, *p, *part1, *part2, *TidyString();
char Dish_Home[LINESIZE];
char Read_in_Stuff[LINESIZE];
if (home = getenv ("QUIPURC"))
(void) strcpy (Dish_Home, home);
else
if (home = getenv ("HOME"))
(void) sprintf (Dish_Home, "%s/.quipurc", home);
else
(void) strcpy (Dish_Home, "./.quipurc");
if ((file = fopen (Dish_Home, "r")) != 0) {
while (fgets (Read_in_Stuff, LINESIZE, file) != 0) {
p = SkipSpace (Read_in_Stuff);
if (( *p == '#') || (*p == '\0'))
continue; /* ignore comments and blanks */
part1 = p;
if ((part2 = index (p,':')) == NULLCP)
continue;
*part2++ = '\0';
part2 = TidyString (part2);
if (lexequ (part1, "username") == 0) {
userstr = strdup (part2);
user = str2dn (userstr);
} else if (lexequ (part1, "password") == 0)
passwd = strdup (part2);
}
(void) fclose (file);
}
}
if ((user != NULLDN) && (passwd == NULLCP)) {
(void) sprintf (buf,"Enter password for \"%s\": ",userstr);
(void) strcpy (buf,getpassword (buf));
passwd = buf;
}
if (dl_bind (user,passwd) == NOTOK) {
(void) fprintf (stderr,"Attempt to connect to DSA failed\n");
exit (-1);
}
if (strdl)
if ((*dl = str2dl (strdl,localdn)) == NULLDN) {
(void) fprintf (stderr,"Unknown list '%s'\n",strdl);
exit (-1);
}
}
static void openpager(ps)
PS ps;
{
(void) ps_flush (ps);
if (isatty(fileno((FILE *)ps->ps_addr)) == 0) {
out = stdout;
} else if ((out = popen(pager,"w")) == NULL) {
(void) fprintf(stderr,"unable to start pager '%s'",pager);
out = stdout;
}
ps->ps_addr = (caddr_t) out;
}
static void closepager(ps)
PS ps;
{
(void) ps_flush(ps);
if (out != stdout) {
(void) pclose(out);
out = stdout;
}
ps->ps_addr = (caddr_t) out;
}
do_select ()
{
int quit = FALSE;
char buf[BUFSIZ],
tmpbuf[BUFSIZ],
ch;
PS ps;
DN dl;
DN newloc;
if ((ps = ps_alloc (std_open)) == NULLPS) {
(void) fprintf (stderr,"Can't set up output (3)\n");
return;
}
if (std_setup (ps, stdout) == NOTOK) {
(void) fprintf (stderr,"Can't set up output (4)\n");
return;
}
while (quit == FALSE) {
(void) printf("\n> ");
(void) fflush (stdout);
if (gets (buf) == NULL) {
(void) printf ("\n");
exit(OK);
}
compress (buf, buf);
if (buf[0] == NULL || strlen(buf) == 0) {
(void) printf("\nType 'h' or '?' for help\n");
continue;
}
if (strlen(buf) > 1)
ch = 'A';
else if (*buf == '?')
ch = '?';
else
ch = uptolow(*buf);
switch (ch)
{
case 'h':
case '?':
(void) printf ("\nOptions are:\n");
(void) printf (" 'l'ist the list,\n");
(void) printf (" 'c'reate a list,\n");
(void) printf (" 'w'hich lists am I on,\n");
(void) printf (" 'm'ove to somewhere else in the DIT,\n");
(void) printf (" 'q'uit,\n");
(void) printf (" OR, the name of a list to visit.\n");
break;
case 'q':
quit = TRUE;
break;
case 'l':
openpager(ps);
dl_search (ps);
closepager(ps);
break;
case 'c':
if (!user)
(void) fprintf (stderr,"Don't know your distinguished name !\n");
else if (dl_create () == 0)
(void) printf ("Done\n");
else
(void) fprintf (stderr,"Failed\n");
break;
case 'w':
openpager(ps);
which_list (ps);
closepager(ps);
continue;
case 'm':
ps_print (ps,"Currently at '");
ufn_dn_print (ps,localdn,FALSE);
ps_print (ps,"'\nEnter new location: ");
(void) ps_flush (ps);
if ((gets(tmpbuf) == NULL) || (tmpbuf == NULLCP) || (*tmpbuf == 0)) {
ps_print (ps,"\n(exit)\n");
clearerr(stdin);
break;
}
compress (tmpbuf, tmpbuf);
if ((newloc = str2ufn (tmpbuf)) != NULLDN) {
(void) printf ("Moved!\n");
localdn = newloc;
}
break;
case 'A':
if ((dl = str2dl (buf,localdn)) != NULLDN) {
(void) fprintf (stderr,"Reading '%s'...\n",buf);
do_list (dl,buf);
} else
(void) fprintf (stderr,"Unknown list '%s'\n",buf);
break;
default:
(void) printf("\nType 'h' or '?' for help\n");
break;
}
}
ps_free (ps);
}
static ORName * num2or (num)
int num;
{
Attr_Sequence as;
AV_Sequence avs;
int i = 1;
if (current_print == NULLATTR) {
(void) fprintf (stderr,"List has changed - check number!!!\n");
return NULLORName;
}
if ((as = as_find_type (current_print,at_Member)) == NULLATTR) {
(void) fprintf (stderr,"List has changed - check number!!!\n");
return NULLORName;
}
for(avs = as->attr_value; avs != NULLAV; avs = avs->avseq_next, i++)
if (i == num) {
current_print = NULLATTR;
return (ORName *) avs->avseq_av.av_struct;
}
(void) fprintf (stderr,"Number too high\n");
return NULLORName;
}
do_list (dl,prompt)
DN dl;
char * prompt;
{
Attr_Sequence as, dir_getdl_aux();
int quit = FALSE;
char buf[BUFSIZ],
tmpbuf[BUFSIZ],
ch;
PS ps;
ORName * orname;
char can_write;
ORName * on_list;
char re_read = FALSE;
if ((as = dir_getdl_aux (dl)) == NULLATTR) {
(void) fprintf (stderr,"Can't read the list\n");
return;
}
if (!(can_write = can_user_write (as,user))) {
(void) printf("Only the manager can modify this list.\n");
on_list = user_in_list (as,user);
}
if ((ps = ps_alloc (std_open)) == NULLPS) {
(void) fprintf (stderr,"Can't set up output\n");
return;
}
if (std_setup (ps, stdout) == NOTOK) {
(void)fprintf (stderr,"Can't set up output (2)\n");
return;
}
while (quit == FALSE) {
if (re_read) {
if ((as = dir_getdl_aux (dl)) == NULLATTR) {
(void) fprintf (stderr,"Can't re-read the list!\n");
return;
}
if (!(can_write = can_user_write (as,user)))
on_list = user_in_list (as,user);
re_read = FALSE;
}
(void) printf("\n%s> ",prompt);
(void) fflush (stdout);
if (gets (buf) == NULL) {
clearerr (stdin);
(void) printf("\n");
return;
}
compress (buf, buf);
if (buf[0] == NULL || strlen(buf) == 0) {
(void) printf("\nType 'h' or '?' for help\n");
continue;
}
if (strlen(buf) > 1)
ch = 'A';
else if (*buf == '?')
ch = '?';
else
ch = uptolow(*buf);
switch (ch)
{
case 'h':
case '?':
(void) printf ("\nOptions are:\n");
(void) printf (" 'p'rint to view the list,\n");
(void) printf (" 'c'heck the list, reporting errors,\n");
if (can_write) {
(void) printf (" 'v'alidate the list, updating errors,\n");
(void) printf (" 'r'emove an entry from the list,\n");
(void) printf (" 'q'uit,\n");
(void) printf (" OR, enter an ORName to add to the list.\n");
} else {
if (on_list)
(void) printf (" 'r'emove yourself from the list,\n");
else if (user)
(void) printf (" 'a'dd yourself to the list,\n");
(void) printf (" 'q'uit.\n");
}
break;
case 'q':
quit = TRUE;
break;
case 'p':
openpager(ps);
dl_print (ps,dl);
closepager(ps);
break;
case 'r':
if (! can_write) {
if (on_list) {
if (! user)
goto wally;
(void) mail_manager (ps,user,TRUE,as,dl);
break;
}
goto wally;
}
(void) printf ("give username to be removed: ");
if ((gets(tmpbuf) == NULL) || (tmpbuf == NULLCP) || (*tmpbuf == 0)) {
ps_print (ps,"\n(exit)\n");
clearerr(stdin);
break;
}
compress (tmpbuf, tmpbuf);
if (isdigit (*tmpbuf))
orname = num2or (atoi(tmpbuf));
else
orname = ufn_orName_parse (tmpbuf,as);
if (orname != NULLORName) {
if (! orname_confirm(ps,orname,TRUE)) {
clearerr(stdin);
break;
}
ps_print (ps,"Removing...\n");
(void) dl_modify (ps,orname,dl,TRUE);
re_read = TRUE;
}
break;
case 'c':
if ((as = dir_getdl_aux (dl)) == NULLATTR) {
(void) fprintf (stderr,"Can't read the list\n");
break;
}
openpager(ps);
check_dl_members (ps,dl,as,TRUE,TRUE,FALSE);
closepager(ps);
break;
case 'v':
if (! can_write)
goto wally;
if ((as = dir_getdl_aux (dl)) == NULLATTR) {
(void) fprintf (stderr,"Can't read the list\n");
break;
}
check_dl_members (ps,dl,as,TRUE,TRUE,TRUE);
re_read = TRUE;
break;
case 'a':
if (! can_write) {
if (on_list) {
ps_print (ps,"You are already on the list!\n");
} else {
if (!user)
goto wally;
(void) mail_manager (ps,user,FALSE,as,dl);
}
} else
(void) printf("\nType 'h' or '?' for help\n");
break;
case 'A':
if (! can_write) {
wally:;
if (user) {
ps_print (ps,"\nYou do not have sufficient access rights to modify the list,\n");
ps_print (ps,"You should contact the list manager (");
ufn_dn_print (ps,get_manager_dn(as,TRUE),FALSE);
ps_print (ps,").\n");
} else {
ps_print (ps,"\nI don't know who you are.\n");
}
break;
} else if ((orname = ufn_orName_parse (buf,NULLATTR)) != NULLORName)
if (check_list (ps,orname,as,dl)) {
if (orname_confirm(ps,orname,FALSE)) {
(void) dl_modify(ps,orname,dl,FALSE);
re_read = TRUE;
}
}
break;
default:
(void) printf("\nType 'h' or '?' for help\n");
break;
}
}
ps_free (ps);
}
check_list (ps,orname,as,dl)
PS ps;
ORName * orname;
Attr_Sequence as;
DN dl;
{
ORName * or;
if (orname->on_dn) {
if (or = user_in_list (as,orname->on_dn)) { /* Assign */
ps_print (ps,"'");
orName_print (ps,or,UFNOUT);
ps_print (ps,"' is already on the list!\n");
(void) check_ORName (ps,or,TRUE,TRUE,FALSE,dl);
return FALSE;
}
}
if (orname->on_or) {
if (or = addr_in_list (as,orname->on_or)) { /* Assign */
ps_print (ps,"'");
orName_print (ps,or,UFNOUT);
ps_print (ps,"' is already on the list!\n");
(void) check_ORName (ps,or,TRUE,TRUE,FALSE,dl);
return FALSE;
}
}
return check_ORName (ps,orname,TRUE,TRUE,FALSE,dl);
}
dl_search (ps)
PS ps;
{
struct ds_search_arg search_arg;
static struct ds_search_result result;
struct DSError err;
static CommonArgs ca = default_common_args;
Filter filt;
EntryInfo * ptr;
if ((filt = ocfilter ("ppDistributionList")) == NULLFILTER)
return;
search_arg.sra_baseobject = localdn;
search_arg.sra_filter = filt;
search_arg.sra_subset = SRA_ONELEVEL;
search_arg.sra_searchaliases = FALSE;
search_arg.sra_common = ca; /* struct copy */
search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
search_arg.sra_eis.eis_allattributes = FALSE;
search_arg.sra_eis.eis_select = NULLATTR;
if (ds_search (&search_arg, &err, &result) != DS_OK) {
filter_free (filt);
log_ds_error (&err);
ds_error_free (&err);
(void) fprintf (stderr,"Search returned an error !\n");
return;
}
ps_print (ps,"Found the following lists:");
for (ptr = result.CSR_entries; ptr != NULLENTRYINFO; ptr=ptr->ent_next) {
#if ISODE < 65
(void) dn_decode (ptr->ent_dn);
#endif
ps_print (ps,"\n ");
ufn_dn_print (ps,ptr->ent_dn,FALSE);
}
ps_print (ps,"\n");
}
which_list (ps)
PS ps;
{
struct ds_search_arg search_arg;
static struct ds_search_result result;
struct DSError err;
static CommonArgs ca = default_common_args;
Filter filt_dl, filt_dn, filt_oraddr, filt_or, filt_and, filt_dn2;
EntryInfo * ptr;
AttributeValue av;
ORName * or, * orName_parse();
OR_ptr newor, as2or(), saveor;
Attr_Sequence as, dn2addr();
if (user == NULLDN) {
(void) fprintf (stderr,"You did not supply a name at the start, so I don't know who you are!\n");
return;
}
or = ufn_orName_parse (userstr,NULLATTR);
if ((as = dn2addr (or->on_dn)) != NULLATTR)
newor = as2or (as);
if (newor == NULLOR) {
(void) fprintf (stderr,"Can't work out your mail adddress\n");
return;
}
or->on_or = newor;
av = AttrV_alloc ();
av->av_struct = (caddr_t) or;
#if ISODE >= 65
av->av_syntax = at_Member->oa_syntax;
#else
av->av_syntax = at_Member->at_table->oa_syntax;
#endif
filt_dn = filter_alloc ();
filt_dn->flt_next = NULLFILTER;
filt_dn->flt_type = FILTER_ITEM;
filt_dn->FUITEM.fi_type = FILTERITEM_EQUALITY;
filt_dn->FUITEM.UNAVA.ava_type = AttrT_cpy(at_Member);
filt_dn->FUITEM.UNAVA.ava_value = AttrV_cpy (av);
filt_dn2 = filter_alloc ();
filt_dn2->flt_next = filt_dn;
filt_dn2->flt_type = FILTER_ITEM;
filt_dn2->FUITEM.fi_type = FILTERITEM_EQUALITY;
filt_dn2->FUITEM.UNAVA.ava_type = AttrT_cpy(at_Member);
saveor = or->on_or;
or->on_or = NULLOR;
filt_dn2->FUITEM.UNAVA.ava_value = AttrV_cpy (av);
or->on_or = saveor;
dn_free (or->on_dn);
or->on_dn = NULLDN;
filt_oraddr = filter_alloc ();
filt_oraddr->flt_next = filt_dn2;
filt_oraddr->flt_type = FILTER_ITEM;
filt_oraddr->FUITEM.fi_type = FILTERITEM_EQUALITY;
filt_oraddr->FUITEM.UNAVA.ava_type = AttrT_cpy(at_Member);
filt_oraddr->FUITEM.UNAVA.ava_value = av;
filt_or = joinfilter (filt_oraddr,FILTER_OR);
if ((filt_dl = ocfilter ("ppDistributionList")) == NULLFILTER)
return;
filt_dl->flt_next = filt_or;
filt_and = joinfilter (filt_dl,FILTER_AND);
search_arg.sra_baseobject = localdn;
search_arg.sra_filter = filt_and;
search_arg.sra_subset = SRA_ONELEVEL;
search_arg.sra_searchaliases = FALSE;
search_arg.sra_common = ca; /* struct copy */
search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
search_arg.sra_eis.eis_allattributes = FALSE;
search_arg.sra_eis.eis_select = NULLATTR;
if (ds_search (&search_arg, &err, &result) != DS_OK) {
filter_free (filt_and);
log_ds_error (&err);
ds_error_free (&err);
(void) fprintf (stderr,"Search failed\n");
return;
}
filter_free (filt_and);
ps_print (ps,"You are on the following:");
for (ptr = result.CSR_entries; ptr != NULLENTRYINFO; ptr=ptr->ent_next) {
#if ISODE < 65
(void) dn_decode (ptr->ent_dn);
#endif
ps_print (ps,"\n ");
ufn_dn_print (ps,ptr->ent_dn,FALSE);
}
ps_print (ps,"\n");
}
can_user_write (as,thisuser)
Attr_Sequence as;
DN thisuser;
{
DN manager;
if (forced_write)
return TRUE;
if (thisuser == NULLDN)
return FALSE;
if ((manager = get_manager_dn (as,TRUE)) == NULLDN)
return FALSE;
if (dn_cmp (manager, thisuser) == 0)
return TRUE;
else
return FALSE;
}
ORName * user_in_list (as,thisuser)
Attr_Sequence as;
DN thisuser;
{
ORName * or;
Attr_Sequence tmp;
AV_Sequence eptr;
if (thisuser == NULLDN)
return NULLORName;
if ((tmp = as_find_type (as,at_Member)) == NULLATTR)
return NULLORName;
for (eptr = tmp->attr_value; eptr != NULLAV; eptr = eptr->avseq_next) {
or = (ORName *)eptr->avseq_av.av_struct;
if (dn_cmp (or->on_dn,thisuser) == 0)
return or;
}
return NULLORName;
}
ORName * addr_in_list (as,addr)
Attr_Sequence as;
OR_ptr addr;
{
ORName * or;
Attr_Sequence tmp;
AV_Sequence eptr;
if (addr == NULLOR)
return NULLORName;
if ((tmp = as_find_type (as,at_Member)) == NULLATTR)
return NULLORName;
for (eptr = tmp->attr_value; eptr != NULLAV; eptr = eptr->avseq_next) {
or = (ORName *)eptr->avseq_av.av_struct;
if (orAddr_cmp (or->on_or,addr) == 0)
return or;
}
return NULLORName;
}
DNS interact (dns,dn,s)
DNS dns;
DN dn;
char * s;
{
char buf[LINESIZE];
DNS result = NULLDNS;
DNS newdns;
PS ps;
if ((ps = ps_alloc (std_open)) == NULLPS) {
(void) fprintf (stderr,"Can't set up output (5)\n");
return NULLDNS;
}
if (std_setup (ps, stdout) == NOTOK) {
(void) fprintf (stderr,"Can't set up output (6)\n");
return NULLDNS;
}
if (dns == NULLDNS)
return NULLDNS;
ps_printf (ps,"Please select from the following (matching '%s'):\n",s);
while (dns != NULLDNS) {
ps_print (ps," ");
(void) ufn_dn_print_aux (ps,dns->dns_dn,dn,TRUE);
if (ufn_dl) {
if (user_in_list (ufn_dl,dns->dns_dn)) {
DNS tmp;
ps_print (ps,"(Discarded - not in list)\n");
tmp = dns;
dns = dns->dns_next;
tmp->dns_next = NULLDNS;
dn_seq_free (tmp);
continue;
}
}
ps_print (ps," [y/n] ? ");
(void) ps_flush (ps);
again:;
if (gets (buf) == NULL) {
clearerr (stdin);
ps_print (ps,"(exit)\n");
return result;
}
if ((buf[0] == NULL)
|| (strlen(buf) != 1)
|| ((buf[0] != 'y') && (buf[0] != 'n'))) {
ps_print (ps,"Please type 'y' or 'n': ");
(void) ps_flush (ps);
goto again;
}
if (buf[0] == 'y') {
newdns = dn_seq_alloc();
newdns->dns_next = result;
newdns->dns_dn = dn_cpy (dns->dns_dn);
result = newdns;
dns = dns->dns_next;
} else {
DNS tmp;
tmp = dns;
dns = dns->dns_next;
tmp->dns_next = NULLDNS;
dn_seq_free (tmp);
}
}
ps_free (ps);
return result;
}
DN str2ufn (ufn)
char * ufn;
{
DNS dns = NULLDNS;
int n;
char * v[20];
PS ps;
extern char ufn_notify;
static envlist el = NULLEL;
if (el == NULLEL) {
ufn_notify = TRUE;
if ((el = read_envlist ()) == NULLEL) {
(void) fprintf (stderr,"Can't read environment\n");
return NULLDN;
}
}
if ((ps = ps_alloc (std_open)) == NULLPS) {
(void) fprintf (stderr,"Can't set up output (7)\n");
return NULLDN;
}
if (std_setup (ps, stdout) == NOTOK) {
(void) fprintf (stderr,"Can't set up output (8)\n");
return NULLDN;
}
if ((n = sstr2arg (ufn,20,v,",\n")) == NOTOK) {
(void) fprintf (stderr, "Can't parse input !!!\n");
return NULLDN;
}
ps_print (ps,"Searching...\n");
if ( ! ufn_match (n,v,interact,&dns,el)) {
(void) fprintf (stderr, "Try again later !!!\n");
return NULLDN;
} else {
if (dns == NULLDNS) {
(void) fprintf (stderr, "Nothing matched\n");
return NULLDN;
} else if (dns->dns_next == NULLDNS) {
return dns->dns_dn;
} else {
dns = interact (dns,localdn,ufn);
if (dns == NULLDNS) {
(void) fprintf (stderr, "Nothing matched\n");
return NULLDN;
} else if (dns->dns_next == NULLDNS) {
return dns->dns_dn;
}
ps_print (ps, "\nYou need to select one name!\n ");
return NULLDN;
}
}
/* NOTREACHED */
}
ORName * ufn_orName_parse (str,thisdl)
char * str;
Attr_Sequence thisdl;
{
ORName * or;
char * ptr;
extern int print_parse_errors, parse_status;
int old;
Attr_Sequence as, dn2addr();
OR_ptr as2or();
or = (ORName *) smalloc (sizeof (ORName));
if ( (ptr=index (str,'$')) == NULLCP) {
old = print_parse_errors;
print_parse_errors = FALSE;
ptr = strdup (str);
if ((or->on_dn = str2dn (ptr)) == NULLDN) {
free (ptr);
parse_status--; /* ignore error */
print_parse_errors = old;
if ((or->on_dn = str2ufn (str)) == NULLDN)
return (NULLORName);
ufn_dl = thisdl;
} else {
free (ptr);
print_parse_errors = old;
}
if ((as = dn2addr (or->on_dn)) != NULLATTR)
or->on_or = as2or (as);
else
or->on_or = NULLOR;
if (thisdl) {
if (user_in_list(thisdl,or->on_dn))
return or;
orName_free (or);
(void) fprintf (stderr,"User not in list !\n");
return NULLORName;
}
return or;
}
*ptr--= 0;
if (isspace (*ptr)) {
*ptr = 0;
}
ptr++;
ptr++;
if (*str == 0)
or->on_dn = NULLDN;
else {
if ((or->on_dn = str2ufn (str)) == NULLDN)
return (NULLORName);
ufn_dl = thisdl;
}
ptr = SkipSpace(ptr);
if (*ptr == 0) {
or->on_or = NULLOR;
if (or->on_dn != NULLDN)
if ((as = dn2addr (or->on_dn)) != NULLATTR)
or->on_or = as2or (as);
} else if ((or->on_or = orAddr_parse (ptr)) == NULLOR)
return (NULLORName);
if (thisdl) {
if (or->on_dn && user_in_list(thisdl,or->on_dn))
return or;
if (or->on_or && addr_in_list(thisdl,or->on_or))
return or;
orName_free (or);
(void) fprintf (stderr,"User not in list !\n");
return NULLORName;
}
return (or);
}
char input[BUFSIZ];
static int getinput()
{
RP_Buf rp;
again:;
(void) fflush(stdout);
if (gets (input) == NULL) {
clearerr(stdin);
pps_end(NOTOK,&rp);
return NOTOK;
}
compress (input, input);
if (*input == '\0') {
(void) printf ("\t-> ");
goto again;
}
return OK;
}
static int error_user()
{
RP_Buf rp;
pps_end(NOTOK, &rp);
return NOTOK;
}
static int error_pps(rp)
RP_Buf *rp;
{
(void) printf("pps_error: %s\n",rp->rp_line);
(void) fflush(stdout);
return NOTOK;
}
/*\f
*/
orname_confirm (ps,orname,remove)
PS ps;
ORName * orname;
char remove;
{
register char c;
if (remove)
ps_printf (ps,"Remove ");
else
ps_printf (ps,"Add ");
orName_print (ps,orname,UFNOUT);
ps_printf (ps," [y/n/d] ? ");
ps_flush (ps);
again:;
c = ttychar ();
switch (c)
{
case 'Y':
case 'y':
(void) printf ("yes\r\n");
(void) fflush (stdout);
return (TRUE);
case 'N':
case 'n':
(void) printf ("no\r\n");
(void) fflush(stdout);
return (FALSE);
case 'D':
case 'd':
(void) printf ("display...\r\n");
if (orname->on_dn)
dl_showentry (ps,orname->on_dn);
else
orName_print (ps,orname,UFNOUT);
if (remove)
ps_printf (ps,"Remove [y/n] ? ");
else
ps_printf (ps,"Add [y/n] ? ");
ps_flush (ps);
goto again;
default:
(void) printf ("Type y(es), n(o) or (d)isplay ");
(void) fflush(stdout);
goto again;
}
}
confirm (str)
char *str;
{
register char c;
if (str != NULL) {
(void) printf(str);
(void) fflush(stdout);
}
again:;
(void) printf (" [y/n] ");
(void) fflush (stdout);
c = ttychar ();
switch (c)
{
case 'Y':
case 'y':
(void) printf ("yes\r\n");
(void) fflush (stdout);
return (TRUE);
case 'N':
case 'n':
(void) printf ("no\r\n");
(void) fflush(stdout);
return (FALSE);
default:
(void) printf ("Type y or n\n");
(void) fflush(stdout);
goto again;
}
}
ttychar ()
{
register int c;
char buf[LINESIZE];
(void) fflush (stdout);
if (fgets (buf, LINESIZE, stdin) == 0)
clearerr(stdin);
c = buf[0];
c = toascii (c); /* get rid of high bit */
if (c == '\r')
c = '\n';
return (c);
}
dl_create ()
{
RP_Buf rp;
DN dn;
(void) printf("Please wait while I initialise things ...");
(void) fflush(stdout);
if (pps_1adr("Directory Based Distribution List creation request",
postmaster,
&rp) != OK)
return error_pps(&rp);
(void) printf("\nName of new list -> ");
if (getinput() == NOTOK)
return error_user();
if ((dn = str2dl (input,localdn)) != NULLDN) {
dn_free (dn);
(void) printf("'%s' list already exists\n",input);
return error_user();
}
if (pps_txt("\ncn= ",&rp) != OK)
return error_pps(&rp);
if (pps_txt(input,&rp) != OK)
return error_pps(&rp);
if (pps_txt("\nOwner= ",&rp) != OK)
return error_pps(&rp);
if (pps_txt(dn2str(user),&rp) != OK)
return error_pps(&rp);
if (pps_txt("\nmhsDLMembers= ",&rp) != OK)
return error_pps(&rp);
if (pps_txt(dn2str(user),&rp) != OK)
return error_pps(&rp);
(void) printf("Description of list (one line only) -> ");
if (getinput() == NOTOK)
return error_user();
if (pps_txt("\nDescription= ",&rp) != OK)
return error_pps(&rp);
if (pps_txt(input,&rp) != OK)
return error_pps(&rp);
(void) printf("List policy -> ");
if (getinput() == NOTOK)
return error_user();
if (pps_txt("\ndl-Policy= ",&rp) != OK)
return error_pps(&rp);
if (pps_txt(input,&rp) != OK)
return error_pps(&rp);
(void) printf("List Submission Permisssion -> ");
if (getinput() == NOTOK)
return error_user();
if (pps_txt("\nmhsDLSubmitPermissions= ",&rp) != OK)
return error_pps(&rp);
if (pps_txt(input,&rp) != OK)
return error_pps(&rp);
if (pps_txt("\nObjectClass=ppDistributionList",&rp) != OK)
return error_pps(&rp);
(void) printf("\nDo you want to pass this message on to the postmaster ?");
if (confirm (NULLCP) == FALSE) {
pps_end(NOTOK,&rp);
return 0;
}
(void) printf("Please wait while I tidy things up ...");
(void) fflush(stdout);
if (pps_end(OK,&rp) != OK)
return error_pps(&rp);
(void) printf ("\nYour request has been passed to an administrator\n");
(void) printf ("You will be notified in a short time when the list has been created\n");
(void) printf ("You can then use this program to enter names into the list\n\n");
(void) fflush (stdout);
return 0;
}
mail_manager (ps,dn,remove,as,dl)
PS ps;
DN dn;
char remove;
Attr_Sequence as;
DN dl;
{
DN manager, get_manager_dn();
DN nice_manager;
RP_Buf rp;
Attr_Sequence das,dn2addr();
OR_ptr or,as2or ();
char man_buf [LINESIZE];
if (remove)
ps_print (ps,"\nSorry, you can't remove youself from the list.\n");
else
ps_print (ps,"\nSorry, you can't add youself to the list.\n");
if ((manager = get_manager_dn(as,FALSE)) == NULLDN)
return NOTOK;
if ((nice_manager = get_manager_dn(as,TRUE)) == NULLDN)
return NOTOK;
if ((das = dn2addr (manager)) == NULLATTR)
return NOTOK;
if ((or = as2or (das)) == NULLOR)
return NOTOK;
or_or2rfc (or,man_buf);
/* Could be neat - and check the submit permissions to make sure
* the user is allowed on the list !
*/
ps_print (ps, "Do you want to mail a request to the Manager,\n");
ufn_dn_print (ps,nice_manager,TRUE);
ps_print (ps, " ?");
(void) ps_flush (ps);
if (! confirm (NULLCP))
return NOTOK;
(void) printf("Please wait...\n");
(void) fflush(stdout);
if (pps_1adr("Directory Based Distribution List modification request",
man_buf,
&rp) != OK)
return error_pps(&rp);
if (remove) {
if (pps_txt("\nPlease remove\n ",&rp) != OK)
return error_pps(&rp);
} else {
if (pps_txt("\nPlease add\n ",&rp) != OK)
return error_pps(&rp);
}
if (pps_txt(dn2ufn(dn,FALSE),&rp) != OK)
return error_pps(&rp);
if (remove) {
if (pps_txt("\nfrom the list\n ",&rp) != OK)
return error_pps(&rp);
} else {
if (pps_txt("\nto the list\n ",&rp) != OK)
return error_pps(&rp);
}
if (pps_txt(dn2ufn(dl,FALSE),&rp) != OK)
return error_pps(&rp);
if (pps_txt(".\n\nThanks in advance.",&rp) != OK)
return error_pps(&rp);
if (pps_end(OK,&rp) != OK)
return error_pps(&rp);
(void) printf ("Your request has been passed to the manager.\n");
(void) fflush (stdout);
return 0;
}
#ifndef lint
void advise (va_alist)
va_dcl
{
int code;
va_list ap;
va_start (ap);
code = va_arg (ap, int);
(void) _ll_log (log_dsap, code, ap);
va_end (ap);
}
#else
/* VARARGS */
void advise (code, what, fmt)
char *what,
*fmt;
int code;
{
advise (code, what, fmt);
}
#endif