2 * Copyright (c) 1992, 1993 Regents of the University of Michigan.
5 * Redistribution and use in source and binary forms are permitted
6 * provided that this notice is preserved and that due credit is given
7 * to the University of Michigan at Ann Arbor. The name of the University
8 * may not be used to endorse or promote products derived from this
9 * software without specific prior written permission. This software
10 * is provided ``as is'' without express or implied warranty.
30 #include <ldapconfig.h>
32 #if !defined(DOS) && !defined( VMS)
33 #include <sys/types.h>
38 #else /* USE_TERMIOS */
40 #endif /* USE_TERMIOS */
52 char * mygetpass(prompt)
55 #if defined(DOS) || defined(VMS)
61 printf("->mygetpass(%s)\n", prompt);
65 while ( (c = getch()) != EOF && c != '\n' && c != '\r' )
76 static char pbuf[513];
84 printf("->mygetpass(%s)\n", prompt);
87 * Stolen from the getpass() routine. Can't use the plain
88 * getpass() for two reasons. One is that X.500 passwords
89 * can be really, really long - much longer than 8 chars.
90 * The second is that we like to make this client available
91 * out of inetd via a Merit asynch port, and we need to be
92 * able to do telnet control codes to turn on and off line
95 if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL)
98 setbuf(fi, (char *)NULL);
99 sig = signal(SIGINT, SIG_IGN);
101 if (GETATTR(fileno(fi), &ttyb) < 0)
104 flags = GETFLAGS( ttyb );
105 SETFLAGS( ttyb, flags & ~ECHO );
107 if (SETATTR(fileno(fi), &ttyb) < 0)
111 /* blank the line if through Merit */
113 printf("%c%c%c", 255, 251, 1);
115 (void) scanf("%c%c%c", &i, &j, &k);
119 /* fetch the password */
120 fprintf(stdout, "%s", prompt);
122 for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) {
132 if (*(p - 1) == '\r')
136 /* unblank the line if through Merit */
138 printf("%c%c%c", 255, 252, 1);
140 (void) scanf("%c%c%c", &i, &j, &k);
142 printf("\n"); fflush(stdout);
144 fprintf(stdout, "\n");
148 SETFLAGS( ttyb, flags );
150 if (SETATTR(fileno(fi), &ttyb) < 0)
153 (void) signal(SIGINT, sig);
164 void printbase(lead, s)
169 char * friendly_name();
173 printf("->printbase(%s, %s)\n", lead, s);
176 printf("%sroot\n", lead);
180 rdns = ldap_explode_dn(s, TRUE);
181 for (cp = rdns; ; ) {
182 printf("%s", friendly_name(*cp));
191 ldap_value_free(rdns);
195 fetch_buffer(buffer, length, where)
206 printf("->fetch_buffer(%x, %d, %x)\n", buffer, length, where);
209 * Fetch a buffer and strip off any leading or trailing non-printing
210 * characters, namely newlines and carriage returns.
212 if (fgets(buffer, length, where) == NULL) {
214 errno = 0; /* so fatal() doesn't bitch */
217 for (i = strlen(buffer) - 1; i >= 0 && !isprint(buffer[i]); i--)
221 while ( *p != '\0' ) {
222 if ( isprint( *p )) {
244 extern struct entry Entry;
251 printf("->isgroup()\n");
253 if ((i = attr_to_index("objectClass")) == -1)
255 vp = Entry.attrs[i].values;
256 for (i = 0; *vp != NULL; vp++) {
259 if (debug & D_GROUPS)
260 printf("class #%1d: (%s)\n", i, *vp);
262 if (!strcmp(*vp, "rfc822MailGroup"))
269 * Print out the string 's' on a field of 'width' chracters. Each line
270 * should be indented 'lead' characters.
272 format(str, width, lead)
276 char *s, *original, *leader = "";
283 printf("->format(%s, %d, %d)\n", str, width, lead);
286 fprintf(stderr, " Cannot format (%s, %d, %d)\n", str, width, lead);
290 leader = (char *) Malloc((unsigned) (lead + 1));
291 (void) memset(leader, ' ', lead);
292 *(leader + lead) = '\0';
296 * Some compilers get really unhappy with this function since it
297 * fiddles around with the first argument, which could be a string
298 * constant. We do a strdup() here so we can do whatever the hell
301 s = original = strdup(str);
303 if ((strlen(s) + lead) < width) {
304 printf("%s%s\n", leader, s);
310 cp = s + width - lead;
311 while (!isspace(*cp) && (cp != s))
316 printf("%s%s\n", leader, s);
322 * Print out the string 's' on a field of 'width' chracters. The first line
323 * should be indented 'first_indent' spaces, then followed by 'first_tag',
324 * and then followed by the first line of 's'. Subsequent lines should be
325 * indented 'indent' spaces, then followed by 'tag', and then followed by
326 * subsequent lines of 's'.
328 format2(s, first_tag, tag, first_indent, indent, width)
329 char *s, *first_tag, *tag;
330 int first_indent, indent, width;
337 if (first_tag == NULL)
343 printf("format2(\"%s\", \"%s\", \"%s\", %1d, %1d, %1d)\n", s,
344 first_tag, tag, first_indent, indent, width);
347 /* make sure the indents are sane */
348 if ((first_indent >= width) || (indent >= width)) {
349 fprintf(stderr, " Cannot format: indent too large\n");
353 /* make the indentations */
354 if (first_indent > 0) {
355 fi = (char *) Malloc((unsigned) (first_indent + 1));
356 (void) memset(fi, ' ', first_indent);
357 *(fi + first_indent) = '\0';
362 i = (char *) Malloc((unsigned) (indent + 1));
363 (void) memset(i, ' ', indent);
364 *(i + indent) = '\0';
369 /* now do the first line */
370 if ((strlen(s) + strlen(first_tag) + first_indent) < width) {
371 printf("%s%s%s\n", fi, first_tag, s);
379 * 's' points to the beginning of the string we want to print.
380 * We point 'cp' to the end of the maximum amount of text we
381 * can print (i.e., total width less the indentation and the
382 * length of the tag). Once we have set 'cp' initially we
383 * back it up to the first space character.
385 cp = s + width - first_indent - strlen(first_tag);
386 while (!isspace(*cp) && (cp != s))
390 * Once there, we change that space character to a null, print the
391 * string, and then restore the space character.
395 printf("%s%s%s\n", fi, first_tag, s);
399 * Since 'cp' may have been set to a space initially (and so no
400 * back-tracking was performed), it could have a space after it
401 * as well. We should gobble up all of these since we don't want
402 * unexpected leading blanks.
404 for (s = cp + 1; isspace(*s); s++)
407 /* now do all of the other lines */
409 if ((strlen(s) + strlen(tag) + indent) < width) {
410 printf("%s%s%s\n", i, tag, s);
416 cp = s + width - indent - strlen(tag);
417 while (!isspace(*cp) && (cp != s))
421 printf("%s%s%s\n", i, tag, s);
423 *cp = c; /* don't mess up 's' */
428 #define OUT_OF_QUOTE 1
430 char * strip_ignore_chars(cp)
433 int had_a_comma = FALSE;
434 int flag = OUT_OF_QUOTE;
435 register char *rcp, *cp1;
442 printf("strip_ignore_chars(%s)\n", cp);
444 for (rcp = cp; *rcp != '\0'; rcp++)
445 if (isignorechar(*rcp) || (*rcp == '"'))
450 cp1 = tmp = (char *) Malloc((unsigned) strlen(cp));
451 for (rcp = cp; *rcp != '\0'; rcp++) {
452 /* toss quotes and flip the flag */
454 flag = OUT_OF_QUOTE - flag;
455 else if (isignorechar(*rcp)) {
456 if (flag == OUT_OF_QUOTE)
461 else if (*rcp == ',') {
470 /* re-quote the name if it had a comma in it */
471 if (had_a_comma == TRUE) {
472 rcp = cp1 = (char *) Malloc((unsigned) (strlen(tmp) + 3));
483 char * code_to_str(i)
486 case LDAP_MOD_ADD : return("ADD");
487 case LDAP_MOD_DELETE : return("DELETE");
488 case LDAP_MOD_REPLACE : return("REPLACE");
489 default : return("?????");
493 char * friendly_name(s)
496 static FriendlyMap *map = NULL;
499 cp = ldap_friendly_name(FRIENDLYFILE, s, &map);
507 /* return TRUE if s has the syntax of a uniqname */
513 if ((i < 3) || (i > 8)) /* uniqnames are 3-8 chars */
515 if (!isalpha(*s)) /* uniqnames begin with a letter */
517 for ( ; *s != '\0'; s++) /* uniqnames are alphanumeric */
524 /* return TRUE if this attribute should be printed as a DN */
529 extern struct attribute attrlist[];
531 for (i = 0; attrlist[i].quipu_name != NULL; i++)
532 if (!strcasecmp(s, attrlist[i].quipu_name))
534 if (attrlist[i].flags & ATTR_FLAG_IS_A_DN)
539 char * my_ldap_dn2ufn(s)
543 static char short_DN[BUFSIZ];
545 if (strstr(s, UD_BASE) == NULL)
546 return(ldap_dn2ufn(s));
547 cpp = ldap_explode_dn(s, TRUE);
548 sprintf(short_DN, "%s, %s", *cpp, *(cpp + 1));
549 ldap_value_free(cpp);
553 /* return TRUE if this attribute should be printed as a URL */
558 extern struct attribute attrlist[];
560 for (i = 0; attrlist[i].quipu_name != NULL; i++)
561 if (!strcasecmp(s, attrlist[i].quipu_name))
563 if (attrlist[i].flags & ATTR_FLAG_IS_A_URL)
568 /* return TRUE if this attribute should be printed as a date and time */
573 extern struct attribute attrlist[];
575 for (i = 0; attrlist[i].quipu_name != NULL; i++)
576 if (!strcasecmp(s, attrlist[i].quipu_name))
578 if (attrlist[i].flags & ATTR_FLAG_IS_A_DATE)
588 void_ptr = (void *) malloc(size);
589 if (void_ptr == NULL) {
613 while (isspace(*s) && (*s != '\0'))
622 void free_mod_struct(modp)
627 if (modp->mod_values != NULL)
628 (void) ldap_value_free(modp->mod_values);
629 Free(modp->mod_type);
633 void StrFreeDup(ptr, new_value)
634 char **ptr, *new_value;
640 if (new_value == NULL)
643 *ptr = strdup(new_value);
647 confirm_action( msg )
650 char tmp[SMALL_BUF_SIZE];
655 format( msg, 75, 2 );
658 printf("\n Is this OK? ");
661 fetch_buffer(tmp, sizeof(tmp), stdin);
664 ( !strncasecmp(tmp, "YES", i) || !strncasecmp(tmp, "OK", i)));