|
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 u
Length: 11926 (0x2e96) Types: TextFile Names: »util.c«
└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen └─⟦123909933⟧ »./npasswd/npasswd.tar.Z« └─⟦22a202e7d⟧ └─⟦this⟧ »npass-new/npasswd_jpl/old.checkpasswd/util.c«
/* -------------------------------------------------------------------- */ /* */ /* Author: Clyde Hoover */ /* Computation Center */ /* The University of Texas at Austin */ /* Austin, Texas 78712 */ /* clyde@emx.utexas.edu */ /* uunet!cs.utexas.edu!ut-emx!clyde */ /* */ /*This code may be distributed freely, provided this notice is retained. */ /* */ /* -------------------------------------------------------------------- */ /* * util.c - Miscellanous utility routines */ #ifndef lint static char sccsid[] = "@(#)util.c 1.4 11/14/89 (cc.utexas.edu)"; #endif #include "checkpasswd.h" /* * _instring - Compare all sub-strings * * Returns: * 0 if match not found * rc if match found */ _instring(s1, s2, rc) char *s1, /* String to look for */ *s2; /* String to look for <s1> in */ int rc; /* What to return on match */ { int l; /* Temp */ for (l = strlen(s1); *s2; s2++) if (_cistrncmp(s1, s2, l) == 0) return (rc); return(0); } /* * _flipstring - reverse a string in place */ _flipstring(s) char *s; /* String to reverse */ { char *p, /* Scratch */ *t; /* Scratch */ char *malloc(); t = malloc(strlen(s) + 1); (void) strcpy(t, s); p = t; while (*p) p++; /* Find end of string */ --p; for (; *s; ) *s++ = *p--; free(t); } /* * Case indepedant string comparasion routines swiped from * the source to MIT Hesiod. * Since these routines are publicly available, * I presume to redistribute them is not in violation of copyright. */ /* * Copyright (c) 1986 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ /* * This array is designed for mapping upper and lower case letter * together for a case independent comparison. The mappings are * based upon ascii character sequences. */ static char charmap[] = { '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017', '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027', '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037', '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047', '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057', '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067', '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077', '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147', '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137', '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147', '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177', '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207', '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217', '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227', '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237', '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247', '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257', '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277', '\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347', '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', '\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337', '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347', '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377', }; /* * cistrcmp - case independant string compare */ _cistrcmp(s1, s2) register char *s1, *s2; { register char *cm = charmap; while (cm[*s1] == cm[*s2++]) if (*s1++=='\0') return(0); return(cm[*s1] - cm[*--s2]); } /* * cistrncmp - case independant string compare */ _cistrncmp(s1, s2, n) register char *s1, *s2; register n; { register char *cm = charmap; while (--n >= 0 && cm[*s1] == cm[*s2++]) if (*s1++ == '\0') return(0); return(n<0 ? 0 : cm[*s1] - cm[*--s2]); } /* end of UCB copyrighted code */ /* * _ctran - produce printable version of any ASCII character */ char * _ctran (c) char c; /* Character to represent */ { static char cbuf[8]; /* Return value buffer */ char *p = cbuf; /* Pointer to cbuf */ char chr = c & 0177; /* Scratch */ if (c & 0200) { /* Meta char - weird but what the hey */ *p++ = 'M'; *p++ = '-'; } if (chr >= ' ' && chr <= '~') { *p++ = chr; *p++ = 0; return (cbuf); } if (chr == 0177) return("DEL"); *p++ = '^'; *p++ = chr + '@'; *p++ = 0; return (cbuf); } /* * The following routines are used by the configuration file processor. */ /* * decode_boolean - decode a boolean value */ static decode_boolean(s) char *s; { return(*s == '1' | streq(s, "true") | streq(s, "yes") | streq(s, "on")); } /* * decode_int - decode an integer value */ static decode_int(s) char *s; /* String to decode */ { int t; /* Temp */ if (xatoi(s, (char *)0, &t)) return(t); fprintf(stderr, "Bad numeric value '%s'\n", s); return(-1); } /* * Is argument an octal digit? */ static int octdigit(c) char c; { return (c >= '0' && c <= '7'); } /* * Is argument a decimal digit? */ static int decdigit(c) char c; { return (c >= '0' && c <= '9'); } /* * Is argument a hexidecimal digit? */ static int hexdigit(c) char c; { return (decdigit(c) | (c >= 'a' && c <= 'f') | (c >= 'A' && c <= 'F')); } /* * xatoi - Smart 'atoi' recognizes decimal, octal and hex constants */ static xatoi(ip, ipp, iv) char *ip, /* Pointer to number string */ **ipp; /* Stash pointer to end of string */ /* RETURN VALUE */ int *iv; /* RETURN VALUE */ { int (*func)() = decdigit, /* Function to check char */ base = 10; /* Conversion base */ int t = 0, /* Return value */ mult = 1; /* Sign of result */ char *fcc = ip; /* First char position */ if (*ip == '-') { /* Negative number? */ ip++; mult = -1; } if (*ip == '0') { /* Leading '0'? */ ip++; if (*ip == 'x' || *ip == 'X') { /* Hex */ base = 16; func = hexdigit; ip++; /* Skip 'x' */ } else { base = 8; /* Octal */ func = octdigit; } } while (*ip && (*func)(*ip)) { t *= base; if (decdigit(*ip)) t += (*ip - '0'); else t += (*ip >= 'a' ? *ip - 0x57 : *ip - 0x37); ip++; } if (ip == fcc) /* Nothing processed */ return(0); if (ipp) /* Stash new pointer location */ *ipp = ip; *iv = (t * mult); return(1); } /* * decode_string - Copy string, converting backslash escapes * Can handle most of the C backslash escape sequences */ static decode_string(dst, src, len) char *dst, /* Destination */ *src; /* Source */ int len; { int t; /* Temp */ char *dstx = dst; /* Pointer to start of destination */ char quote = 0; /* Quote character */ if (*src == '"' || *src == '\'') quote = *src++; #define putxchar(P) *dst++ = (P) for (; *src && (dst - dstx) < len; ) { if (*src == '\\') { src++; switch(*src) { case 'a': putxchar('\007'); src++; break; case 'b': putxchar('\b'); src++; break; case 'f': putxchar('\f'); src++; break; case 'n': putxchar('\n'); src++; break; case 'r': putxchar('\r'); src++; break; case 't': putxchar('\t'); src++; break; case '\\': putxchar('\\'); src++; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case 'x': if (xatoi(src, &src, &t)) putxchar(t & 0xff); break; default: if (quote && *src == quote) *dst++ = *src++; break; } continue; } else if (*src == '^') { /* ^C = control-c */ src++; if (isupper(*src)) putxchar(*src - '@'); else if (islower(*src)) putxchar(*src - '`'); else switch (*src) { case '[': putxchar('\033'); break; case '\\': putxchar('\034'); break; case ']': putxchar('\035'); break; case '^': putxchar('\036'); break; case '-': putxchar('\037'); break; } src++; continue; } else if (quote && *src == quote) break; *dst++ = *src++; } #undef putxchar *dst = 0; } static char *default_dicts[] = { /* List of default dictionaries */ #ifdef DEFAULT_DICT DEFAULT_DICT, #endif 0 }; /* * readconfig - Read the configuration file * Returns 1 if success, 0 if not found and -1 if error */ readconfig(filename) char *filename; { char buf[BUFSIZ]; /* Read buffer */ FILE *fp; /* File pointer */ char **p; /* Scratch */ int lineno = 0; /* Current line number in config file */ extern int standalone; /* Am I a standalone application? */ /* "Load" default directories */ for (p = default_dicts; *p; p++) add_dict(*p); if ((fp = fopen(filename, "r")) == NULL) { #ifdef DEBUG printf("No config file\n"); #endif return(0); } while (fgets(buf, sizeof(buf), fp) != NULL) { char *key, /* Key on line */ *data; /* Data on line */ lineno++; if (buf[0] == '\n') /* Empty line */ continue; if (key = index(buf, '\n')) *key = 0; for (data = buf; *data && *data <= ' '; data++); if (*data == '#') continue; key = data; for (; *data && *data > ' '; data++); /* Skip to end */ if (*data) *data++ = 0; else { if (standalone) printf("\"%s\", line %d: Incomplete line.\n", filename, lineno); continue; } for (; *data && *data <= ' '; data++); /* Skip whitespace */ if (streq(key, "dictionary")) add_dict(data); else if (streq(key, "singlecase")) single_case = decode_boolean(data); else if (streq(key, "minlength")) min_length = decode_int(data); else if (streq(key, "maxlength")) max_length = decode_int(data); else if (streq(key, "printonly")) print_only = decode_boolean(data); else if (streq(key, "badchars")) { char xcc[BUFSIZ]; char append = 0; if (*data == '+') /* Add data to existing list */ append = *data++; decode_string(xcc, data, BUFSIZ); if (xcc[0] == 0) continue; if (append) (void) strcat(illegalcc, xcc); else (void) strncpy(illegalcc, xcc, sizeof_illegalcc); } else { if (standalone) printf("\"%s\", line %d: Unrecognized keyword '%s'.\n", filename, lineno, key); } } (void) fclose(fp); return(1); } /* * add_dict - Add a dictionary to the search list * * Arguments: * The rest of the line from the configuration file * which contains the path to the dictionary and optionally * a descriptive phrase */ static add_dict(line) char *line; /* RHS of config line */ { dictionary *dx, /* Tail of directory list */ *dn; /* New entry */ char *tx, /* Scratch */ *p; /* Scratch */ char *calloc(); #ifdef DEBUG printf("Add dictionary '%s'\n", line); #endif dn = (dictionary *)calloc(sizeof(dictionary), 1); if (dictionaries == 0) dictionaries = dn; for (dx = dictionaries; dx->dict_next ; dx = dx->dict_next); tx = malloc(strlen(line) + 1); (void) strcpy(tx, line); p = tx; while (*p && *p > ' ') p++; if (*p) *p++ = 0; dn->dict_path = tx; dn->dict_desc = p; dx->dict_next = dn; dn->dict_next = 0; } /* End util.c */