From: Ryan Bloom Date: Thu, 27 Apr 2000 20:35:41 +0000 (+0000) Subject: Merge the htdigest.c file from the apr/test directory to the support X-Git-Tag: APACHE_2_0_ALPHA_3~19 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b39d73527e4c45f6e1d8949525e7bfc1f7dc0ba5;p=apache Merge the htdigest.c file from the apr/test directory to the support directory. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@85064 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/support/htdigest.c b/support/htdigest.c index 0b2c176da3..65200fcf1d 100644 --- a/support/htdigest.c +++ b/support/htdigest.c @@ -50,10 +50,6 @@ * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . - * - * Portions of this software are based upon public domain software - * originally written at the National Center for Supercomputing Applications, - * University of Illinois, Urbana-Champaign. */ /****************************************************************************** @@ -70,16 +66,23 @@ #include "apr_lib.h" #include "apr_md5.h" -#include "apr_portable.h" -#if defined(MPE) || defined(QNX) || defined(WIN32) || defined(__TANDEM) || defined(BEOS) -#include -#else + +#ifdef HAVE_SYS_TYPES_H + #include +#endif + +#ifdef HAVE_SYS_SIGNAL_H #include #endif +#ifdef HAVE_SIGNAL_H +#include +#endif + +#include + #ifdef WIN32 #include -#define unlink _unlink #endif #ifdef CHARSET_EBCDIC @@ -93,6 +96,7 @@ #define MAX_STRING_LEN 256 char *tn; +ap_pool_t *cntxt; static void getword(char *word, char *line, char stop) { @@ -109,61 +113,66 @@ static void getword(char *word, char *line, char stop) while ((line[y++] = line[x++])); } -static int getline(char *s, int n, FILE *f) +static int getline(char *s, int n, ap_file_t *f) { register int i = 0; + char ch; while (1) { - s[i] = (char) fgetc(f); + ap_getc(&ch, f); + s[i] = ch; if (s[i] == CR) - s[i] = fgetc(f); + ap_getc(&ch, f); + s[i] = ch; if ((s[i] == 0x4) || (s[i] == LF) || (i == (n - 1))) { s[i] = '\0'; - return (feof(f) ? 1 : 0); + if (ap_eof(f) == APR_EOF) { + return 1; + } + return 0; } ++i; } } -static void putline(FILE *f, char *l) +static void putline(ap_file_t *f, char *l) { int x; for (x = 0; l[x]; x++) - fputc(l[x], f); - fputc('\n', f); + ap_putc(l[x], f); + ap_putc('\n', f); } -static void add_password(char *user, char *realm, FILE *f) +static void add_password(char *user, char *realm, ap_file_t *f) { char *pw; ap_md5_ctx_t context; - unsigned char digest[MD5_DIGESTSIZE]; + unsigned char digest[16]; char string[MAX_STRING_LEN]; char pwin[MAX_STRING_LEN]; char pwv[MAX_STRING_LEN]; unsigned int i; - size_t bufsize; + size_t len = sizeof(pwin); - bufsize = sizeof(pwin); - if (ap_getpass("New password: ", pwin, &bufsize) != 0) { + if (ap_getpass("New password: ", pwin, &len) != APR_SUCCESS) { fprintf(stderr, "password too long"); exit(5); } - bufsize = sizeof(pwv); - ap_getpass("Re-type new password: ", pwv, &bufsize); + len = sizeof(pwin); + ap_getpass("Re-type new password: ", pwv, &len); if (strcmp(pwin, pwv) != 0) { fprintf(stderr, "They don't match, sorry.\n"); if (tn) { - unlink(tn); + ap_remove_file(tn, cntxt); } exit(1); } pw = pwin; - fprintf(f, "%s:%s:", user, realm); + ap_fprintf(f, "%s:%s:", user, realm); /* Do MD5 stuff */ sprintf(string, "%s:%s:%s", user, realm, pw); @@ -172,10 +181,10 @@ static void add_password(char *user, char *realm, FILE *f) ap_MD5Update(&context, (unsigned char *) string, strlen(string)); ap_MD5Final(digest, &context); - for (i = 0; i < MD5_DIGESTSIZE; i++) - fprintf(f, "%02x", digest[i]); + for (i = 0; i < 16; i++) + ap_fprintf(f, "%02x", digest[i]); - fprintf(f, "\n"); + ap_fprintf(f, "\n"); } static void usage(void) @@ -189,13 +198,13 @@ static void interrupted(void) { fprintf(stderr, "Interrupted.\n"); if (tn) - unlink(tn); + ap_remove_file(tn, cntxt); exit(1); } int main(int argc, char *argv[]) { - FILE *tfp, *f; + ap_file_t *tfp, *f; char user[MAX_STRING_LEN]; char realm[MAX_STRING_LEN]; char line[MAX_STRING_LEN]; @@ -204,33 +213,35 @@ int main(int argc, char *argv[]) char x[MAX_STRING_LEN]; char command[MAX_STRING_LEN]; int found; + + ap_create_pool(&cntxt, NULL); tn = NULL; - signal(SIGINT, (void (*)(int)) interrupted); + ap_signal(SIGINT, (void (*)(int)) interrupted); if (argc == 5) { if (strcmp(argv[1], "-c")) usage(); - if (!(tfp = fopen(argv[2], "w"))) { + if (ap_open(&tfp, argv[2], APR_WRITE | APR_CREATE, -1, cntxt) != APR_SUCCESS) { fprintf(stderr, "Could not open passwd file %s for writing.\n", argv[2]); - perror("fopen"); + perror("ap_open"); exit(1); } printf("Adding password for %s in realm %s.\n", argv[4], argv[3]); add_password(argv[4], argv[3], tfp); - fclose(tfp); + ap_close(tfp); exit(0); } else if (argc != 4) usage(); tn = tmpnam(NULL); - if (!(tfp = fopen(tn, "w"))) { + if (ap_open(&tfp, tn, APR_WRITE | APR_CREATE, -1, cntxt)!= APR_SUCCESS) { fprintf(stderr, "Could not open temp file.\n"); exit(1); } - if (!(f = fopen(argv[1], "r"))) { + if (ap_open(&f, argv[1], APR_READ, -1, cntxt) != APR_SUCCESS) { fprintf(stderr, "Could not open passwd file %s for reading.\n", argv[1]); fprintf(stderr, "Use -c option to create new one.\n"); @@ -262,14 +273,14 @@ int main(int argc, char *argv[]) printf("Adding user %s in realm %s\n", user, realm); add_password(user, realm, tfp); } - fclose(f); - fclose(tfp); + ap_close(f); + ap_close(tfp); #if defined(OS2) || defined(WIN32) sprintf(command, "copy \"%s\" \"%s\"", tn, argv[1]); #else sprintf(command, "cp %s %s", tn, argv[1]); #endif system(command); - unlink(tn); + ap_remove_file(tn, cntxt); return 0; }