184f33deaSJordan K. Hubbard /* Copyright 1988,1990,1993,1994 by Paul Vixie 284f33deaSJordan K. Hubbard * All rights reserved 384f33deaSJordan K. Hubbard * 484f33deaSJordan K. Hubbard * Distribute freely, except: don't remove my name from the source or 584f33deaSJordan K. Hubbard * documentation (don't take credit for my work), mark your changes (don't 684f33deaSJordan K. Hubbard * get me blamed for your possible bugs), don't alter or remove this 784f33deaSJordan K. Hubbard * notice. May be sold if buildable source is provided to buyer. No 884f33deaSJordan K. Hubbard * warrantee of any kind, express or implied, is included with this 984f33deaSJordan K. Hubbard * software; use at your own risk, responsibility for damages (if any) to 1084f33deaSJordan K. Hubbard * anyone resulting from the use of this software rests entirely with the 1184f33deaSJordan K. Hubbard * user. 1284f33deaSJordan K. Hubbard * 1384f33deaSJordan K. Hubbard * Send bug reports, bug fixes, enhancements, requests, flames, etc., and 1484f33deaSJordan K. Hubbard * I'll try to keep a version up to date. I can be reached as follows: 1584f33deaSJordan K. Hubbard * Paul Vixie <paul@vix.com> uunet!decwrl!vixie!paul 1684f33deaSJordan K. Hubbard */ 1784f33deaSJordan K. Hubbard 1884f33deaSJordan K. Hubbard #if !defined(lint) && !defined(LINT) 19bdddbd2fSPaul Traina static char rcsid[] = "$Id: env.c,v 1.2 1996/12/16 18:21:00 pst Exp $"; 2084f33deaSJordan K. Hubbard #endif 2184f33deaSJordan K. Hubbard 2284f33deaSJordan K. Hubbard 2384f33deaSJordan K. Hubbard #include "cron.h" 2484f33deaSJordan K. Hubbard 2584f33deaSJordan K. Hubbard 2684f33deaSJordan K. Hubbard char ** 2784f33deaSJordan K. Hubbard env_init() 2884f33deaSJordan K. Hubbard { 2984f33deaSJordan K. Hubbard register char **p = (char **) malloc(sizeof(char **)); 3084f33deaSJordan K. Hubbard 31bdddbd2fSPaul Traina if (p) 3284f33deaSJordan K. Hubbard p[0] = NULL; 3384f33deaSJordan K. Hubbard return (p); 3484f33deaSJordan K. Hubbard } 3584f33deaSJordan K. Hubbard 3684f33deaSJordan K. Hubbard 3784f33deaSJordan K. Hubbard void 3884f33deaSJordan K. Hubbard env_free(envp) 3984f33deaSJordan K. Hubbard char **envp; 4084f33deaSJordan K. Hubbard { 4184f33deaSJordan K. Hubbard char **p; 4284f33deaSJordan K. Hubbard 4384f33deaSJordan K. Hubbard for (p = envp; *p; p++) 4484f33deaSJordan K. Hubbard free(*p); 4584f33deaSJordan K. Hubbard free(envp); 4684f33deaSJordan K. Hubbard } 4784f33deaSJordan K. Hubbard 4884f33deaSJordan K. Hubbard 4984f33deaSJordan K. Hubbard char ** 5084f33deaSJordan K. Hubbard env_copy(envp) 5184f33deaSJordan K. Hubbard register char **envp; 5284f33deaSJordan K. Hubbard { 5384f33deaSJordan K. Hubbard register int count, i; 5484f33deaSJordan K. Hubbard register char **p; 5584f33deaSJordan K. Hubbard 5684f33deaSJordan K. Hubbard for (count = 0; envp[count] != NULL; count++) 5784f33deaSJordan K. Hubbard ; 5884f33deaSJordan K. Hubbard p = (char **) malloc((count+1) * sizeof(char *)); /* 1 for the NULL */ 59bdddbd2fSPaul Traina if (p == NULL) { 60bdddbd2fSPaul Traina errno = ENOMEM; 61bdddbd2fSPaul Traina return NULL; 62bdddbd2fSPaul Traina } 6384f33deaSJordan K. Hubbard for (i = 0; i < count; i++) 64bdddbd2fSPaul Traina if ((p[i] = strdup(envp[i])) == NULL) { 65bdddbd2fSPaul Traina while (--i >= 0) 66bdddbd2fSPaul Traina (void) free(p[i]); 67bdddbd2fSPaul Traina free(p); 68bdddbd2fSPaul Traina errno = ENOMEM; 69bdddbd2fSPaul Traina return NULL; 70bdddbd2fSPaul Traina } 7184f33deaSJordan K. Hubbard p[count] = NULL; 7284f33deaSJordan K. Hubbard return (p); 7384f33deaSJordan K. Hubbard } 7484f33deaSJordan K. Hubbard 7584f33deaSJordan K. Hubbard 7684f33deaSJordan K. Hubbard char ** 7784f33deaSJordan K. Hubbard env_set(envp, envstr) 7884f33deaSJordan K. Hubbard char **envp; 7984f33deaSJordan K. Hubbard char *envstr; 8084f33deaSJordan K. Hubbard { 8184f33deaSJordan K. Hubbard register int count, found; 8284f33deaSJordan K. Hubbard register char **p; 8384f33deaSJordan K. Hubbard 8484f33deaSJordan K. Hubbard /* 8584f33deaSJordan K. Hubbard * count the number of elements, including the null pointer; 8684f33deaSJordan K. Hubbard * also set 'found' to -1 or index of entry if already in here. 8784f33deaSJordan K. Hubbard */ 8884f33deaSJordan K. Hubbard found = -1; 8984f33deaSJordan K. Hubbard for (count = 0; envp[count] != NULL; count++) { 9084f33deaSJordan K. Hubbard if (!strcmp_until(envp[count], envstr, '=')) 9184f33deaSJordan K. Hubbard found = count; 9284f33deaSJordan K. Hubbard } 9384f33deaSJordan K. Hubbard count++; /* for the NULL */ 9484f33deaSJordan K. Hubbard 9584f33deaSJordan K. Hubbard if (found != -1) { 9684f33deaSJordan K. Hubbard /* 9784f33deaSJordan K. Hubbard * it exists already, so just free the existing setting, 9884f33deaSJordan K. Hubbard * save our new one there, and return the existing array. 9984f33deaSJordan K. Hubbard */ 10084f33deaSJordan K. Hubbard free(envp[found]); 101bdddbd2fSPaul Traina if ((envp[found] = strdup(envstr)) == NULL) { 102bdddbd2fSPaul Traina envp[found] = ""; 103bdddbd2fSPaul Traina errno = ENOMEM; 104bdddbd2fSPaul Traina return NULL; 105bdddbd2fSPaul Traina } 10684f33deaSJordan K. Hubbard return (envp); 10784f33deaSJordan K. Hubbard } 10884f33deaSJordan K. Hubbard 10984f33deaSJordan K. Hubbard /* 11084f33deaSJordan K. Hubbard * it doesn't exist yet, so resize the array, move null pointer over 11184f33deaSJordan K. Hubbard * one, save our string over the old null pointer, and return resized 11284f33deaSJordan K. Hubbard * array. 11384f33deaSJordan K. Hubbard */ 11484f33deaSJordan K. Hubbard p = (char **) realloc((void *) envp, 11584f33deaSJordan K. Hubbard (unsigned) ((count+1) * sizeof(char **))); 116bdddbd2fSPaul Traina if (p == NULL) { 117bdddbd2fSPaul Traina errno = ENOMEM; 118bdddbd2fSPaul Traina return NULL; 119bdddbd2fSPaul Traina } 12084f33deaSJordan K. Hubbard p[count] = p[count-1]; 121bdddbd2fSPaul Traina if ((p[count-1] = strdup(envstr)) == NULL) { 122bdddbd2fSPaul Traina errno = ENOMEM; 123bdddbd2fSPaul Traina return NULL; 124bdddbd2fSPaul Traina } 12584f33deaSJordan K. Hubbard return (p); 12684f33deaSJordan K. Hubbard } 12784f33deaSJordan K. Hubbard 12884f33deaSJordan K. Hubbard 12984f33deaSJordan K. Hubbard /* return ERR = end of file 13084f33deaSJordan K. Hubbard * FALSE = not an env setting (file was repositioned) 13184f33deaSJordan K. Hubbard * TRUE = was an env setting 13284f33deaSJordan K. Hubbard */ 13384f33deaSJordan K. Hubbard int 13484f33deaSJordan K. Hubbard load_env(envstr, f) 13584f33deaSJordan K. Hubbard char *envstr; 13684f33deaSJordan K. Hubbard FILE *f; 13784f33deaSJordan K. Hubbard { 13884f33deaSJordan K. Hubbard long filepos; 13984f33deaSJordan K. Hubbard int fileline; 140482bfcccSPaul Traina char name[MAX_ENVSTR], val[MAX_ENVSTR]; 14184f33deaSJordan K. Hubbard int fields; 14284f33deaSJordan K. Hubbard 14384f33deaSJordan K. Hubbard filepos = ftell(f); 14484f33deaSJordan K. Hubbard fileline = LineNumber; 14584f33deaSJordan K. Hubbard skip_comments(f); 14684f33deaSJordan K. Hubbard if (EOF == get_string(envstr, MAX_ENVSTR, f, "\n")) 14784f33deaSJordan K. Hubbard return (ERR); 14884f33deaSJordan K. Hubbard 14984f33deaSJordan K. Hubbard Debug(DPARS, ("load_env, read <%s>\n", envstr)) 15084f33deaSJordan K. Hubbard 15184f33deaSJordan K. Hubbard name[0] = val[0] = '\0'; 15284f33deaSJordan K. Hubbard fields = sscanf(envstr, "%[^ =] = %[^\n#]", name, val); 15384f33deaSJordan K. Hubbard if (fields != 2) { 15484f33deaSJordan K. Hubbard Debug(DPARS, ("load_env, not 2 fields (%d)\n", fields)) 15584f33deaSJordan K. Hubbard fseek(f, filepos, 0); 15684f33deaSJordan K. Hubbard Set_LineNum(fileline); 15784f33deaSJordan K. Hubbard return (FALSE); 15884f33deaSJordan K. Hubbard } 15984f33deaSJordan K. Hubbard 16084f33deaSJordan K. Hubbard /* 2 fields from scanf; looks like an env setting 16184f33deaSJordan K. Hubbard */ 16284f33deaSJordan K. Hubbard 16384f33deaSJordan K. Hubbard /* 16484f33deaSJordan K. Hubbard * process value string 16584f33deaSJordan K. Hubbard */ 16684f33deaSJordan K. Hubbard /*local*/{ 16784f33deaSJordan K. Hubbard int len = strdtb(val); 16884f33deaSJordan K. Hubbard 16984f33deaSJordan K. Hubbard if (len >= 2) { 17084f33deaSJordan K. Hubbard if (val[0] == '\'' || val[0] == '"') { 17184f33deaSJordan K. Hubbard if (val[len-1] == val[0]) { 17284f33deaSJordan K. Hubbard val[len-1] = '\0'; 17384f33deaSJordan K. Hubbard (void) strcpy(val, val+1); 17484f33deaSJordan K. Hubbard } 17584f33deaSJordan K. Hubbard } 17684f33deaSJordan K. Hubbard } 17784f33deaSJordan K. Hubbard } 17884f33deaSJordan K. Hubbard 179bdddbd2fSPaul Traina if (strlen(name) + 1 + strlen(val) >= MAX_ENVSTR-1) 180bdddbd2fSPaul Traina return (FALSE); 18184f33deaSJordan K. Hubbard (void) sprintf(envstr, "%s=%s", name, val); 18284f33deaSJordan K. Hubbard Debug(DPARS, ("load_env, <%s> <%s> -> <%s>\n", name, val, envstr)) 18384f33deaSJordan K. Hubbard return (TRUE); 18484f33deaSJordan K. Hubbard } 18584f33deaSJordan K. Hubbard 18684f33deaSJordan K. Hubbard 18784f33deaSJordan K. Hubbard char * 18884f33deaSJordan K. Hubbard env_get(name, envp) 18984f33deaSJordan K. Hubbard register char *name; 19084f33deaSJordan K. Hubbard register char **envp; 19184f33deaSJordan K. Hubbard { 19284f33deaSJordan K. Hubbard register int len = strlen(name); 19384f33deaSJordan K. Hubbard register char *p, *q; 19484f33deaSJordan K. Hubbard 19584f33deaSJordan K. Hubbard while (p = *envp++) { 19684f33deaSJordan K. Hubbard if (!(q = strchr(p, '='))) 19784f33deaSJordan K. Hubbard continue; 19884f33deaSJordan K. Hubbard if ((q - p) == len && !strncmp(p, name, len)) 19984f33deaSJordan K. Hubbard return (q+1); 20084f33deaSJordan K. Hubbard } 20184f33deaSJordan K. Hubbard return (NULL); 20284f33deaSJordan K. Hubbard } 203