diff options
Diffstat (limited to 'WWW/Library/Implementation/HTAAFile.c')
-rw-r--r-- | WWW/Library/Implementation/HTAAFile.c | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/WWW/Library/Implementation/HTAAFile.c b/WWW/Library/Implementation/HTAAFile.c new file mode 100644 index 00000000..15c2d547 --- /dev/null +++ b/WWW/Library/Implementation/HTAAFile.c @@ -0,0 +1,210 @@ + +/* MODULE HTAAFile.c +** FILE ROUTINES FOR AUTHENTICATION +** (PASSWD AND GROUP FILES) AND +** ACCESS CONTROL LIST (.www_acl) +** AUTHORS: +** AL Ari Luotonen luotonen@dxcern.cern.ch +** +** HISTORY: +** +** +** BUGS: +** +** +*/ + + +#ifndef HTUTILS_H +#include "HTUtils.h" +#endif /* HTUTILS_H */ + +#include "tcp.h" /* Macro FROMASCII() */ +/*#include <stdio.h> included by HTUtils.h -- FM *//* FILE */ +#include <string.h> +#include "HTAAUtil.h" /* Common utilities used in AA */ +#include "HTAAFile.h" /* Implemented here */ + +#include "LYLeaks.h" + +#define SPACE ' ' +#define TAB '\t' + + + +/* PUBLIC HTAAFile_nextRec() +** GO TO THE BEGINNING OF THE NEXT RECORD +** ON ENTRY: +** fp is the file from which records are read from. +** +** ON EXIT: +** returns nothing. File read pointer is located at the beginning +** of the next record. Handles continuation lines +** (lines ending in comma indicate a following +** continuation line). +** +*/ +PUBLIC void HTAAFile_nextRec ARGS1(FILE *, fp) +{ + int ch = getc(fp); + int last = (char)0; + + do { + while (ch != EOF && ch != CR && ch != LF) { + if (ch != ' ' && ch != '\t') + last = ch; /* Last non-whitespace */ + ch = getc(fp); /* Skip until end-of-line */ + } + while (ch != EOF && + (ch == CR || ch == LF))/*Skip carriage returns and linefeeds*/ + ch = getc(fp); + if (ch != EOF) + ungetc(ch, fp); + } while (last == ',' && ch != EOF); /* Skip also continuation lines */ +} + + +/* PRIVATE read_item() +** READ AN ITEM FROM A PASSWORD, GROUP +** OR ACCESS CONTROL LIST FILE +** i.e. either a field, or a list item. +** ON ENTRY: +** fp is the file to read the characters from +** contents is the character array to put the characters +** reading_list if TRUE, read a list item (ends either in +** acomma or acolon), +** if FALSE, read a field (ends in acolon). +** max_len is the maximum number of characters that may +** be read (i.e. the size of dest minus one for +** terminating null). +** ON EXIT: +** returns the terminating character +** (i.e. either separator or CR or LF or EOF). +** contents contains a null-terminated string representing +** the read field. +** NOTE 1: +** Ignores leading and trailing blanks and tabs. +** NOTE 2: +** If the item is more than max_len characters +** long, the rest of the characters in that item +** are ignored. However, contents is always +** null-terminated! +*/ +PRIVATE int read_item ARGS4(FILE *, fp, + char *, contents, + BOOL, reading_list, + int, max_len) +{ + char * dest = contents; + char * end = contents; + int cnt = 0; + int ch = getc(fp); + + while (SPACE == ch || TAB == ch) /* Skip spaces and tabs */ + ch = getc(fp); + + while (ch != FIELD_SEPARATOR && + (!reading_list || ch != LIST_SEPARATOR) && + ch != CR && ch != LF && ch != EOF && cnt < max_len) { + *(dest++) = ch; + cnt++; + if (ch != SPACE && ch != TAB) + end = dest; + ch = getc(fp); + } /* while not eol or eof or too many read */ + + if (cnt == max_len) { + /* If the field was too long (or exactly maximum) ignore the rest */ + while (ch != FIELD_SEPARATOR && + (!reading_list || ch != LIST_SEPARATOR) && + ch != CR && ch != LF && ch != EOF) + ch = getc(fp); + } + + if (ch == CR || ch == LF) + ungetc(ch, fp); /* Push back the record separator (NL or LF) */ + + /* Terminate the string, truncating trailing whitespace off. + ** Otherwise (if whitespace would be included), here would + ** be *dest='\0'; and cnt -= ... would be left out. + */ + *end = '\0'; + cnt -= dest-end; + + return ch; /* Return the terminating character */ +} + + + +/* PUBLIC HTAAFile_readField() +** READ A FIELD FROM A PASSWORD, GROUP +** OR ACCESS CONTROL LIST FILE +** i.e. an item terminated by colon, +** end-of-line, or end-of-file. +** ON ENTRY: +** fp is the file to read the characters from +** contents is the character array to put the characters +** max_len is the maximum number of characters that may +** be read (i.e. the size of dest minus one for +** terminating null). +** ON EXIT: +** returns the terminating character +** (i.e. either separator or CR or LF or EOF). +** contents contains a null-terminated string representing +** the read field. +** NOTE 1: +** Ignores leading and trailing blanks and tabs. +** NOTE 2: +** If the field is more than max_len characters +** long, the rest of the characters in that item +** are ignored. However, contents is always +** null-terminated! +*/ +PUBLIC int HTAAFile_readField ARGS3(FILE *, fp, + char *, contents, + int, max_len) +{ + return read_item(fp, contents, NO, max_len); +} + + + + +/* PUBLIC HTAAFile_readList() +** +** READ A LIST OF STRINGS SEPARATED BY COMMAS +** (FROM A GROUP OR ACCESS CONTROL LIST FILE) +** ON ENTRY: +** fp is a pointer to the input file. +** result is the list to which append the read items. +** max_len is the maximum number of characters in each +** list entry (extra characters are ignored). +** ON EXIT: +** returns the number of items read. +** +*/ +PUBLIC int HTAAFile_readList ARGS3(FILE *, fp, + HTList *, result, + int, max_len) +{ + char *item = NULL; + char terminator; + int cnt = 0; + + do { + if (!item && !(item = (char*)malloc(max_len+1))) + outofmem(__FILE__, "HTAAFile_readList"); + terminator = read_item(fp, item, YES, max_len); + if (strlen(item) > 0) { + cnt++; + HTList_addObject(result, (void*)item); + item = NULL; + } + } while (terminator != FIELD_SEPARATOR && + terminator != CR && terminator != LF && + terminator != EOF); + + FREE(item); /* This was not needed */ + return cnt; +} + |