diff options
Diffstat (limited to 'lib/libadmin/util.c')
-rw-r--r-- | lib/libadmin/util.c | 1108 |
1 files changed, 2 insertions, 1106 deletions
diff --git a/lib/libadmin/util.c b/lib/libadmin/util.c index b560055d..4af302f0 100644 --- a/lib/libadmin/util.c +++ b/lib/libadmin/util.c @@ -13,12 +13,12 @@ #include "base/util.h" #include "private/pprio.h" +#include <base/file.h> #ifdef XP_UNIX #include <dirent.h> #include <sys/types.h> #include <fcntl.h> #else -#include <base/file.h> #include <sys/stat.h> #endif /* WIN32? */ @@ -26,675 +26,6 @@ #include <stdlib.h> #include <string.h> #include <sys/stat.h> -#include <ctype.h> /* isdigit */ - -#define NUM_ENTRIES 64 - -#ifdef MCC_PROXY -char * -XP_GetString() -{ - return "ZAP"; -} -#endif - -#ifdef XP_WIN32 -char *GetQueryNT(void) -{ - char *qs = getenv("QUERY_STRING"); - if(qs && (*qs == '\0')) - qs = NULL; - return qs; -} -#endif /* XP_WIN32 */ - -void escape_for_shell(char *cmd) { - register int x,y,l; - - l=strlen(cmd); - for(x=0;cmd[x];x++) { - if(strchr(" &;`'\"|*!?~<>^()[]{}$\\\x0A",cmd[x])){ - for(y=l+1;y>x;y--) - cmd[y] = cmd[y-1]; - l++; /* length has been increased */ - cmd[x] = '\\'; - x++; /* skip the character */ - } - } -} - -int _admin_dumbsort(const void *s1, const void *s2) -{ - return strcmp(*((char **)s1), *((char **)s2)); -} - -#ifdef XP_UNIX /* WIN32 change */ -/* Lists all files in a directory. */ -char **list_directory(char *path, int dashA) -{ - char **ar; - DIR *ds; - struct dirent *d; - int n, p; - - n = NUM_ENTRIES; - p = 0; - - ar = (char **) MALLOC(n * sizeof(char *)); - - if(!(ds = opendir(path))) { - return NULL; - } - - while( (d = readdir(ds)) ) { - if ( ( d->d_name[0] != '.' ) || - ( dashA && d->d_name[1] && - ( d->d_name[1] != '.' || d->d_name[2] ) ) ) { - if(p == (n-1)) { - n += NUM_ENTRIES; - ar = (char **) REALLOC(ar, n*sizeof(char *)); - } - /* 2: Leave space to add a trailing slash later */ - ar[p] = (char *) MALLOC(strlen(d->d_name) + 2); - strcpy(ar[p++], d->d_name); - } - } - closedir(ds); - - qsort((void *)ar, p, sizeof(char *), _admin_dumbsort); - ar[p] = NULL; - - return ar; -} - -#else /* WIN32 change */ -/* Lists all files in a directory. */ -char **list_directory(char *path, int dashA) -{ - char **ar; - SYS_DIR ds; - SYS_DIRENT *d; - int n, p; - - n = NUM_ENTRIES; - p = 0; - - ar = (char **) MALLOC(n * sizeof(char *)); - - if(!(ds = dir_open(path))) { - return NULL; - } - - while( (d = dir_read(ds)) ) { - if ( ( d->d_name[0] != '.' ) || - ( dashA && d->d_name[1] && - ( d->d_name[1] != '.' || d->d_name[2] ) ) ) { - if(p == (n-1)) { - n += NUM_ENTRIES; - ar = (char **) REALLOC(ar, n*sizeof(char *)); - } - /* 2: Leave space to add a trailing slash later */ - ar[p] = (char *) MALLOC(strlen(d->d_name) + 2); - strcpy(ar[p++], d->d_name); - } - } - dir_close(ds); - - qsort((void *)ar, p, sizeof(char *), _admin_dumbsort); - ar[p] = NULL; - - return ar; -} -#endif /* WIN32 */ - -int file_exists(char *fn) -{ - struct stat finfo; - - if(!stat(fn, &finfo)) - return 1; - else - return 0; -} - -int get_file_size(char *fn) -{ - struct stat finfo; - int ans = -1; - - if(!stat(fn, &finfo)) { - ans = finfo.st_size; - } else { - report_error(FILE_ERROR, fn, "Could not get size of file."); - } - return ans; -} - -int ADM_mkdir_p(char *dir, int mode) -{ - char path[PATH_MAX]; - struct stat fi; - char *slash = NULL; - - if (dir) - strcpy (path, dir); - else - return 0; - - if (slash = strchr(path, FILE_PATHSEP)) - slash++; /* go past root */ - else - return 0; - - while (slash && *slash) { - slash = strchr(slash, FILE_PATHSEP); - if (slash) *slash = '\0'; /* check path till here */ - - if (stat(path, &fi) == -1) { -#ifdef XP_UNIX - if (mkdir(path, mode) == -1) -#else /* XP_WIN32 */ - if (!CreateDirectory(path, NULL)) -#endif - return 0; - } - - if (slash) { - *slash = FILE_PATHSEP; /* restore path */ - slash++; /* check remaining path */ - } - } - return 1; -} - -int ADM_copy_directory(char *src_dir, char *dest_dir) -{ - SYS_DIR ds; - SYS_DIRENT *d; - struct stat fi; - char src_file[PATH_MAX], dest_file[PATH_MAX], fullname[PATH_MAX]; - - if (!(ds = dir_open(src_dir))) - report_error(FILE_ERROR, "Can't read directory", src_dir); - - while (d = dir_read(ds)) { - if (d->d_name[0] != '.') { - sprintf(fullname, "%s/%s", src_dir, d->d_name); - if (system_stat(fullname, &fi) == -1) - continue; - - sprintf(src_file, "%s%c%s", src_dir, FILE_PATHSEP, d->d_name); - sprintf(dest_file, "%s%c%s", dest_dir, FILE_PATHSEP, d->d_name); - if (S_ISDIR(fi.st_mode)) { - char *sub_src_dir = STRDUP(src_file); - char *sub_dest_dir = STRDUP(dest_file); - if (!ADM_mkdir_p(sub_dest_dir, 0755)) { - report_error(FILE_ERROR, "Cannot create directory", - sub_dest_dir); - return 0; - } - if (!ADM_copy_directory(sub_src_dir, sub_dest_dir)) - return 0; - FREE(sub_src_dir); - FREE(sub_dest_dir); - } - else - cp_file(src_file, dest_file, 0644); - } - } - dir_close(ds); - return(1); -} - -void ADM_remove_directory(char *path) -{ - struct stat finfo; - char **dirlisting; - register int x=0; - int stat_good = 0; - char *fullpath = NULL; - -#ifdef XP_UNIX - stat_good = (lstat(path, &finfo) == -1 ? 0 : 1); -#else /* XP_WIN32 */ - stat_good = (stat(path, &finfo) == -1 ? 0 : 1); -#endif - - if(!stat_good) return; - - if(S_ISDIR(finfo.st_mode)) { - dirlisting = list_directory(path,1); - if(!dirlisting) return; - - for(x=0; dirlisting[x]; x++) { - fullpath = (char *) MALLOC(strlen(path) + - strlen(dirlisting[x]) + 4); - sprintf(fullpath, "%s%c%s", path, FILE_PATHSEP, dirlisting[x]); -#ifdef XP_UNIX - stat_good = (lstat(fullpath, &finfo) == -1 ? 0 : 1); -#else /* XP_WIN32 */ - stat_good = (stat(fullpath, &finfo) == -1 ? 0 : 1); -#endif - if(!stat_good) continue; - if(S_ISDIR(finfo.st_mode)) { - ADM_remove_directory(fullpath); - } else { - unlink(fullpath); - } - FREE(fullpath); - } -#ifdef XP_UNIX - rmdir(path); -#else /* XP_WIN32 */ - RemoveDirectory(path); -#endif - } else { - delete_file(path); - } - return; -} - -/* return: mtime(f1) < mtime(f2) ? */ -int mtime_is_earlier(char *file1, char *file2) -{ - struct stat fi1, fi2; - - if(stat(file1, &fi1)) { - return -1; - } - if(stat(file2, &fi2)) { - return -1; - } - return( (fi1.st_mtime < fi2.st_mtime) ? 1 : 0); -} - -time_t get_mtime(char *fn) -{ - struct stat fi; - - if(stat(fn, &fi)) - return 0; - return fi.st_mtime; -} - -int all_numbers(char *target) -{ - register int x=0; - - while(target[x]) - if(!isdigit(target[x++])) - return 0; - return 1; -} - - -int all_numbers_float(char *target) -{ - register int x; - int seenpt; - - for(x = 0, seenpt = 0; target[x]; ++x) { - if((target[x] == '.') && (!seenpt)) - seenpt = 1; - else if((!isdigit(target[x])) && seenpt) - return 0; - } - return 1; -} - -/* Get the admin/config directory. */ -char *get_admcf_dir(int whichone) -{ -#ifdef USE_ADMSERV - char *confdir = NULL; - - char *tmp = get_num_mag_var(whichone, "#ServerRoot"); - if(!tmp) { - /* sigh */ - report_error(INCORRECT_USAGE, "No server root variable", - "The magnus.conf variable #ServerRoot was " - "not set. Please set the value of your server " - "root through the administrative forms."); - } - confdir = (char *) MALLOC(strlen(tmp) + strlen("config") + 4); - sprintf(confdir, "%s%cconfig%c", tmp, FILE_PATHSEP, FILE_PATHSEP); - - return confdir; -#else - char *confdir; - char line[BIG_LINE]; - sprintf(line, "%s%cadmin%cconfig%c", get_mag_var("#ServerRoot"), - FILE_PATHSEP, FILE_PATHSEP, FILE_PATHSEP); - confdir = STRDUP(line); -#endif - return STRDUP(confdir); -} - -/* Get the current HTTP server URL. */ -char *get_serv_url(void) -{ -#ifdef USE_ADMSERV - char *name = get_mag_var("ServerName"); - char *port = get_mag_var("Port"); - char *protocol = NULL; - char line[BIG_LINE]; - -#ifndef NS_UNSECURE - char *security = get_mag_var("Security"); - - if(!security || strcasecmp(security, "on")) { - protocol = STRDUP("http"); - if(!strcmp(port, "80")) - port = STRDUP(""); - else { - sprintf(line, ":%s", port); - port = STRDUP(line); - } - } else { - protocol = STRDUP("https"); - if(!strcmp(port, "443")) - port = STRDUP(""); - else { - sprintf(line, ":%s", port); - port = STRDUP(line); - } - } -#else - protocol = STRDUP("http"); - if(!strcmp(port, "80")) - port = STRDUP(""); - else { - sprintf(line, ":%s", port); - port = STRDUP(line); - } -#endif - - sprintf(line, "%s://%s%s", protocol, name, port); - return(STRDUP(line)); -#else - return(getenv("SERVER_URL")); -#endif -} - -/* ------------------------------- run_cmd -------------------------------- */ - - -/* Previously in install. This is also pretty UNIX-ish. */ - -/* Nirmal: Added code for Win32 implementation of this function. */ - -#include <signal.h> -#ifdef XP_UNIX -#include <sys/wait.h> -#endif /* XP_UNIX */ - - -int run_cmd(char *cmd, FILE *closeme, struct runcmd_s *rm) -{ -#ifdef WIN32 - HANDLE hproc; - PROCESS_INFORMATION child; - STARTUPINFO siStartInfo ; -#else - struct stat fi; - int exstat; - char *errmsg, tfn[128]; - FILE *f; - int fd; - pid_t pid; -#endif - - -#ifdef WIN32 - /* Nirmal: - For now, i will just spawn - a child in WINNT to execute the command. Communication to - the parent is done through stdout pipe, that was setup by - the parent. - - */ - hproc = OpenProcess(STANDARD_RIGHTS_REQUIRED, FALSE, GetCurrentProcessId()); - if (hproc == NULL) { - fprintf(stdout, "Content-type: text/html\n\n"); - fflush(stdout); - report_error(SYSTEM_ERROR, NULL, "Could not open handle to myself"); - return -1; // stmt. not reached. - } - - ZeroMemory(&child, sizeof(PROCESS_INFORMATION)); - ZeroMemory(&siStartInfo, sizeof(STARTUPINFO)); - siStartInfo.cb = sizeof(STARTUPINFO); - siStartInfo.lpReserved = siStartInfo.lpReserved2 = NULL; - siStartInfo.cbReserved2 = 0; - siStartInfo.lpDesktop = NULL; - siStartInfo.dwFlags = STARTF_USESHOWWINDOW; -// Several fields arent used when dwFlags is not set. -// siStartInfo.hStdInput = hChildStdinRd; -// siStartInfo.hStdOutput = siStartInfo.hStdError = hChildStdoutWr; - siStartInfo.wShowWindow = SW_HIDE; - - if ( ! CreateProcess( - NULL, // pointer to name of executable module - cmd, // pointer to command line string - NULL, // pointer to process security attribute - NULL, // pointer to thread security attributes - TRUE, // handle inheritance flag - 0, // creation flags - NULL, // pointer to new environment block - NULL, // pointer to current directory name - &siStartInfo, // pointer to STARTUPINFO - &child // pointer to PROCESS_INFORMATION - )) - { - rm->title = "CreateProcess failed"; - rm->msg = "run_cmd: Can't create new process. "; - rm->arg = ""; - rm->sysmsg = 1; - return -1; - } - else - return 0; -#else - sprintf(cmd, "%s > /tmp/startmsg.%d 2>&1 < /dev/null", cmd, getpid()); /* */ - /* FUCK UNIX SIGNALS. */ - signal(SIGCHLD, SIG_DFL); - switch( (pid = fork()) ) { - case 0: - /* Hmm. Work around an apparent bug in stdio. */ - if(closeme) - close(fileno(closeme)); - execl("/bin/sh", "/bin/sh", "-c", cmd, (char *)NULL); - /* DOH! */ - sprintf(tfn, "/tmp/startmsg.%d", getpid()); - if(!(f = fopen(tfn, "w"))) - exit(1); - fprintf(f, "Exec of %s failed. The error was %s.\n", cmd, - system_errmsg()); - fclose(f); - exit(1); - case -1: - rm->title = "Fork failed"; - rm->msg = "Can't create new process. %s"; - rm->arg = ""; - rm->sysmsg = 1; - return -1; - default: - sprintf(tfn, "/tmp/startmsg.%d", getpid()); - - if(waitpid(pid, &exstat, 0) == -1) { - rm->title = "Can't wait for child"; - rm->msg = "Can't wait for process. %s"; - rm->arg = ""; - rm->sysmsg = 1; - return -1; - } - if(exstat) { - if(!(fd = open(tfn, O_RDONLY))) { - rm->title = "Can't open error file"; - rm->msg = "Can't find error file %s."; - rm->arg = cmd; - rm->sysmsg = 1; - return -1; - } - fstat(fd, &fi); - if((fi.st_size > 0) && (fi.st_size < 8192)) { - errmsg = (char *) MALLOC(fi.st_size + 1); - read(fd, errmsg, fi.st_size); - errmsg[fi.st_size] = '\0'; - close(fd); - unlink(tfn); - rm->title = "Command execution failed"; - rm->msg = "The command did not execute. " - "Here is the output:<p>\n<pre>\n%s\n</pre>\n"; - rm->arg = errmsg; - rm->sysmsg = 0; - return -1; - } - else { - close(fd); - unlink(tfn); - - rm->title = "Command execution failed"; - rm->msg = "The command didn't execute, and it did not produce " - "any output. Run <code>%s</code> from the command " - "line and examine the output.\n"; - rm->arg = cmd; - rm->sysmsg = 0; - return -1; - } - } - unlink(tfn); - return 0; - } -#endif /* WIN32 */ - -} - - - -/* This is basically copy_file from the install section, with the error - * reporting changed to match the admin stuff. Since some stuff depends - * on copy_file being the install version, I'll cheat and call this one - * cp_file. */ -#ifdef XP_UNIX - -#define COPY_BUFFER_SIZE 4096 - -void cp_file(char *sfile, char *dfile, int mode) -{ - int sfd, dfd, len; - struct stat fi; - - char copy_buffer[COPY_BUFFER_SIZE]; - unsigned long read_len; - -/* Make sure we're in the right umask */ - umask(022); - - if( (sfd = open(sfile, O_RDONLY)) == -1) - report_error(FILE_ERROR, sfile, "Can't open file for reading."); - - fstat(sfd, &fi); - if(!(S_ISREG(fi.st_mode))) { - close(sfd); - return; - } - len = fi.st_size; - - if( (dfd = open(dfile, O_RDWR | O_CREAT | O_TRUNC, mode)) == -1) - report_error(FILE_ERROR, dfile, "Can't write to file."); - - while(len) { - read_len = len>COPY_BUFFER_SIZE?COPY_BUFFER_SIZE:len; - - if ( (read_len = read(sfd, copy_buffer, read_len)) == -1) { - report_error(FILE_ERROR, sfile, "Error reading file for copy."); - } - - if ( write(dfd, copy_buffer, read_len) != read_len) { - report_error(FILE_ERROR, dfile, "Error writing file for copy."); - } - - len -= read_len; - } - close(sfd); - close(dfd); -} - -#else /* XP_WIN32 */ -void cp_file(char *sfile, char *dfile, int mode) -{ - HANDLE sfd, dfd, MapHandle; - PCHAR fp; - DWORD BytesWritten = 0; - DWORD len; - - if( (sfd = CreateFile(sfile, GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) - == INVALID_HANDLE_VALUE) { - report_error(FILE_ERROR, "Cannot open file for reading", sfile); - } - len = GetFileSize(sfd, NULL); - if( (dfd = CreateFile(dfile, GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { - report_error(FILE_ERROR, "Cannot open destination file for writing", - dfile); - } - if (len == 0) - return; - if( (MapHandle = CreateFileMapping(sfd, NULL, PAGE_READONLY, - 0, 0, NULL)) == NULL) { - report_error(FILE_ERROR, "Cannot create file mapping", sfile); - } - if (!(fp = MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0))) { - report_error(FILE_ERROR, "Cannot map file %s", sfile); - } - while ( len) { - if(!WriteFile(dfd, fp, len, &BytesWritten, NULL)) { - report_error(FILE_ERROR, "Cannot write new file", dfile); - } - len -= BytesWritten; - fp += BytesWritten; - } - - CloseHandle(sfd); - UnmapViewOfFile(fp); - CloseHandle(MapHandle); - FlushFileBuffers(dfd); - CloseHandle(dfd); -} -#endif - -int delete_file(char *path) -{ -#ifdef XP_UNIX - return unlink(path); -#else - return !(DeleteFile(path)); -#endif -} - -void create_dir(char *dir, int mode) -{ - if ((dir == (char *) NULL) || (strlen(dir) == 0)) { - report_error(FILE_ERROR, "No directory is specified", - "Could not create a necessary directory."); - } - - if(!file_exists(dir)) { -#ifdef XP_UNIX - if(mkdir(dir, mode) == -1) { -#else /* XP_WIN32 */ - if(!CreateDirectory(dir, NULL)) { - if (GetLastError() != ERROR_ALREADY_EXISTS) -#endif /* XP_WIN32 */ - report_error(FILE_ERROR, dir, - "Could not create a necessary directory."); - } - } -} #ifdef XP_UNIX SYS_FILE lf; @@ -718,7 +49,7 @@ FILE *fopen_l(char *path, char *mode) { FILE *f = fopen(path, mode); char *lockpath; - char *sn=get_srvname(0); + char *sn="admserv"; char *flp=FILE_LOCK_PATH; if(f == NULL) return NULL; @@ -760,67 +91,6 @@ void fclose_l(FILE *f) } #endif /* XP_UNIX */ } - -/* Ripped off from the client. (Sorry, Lou.) */ -/* */ -/* The magic set of 64 chars in the uuencoded data */ -unsigned char uuset[] = { -'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T', -'U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n', -'o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7', -'8','9','+','/' }; - -int do_uuencode(unsigned char *src, unsigned char *dst, int srclen) -{ - int i, r; - unsigned char *p; - -/* To uuencode, we snip 8 bits from 3 bytes and store them as -6 bits in 4 bytes. 6*4 == 8*3 (get it?) and 6 bits per byte -yields nice clean bytes - -It goes like this: - AAAAAAAA BBBBBBBB CCCCCCCC -turns into the standard set of uuencode ascii chars indexed by numbers: - 00AAAAAA 00AABBBB 00BBBBCC 00CCCCCC - -Snip-n-shift, snip-n-shift, etc.... - -*/ - - for (p=dst,i=0; i < srclen; i += 3) { - /* Do 3 bytes of src */ - register char b0, b1, b2; - - b0 = src[0]; - if (i==srclen-1) - b1 = b2 = '\0'; - else if (i==srclen-2) { - b1 = src[1]; - b2 = '\0'; - } - else { - b1 = src[1]; - b2 = src[2]; - } - - *p++ = uuset[b0>>2]; - *p++ = uuset[(((b0 & 0x03) << 4) | ((b1 & 0xf0) >> 4))]; - *p++ = uuset[(((b1 & 0x0f) << 2) | ((b2 & 0xc0) >> 6))]; - *p++ = uuset[b2 & 0x3f]; - src += 3; - } - *p = 0; /* terminate the string */ - r = (unsigned char *)p - (unsigned char *)dst;/* remember how many we did */ - - /* Always do 4-for-3, but if not round threesome, have to go - clean up the last extra bytes */ - - for( ; i != srclen; i--) - *--p = '='; - - return r; -} char *alert_word_wrap(char *str, int width, char *linefeed) { @@ -881,216 +151,6 @@ char *alert_word_wrap(char *str, int width, char *linefeed) return ans; } -void remove_directory(char *path) -{ - struct stat finfo; - char **dirlisting; - register int x=0; - int stat_good = 0; - char *fullpath = NULL; - -#ifdef XP_UNIX - stat_good = (lstat(path, &finfo) == -1 ? 0 : 1); -#else /* WIN32 */ - stat_good = (stat(path, &finfo) == -1 ? 0 : 1); -#endif /* XP_UNIX */ - - if(!stat_good) return; - - if(S_ISDIR(finfo.st_mode)) { - dirlisting = list_directory(path,1); - if(!dirlisting) return; - - for(x=0; dirlisting[x]; x++) { - fullpath = (char *) MALLOC(strlen(path) + - strlen(dirlisting[x]) + 4); - sprintf(fullpath, "%s%c%s", path, FILE_PATHSEP, dirlisting[x]); -#ifdef XP_UNIX - stat_good = (lstat(fullpath, &finfo) == -1 ? 0 : 1); -#else /* WIN32 */ - stat_good = (stat(fullpath, &finfo) == -1 ? 0 : 1); -#endif /* XP_UNIX */ - if(!stat_good) continue; - if(S_ISDIR(finfo.st_mode)) { - remove_directory(fullpath); - } else { - fprintf(stdout, "<i>Removing file</i> " - "<code>%s</code><br>\n", fullpath); - unlink(fullpath); - } - FREE(fullpath); - } - fprintf(stdout, "<i>Removing directory</i> " - "<code>%s</code><br>\n", path); -#ifdef XP_UNIX - rmdir(path); -#else /* XP_WIN32 */ - RemoveDirectory(path); -#endif /* XP_WIN32 */ - } else { - fprintf(stdout, "<i>Removing file</i> <code>%s</code><br>\n", path); - unlink(path); - } - return; -} - -int str_flag_to_int(char *str_flag) -{ - if (!str_flag) - return -1; - if (!strcmp(str_flag, "1")) - return 1; - return 0; -} - -/* - * get_ip_and_mask - function to take something that may be an IP Address - * and netmaks, and validate it. It takes two possible - * - * Parmaters: char *candidate - * - * Returns NULL if it isn't a valid IP address and mask. It returns - * the IP address and mask in the form "iii.iii.iii.iii mmm.mmm.mmm.mmm" - * if it is valid. This is in a string dynamicly allocated in this - * function. - * - * Processing: the candidate is assumed to be in one of - * these two formats: - * - * 1. "iii.iii.iii.iii" (returns: "iii.iii.iii.iii 255.255.255.255") - * 2. "iii.iii.iii.iii mmm.mmm.mmm.mmm" - * 3. "iii.*", "iii.iii.*", or "iii.iii.iii.*" - * - * The rules are: - * I. If it has a space in it, it is assumed to be the delimiter in - * format 2. - * II. If it has a "*" in it, it's assumed to be format 3. - * III. If it's in format 3, the net mask returned is: - * 255.0.0.0, 255.255.0.0, or 255.255.255.0 respectivly, - * and parts of the address right of the * is replaced with 0s. - * IV. We use inet_addr on the pieces to validate them. - * - * - */ - -char *get_ip_and_mask(char *candidate) -{ - char work[BIG_LINE]; - - char *p; - char *result = NULL; - int len; - int dots = 0; - int i; - - if (candidate && strlen(candidate) < (unsigned) BIG_LINE) { - - if ((p = strchr(candidate, ' '))) { - len = p-candidate+1; - memcpy(work, candidate, len); - work[len] = '\0'; - if (inet_addr(work) != -1) { - len = strlen(candidate)-strlen(p)-1; - if (len > 0) { - memcpy(work, p+1, len); - work[len] = '\0'; - if (inet_addr(work) != -1) { - result = strdup(candidate); - } - } - } - } - else if ((p = strchr(candidate, '*')) && - (p-candidate > 1 ) && - (*(p-1) == '.') ) { - memset(work, 0, BIG_LINE); - for (i=0; candidate[i]!='*'; ++i) { - if (candidate[i+1] != '*') - work[i] = candidate[i]; - if (candidate[i] == '.') - ++dots; - } - if (dots == 1 || dots == 2 || dots == 3) { - for (i=0; i<4-dots; ++i) { - strcat(work, ".0"); - } - if (inet_addr(work) != -1) { - strcat(work, " "); - p = &work[strlen(work)]; - for (i=0; i<dots; ++i) { - if (i==0) - strcat(work, "255"); - else - strcat(work, ".255"); - } - for (i=0; i<4-dots; ++i) { - strcat(work, ".0"); - } - if (inet_addr(p) != -1) { - result = strdup(work); - } - } - } - } - else { - if (inet_addr(candidate) != -1) { - strcpy(work, candidate); - strcat(work, " 255.255.255.255"); - result = strdup(work); - } - } - } - else - result = NULL; - - return result; -} - -/* do fgets with a filebuffer *, instead of a File *. Can't use util_getline - because it complains if the line is too long. - It does throw away <CR>s, though. - */ -NSAPI_PUBLIC char *system_gets( char *line, int size, filebuffer *fb ) -{ - int c; - int i = 0; - - while ( --size ) { - switch ( c = filebuf_getc( fb ) ) { - case IO_EOF: - line[i] = '\0'; - return i ? line : NULL; - case LF: - line[i] = c; - line[i+1] = '\0'; - return line; /* got a line, and it fit! */ - case IO_ERROR: - return NULL; - case CR: - ++size; - break; - default: - line[i++] = c; - break; - } - } - /* if we got here, then we overran the buffer size */ - line[i] = '\0'; - return line; -} - -#ifndef WIN32 - -/* make a zero length file, no matter how long it was before */ -NSAPI_PUBLIC int -system_zero( SYS_FILE f ) -{ - ftruncate( PR_FileDesc2NativeHandle( f ), 0 ); - return 0; -} - -#endif - /*********************************************************************** ** FUNCTION: cookieValue ** DESCRIPTION: @@ -1163,88 +223,6 @@ cookieValue( char *var, char *val ) return NULL; } -/*********************************************************************** -** FUNCTION: jsEscape -** DESCRIPTION: -** Escape the usual suspects, so the parser javascript parser won't eat them -** INPUTS: src - the string -** OUTPUTS: NONE -** RETURN: A malloced string, containing the escaped src -** SIDE EFFECTS: -** None, except for more memory being eaten -** RESTRICTIONS: -** None -** MEMORY: One Malloc, you should free this if you care -***********************************************************************/ - -NSAPI_PUBLIC char * -jsEscape( char *src ) -{ - int needsEscaping = 0; - int i; - char *dest; - - for ( i = 0 ; src[i] ; ++i ) { - if ( src[i] == '\\' || src[i] == '\'' || src[i] == '"' ) { - ++needsEscaping; - } - } - dest = (char *)MALLOC( i + needsEscaping + 1 ); - for ( i = 0 ; *src ; ++src ) { - if ( ( *src == '\\' ) || ( *src == '\'' ) || ( *src == '"' ) ) { - dest[i++] = '\\'; /* escape */ - } - dest[i++] = *src; - } - dest[i] = '\0'; - return dest; -} - -/*********************************************************************** -** FUNCTION: jsPWDialogSrc -** DESCRIPTION: -** Put the source to the passwordDialog JavaScript function out. -** INPUTS: inScript - if true, don't put <SCRIPT> stuff out -** otherJS - if nonNULL, other javascript to execute -** OUTPUTS: None -** RETURN: None -** SIDE EFFECTS: -** clogs up stdout -** RESTRICTIONS: -** Don't use this outside of a CGI, or before the Content-type: -** MEMORY: No memory change -** ALGORITHM: -** @+@What's really going on? -***********************************************************************/ - -NSAPI_PUBLIC void -jsPWDialogSrc( int inScript, char *otherJS ) -{ - static int srcSpewed = 0; - - otherJS = otherJS ? otherJS : ""; - - if ( ! inScript ) { - fprintf( stdout, "<SCRIPT LANGUAGE=\""MOCHA_NAME"\">\n" ); - } - if ( ! srcSpewed ) { - srcSpewed = 1; - fprintf( stdout, "function passwordDialog( prompt, element ) {\n" - " var dlg = window.open( '', 'dialog', 'height=60,width=500' );\n" - " dlg.document.write(\n" - " '<form name=f1 onSubmit=\"opener.document.'\n" - " + element + '.value = goo.value; window.close(); " - "%s; return false;\">',\n" - " prompt, '<input type=password name=goo></form>' );\n" - " dlg.document.f1.goo.focus();\n" - " dlg.document.close();\n" - "}\n", otherJS ); - } - if ( ! inScript ) { - fprintf( stdout, "</SCRIPT>\n" ); - } -} - static int adm_initialized=0; /* Initialize NSPR for all the base functions we use */ @@ -1256,85 +234,3 @@ NSAPI_PUBLIC int ADM_Init(void) } return 0; } - - -#ifdef XP_UNIX -/* - * This function will return the SuiteSpot user id and group id used to - * recommend that Netscape Servers to run as. Any line starts with '#' - * is treated as comment. It looks for SuiteSpotUser/SuiteSpotGroup - * name/value pair. - * - * It returns 0 when success and allocate storage for user and group. - * returns -1 when only SuiteSpot user id is found. - * returns -2 when only SuiteSpot group id is found. - * returns -3 when NO SuiteSpot user and group is found. - * returns -4 when fails to open <server_root>/install/ssusers.conf - */ -NSAPI_PUBLIC int ADM_GetUXSSid(char *sroot, char **user, char **group) -{ - int foundUser, foundGroup; - char fn[BIG_LINE]; - char line[BIG_LINE]; - FILE *f; - - foundUser = 0; - foundGroup = 0; - *user = (char *) NULL; - *group = (char *) NULL; - - sprintf(fn, "%s/install/ssusers.conf", sroot); - if (f = fopen(fn, "r")) { - while (fgets(line, sizeof(line), f)) { - if (line[0] == '#') { - continue; - } - if (!strncmp(line, "SuiteSpotUser", strlen("SuiteSpotUser"))) { - char *ptr1; - ptr1 = line + strlen("SuiteSpotUser"); - while ((*ptr1 == '\t') || (*ptr1 == ' ')) { - ptr1++; - } - if ((strlen(ptr1) > 0) && (*user == (char *) NULL)) { - *user = (char *) MALLOC(strlen(ptr1)+1); - if (ptr1[strlen(ptr1)-1] == '\n') { - ptr1[strlen(ptr1)-1] = '\0'; - } - strcpy(*user, ptr1); - } - foundUser = 1; - continue; - } - if (!strncmp(line, "SuiteSpotGroup", strlen("SuiteSpotGroup"))) { - char *ptr1; - ptr1 = line + strlen("SuiteSpotGroup"); - while ((*ptr1 == '\t') || (*ptr1 == ' ')) { - ptr1++; - } - if ((strlen(ptr1) > 0) && (*group == (char *) NULL)) { - *group = (char *) MALLOC(strlen(ptr1)+1); - if (ptr1[strlen(ptr1)-1] == '\n') { - ptr1[strlen(ptr1)-1] = '\0'; - } - strcpy(*group, ptr1); - } - foundGroup = 1; - continue; - } - } - fclose(f); - } else { - return(-4); - } - - if (foundUser && foundGroup) { - return(0); - } else if (foundUser) { - return(-1); - } else if (foundGroup) { - return(-2); - } else { - return(-3); - } -} -#endif /* XP_UNIX */ |