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) 19482bfcccSPaul Traina static char rcsid[] = "$Id: env.c,v 1.1.1.1 1994/08/27 13:43:02 jkh 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 3184f33deaSJordan K. Hubbard p[0] = NULL; 3284f33deaSJordan K. Hubbard return (p); 3384f33deaSJordan K. Hubbard } 3484f33deaSJordan K. Hubbard 3584f33deaSJordan K. Hubbard 3684f33deaSJordan K. Hubbard void 3784f33deaSJordan K. Hubbard env_free(envp) 3884f33deaSJordan K. Hubbard char **envp; 3984f33deaSJordan K. Hubbard { 4084f33deaSJordan K. Hubbard char **p; 4184f33deaSJordan K. Hubbard 4284f33deaSJordan K. Hubbard for (p = envp; *p; p++) 4384f33deaSJordan K. Hubbard free(*p); 4484f33deaSJordan K. Hubbard free(envp); 4584f33deaSJordan K. Hubbard } 4684f33deaSJordan K. Hubbard 4784f33deaSJordan K. Hubbard 4884f33deaSJordan K. Hubbard char ** 4984f33deaSJordan K. Hubbard env_copy(envp) 5084f33deaSJordan K. Hubbard register char **envp; 5184f33deaSJordan K. Hubbard { 5284f33deaSJordan K. Hubbard register int count, i; 5384f33deaSJordan K. Hubbard register char **p; 5484f33deaSJordan K. Hubbard 5584f33deaSJordan K. Hubbard for (count = 0; envp[count] != NULL; count++) 5684f33deaSJordan K. Hubbard ; 5784f33deaSJordan K. Hubbard p = (char **) malloc((count+1) * sizeof(char *)); /* 1 for the NULL */ 5884f33deaSJordan K. Hubbard for (i = 0; i < count; i++) 5984f33deaSJordan K. Hubbard p[i] = strdup(envp[i]); 6084f33deaSJordan K. Hubbard p[count] = NULL; 6184f33deaSJordan K. Hubbard return (p); 6284f33deaSJordan K. Hubbard } 6384f33deaSJordan K. Hubbard 6484f33deaSJordan K. Hubbard 6584f33deaSJordan K. Hubbard char ** 6684f33deaSJordan K. Hubbard env_set(envp, envstr) 6784f33deaSJordan K. Hubbard char **envp; 6884f33deaSJordan K. Hubbard char *envstr; 6984f33deaSJordan K. Hubbard { 7084f33deaSJordan K. Hubbard register int count, found; 7184f33deaSJordan K. Hubbard register char **p; 7284f33deaSJordan K. Hubbard 7384f33deaSJordan K. Hubbard /* 7484f33deaSJordan K. Hubbard * count the number of elements, including the null pointer; 7584f33deaSJordan K. Hubbard * also set 'found' to -1 or index of entry if already in here. 7684f33deaSJordan K. Hubbard */ 7784f33deaSJordan K. Hubbard found = -1; 7884f33deaSJordan K. Hubbard for (count = 0; envp[count] != NULL; count++) { 7984f33deaSJordan K. Hubbard if (!strcmp_until(envp[count], envstr, '=')) 8084f33deaSJordan K. Hubbard found = count; 8184f33deaSJordan K. Hubbard } 8284f33deaSJordan K. Hubbard count++; /* for the NULL */ 8384f33deaSJordan K. Hubbard 8484f33deaSJordan K. Hubbard if (found != -1) { 8584f33deaSJordan K. Hubbard /* 8684f33deaSJordan K. Hubbard * it exists already, so just free the existing setting, 8784f33deaSJordan K. Hubbard * save our new one there, and return the existing array. 8884f33deaSJordan K. Hubbard */ 8984f33deaSJordan K. Hubbard free(envp[found]); 9084f33deaSJordan K. Hubbard envp[found] = strdup(envstr); 9184f33deaSJordan K. Hubbard return (envp); 9284f33deaSJordan K. Hubbard } 9384f33deaSJordan K. Hubbard 9484f33deaSJordan K. Hubbard /* 9584f33deaSJordan K. Hubbard * it doesn't exist yet, so resize the array, move null pointer over 9684f33deaSJordan K. Hubbard * one, save our string over the old null pointer, and return resized 9784f33deaSJordan K. Hubbard * array. 9884f33deaSJordan K. Hubbard */ 9984f33deaSJordan K. Hubbard p = (char **) realloc((void *) envp, 10084f33deaSJordan K. Hubbard (unsigned) ((count+1) * sizeof(char **))); 10184f33deaSJordan K. Hubbard p[count] = p[count-1]; 10284f33deaSJordan K. Hubbard p[count-1] = strdup(envstr); 10384f33deaSJordan K. Hubbard return (p); 10484f33deaSJordan K. Hubbard } 10584f33deaSJordan K. Hubbard 10684f33deaSJordan K. Hubbard 10784f33deaSJordan K. Hubbard /* return ERR = end of file 10884f33deaSJordan K. Hubbard * FALSE = not an env setting (file was repositioned) 10984f33deaSJordan K. Hubbard * TRUE = was an env setting 11084f33deaSJordan K. Hubbard */ 11184f33deaSJordan K. Hubbard int 11284f33deaSJordan K. Hubbard load_env(envstr, f) 11384f33deaSJordan K. Hubbard char *envstr; 11484f33deaSJordan K. Hubbard FILE *f; 11584f33deaSJordan K. Hubbard { 11684f33deaSJordan K. Hubbard long filepos; 11784f33deaSJordan K. Hubbard int fileline; 118482bfcccSPaul Traina char name[MAX_ENVSTR], val[MAX_ENVSTR]; 11984f33deaSJordan K. Hubbard int fields; 12084f33deaSJordan K. Hubbard 12184f33deaSJordan K. Hubbard filepos = ftell(f); 12284f33deaSJordan K. Hubbard fileline = LineNumber; 12384f33deaSJordan K. Hubbard skip_comments(f); 12484f33deaSJordan K. Hubbard if (EOF == get_string(envstr, MAX_ENVSTR, f, "\n")) 12584f33deaSJordan K. Hubbard return (ERR); 12684f33deaSJordan K. Hubbard 12784f33deaSJordan K. Hubbard Debug(DPARS, ("load_env, read <%s>\n", envstr)) 12884f33deaSJordan K. Hubbard 12984f33deaSJordan K. Hubbard name[0] = val[0] = '\0'; 13084f33deaSJordan K. Hubbard fields = sscanf(envstr, "%[^ =] = %[^\n#]", name, val); 13184f33deaSJordan K. Hubbard if (fields != 2) { 13284f33deaSJordan K. Hubbard Debug(DPARS, ("load_env, not 2 fields (%d)\n", fields)) 13384f33deaSJordan K. Hubbard fseek(f, filepos, 0); 13484f33deaSJordan K. Hubbard Set_LineNum(fileline); 13584f33deaSJordan K. Hubbard return (FALSE); 13684f33deaSJordan K. Hubbard } 13784f33deaSJordan K. Hubbard 13884f33deaSJordan K. Hubbard /* 2 fields from scanf; looks like an env setting 13984f33deaSJordan K. Hubbard */ 14084f33deaSJordan K. Hubbard 14184f33deaSJordan K. Hubbard /* 14284f33deaSJordan K. Hubbard * process value string 14384f33deaSJordan K. Hubbard */ 14484f33deaSJordan K. Hubbard /*local*/{ 14584f33deaSJordan K. Hubbard int len = strdtb(val); 14684f33deaSJordan K. Hubbard 14784f33deaSJordan K. Hubbard if (len >= 2) { 14884f33deaSJordan K. Hubbard if (val[0] == '\'' || val[0] == '"') { 14984f33deaSJordan K. Hubbard if (val[len-1] == val[0]) { 15084f33deaSJordan K. Hubbard val[len-1] = '\0'; 15184f33deaSJordan K. Hubbard (void) strcpy(val, val+1); 15284f33deaSJordan K. Hubbard } 15384f33deaSJordan K. Hubbard } 15484f33deaSJordan K. Hubbard } 15584f33deaSJordan K. Hubbard } 15684f33deaSJordan K. Hubbard 15784f33deaSJordan K. Hubbard (void) sprintf(envstr, "%s=%s", name, val); 15884f33deaSJordan K. Hubbard Debug(DPARS, ("load_env, <%s> <%s> -> <%s>\n", name, val, envstr)) 15984f33deaSJordan K. Hubbard return (TRUE); 16084f33deaSJordan K. Hubbard } 16184f33deaSJordan K. Hubbard 16284f33deaSJordan K. Hubbard 16384f33deaSJordan K. Hubbard char * 16484f33deaSJordan K. Hubbard env_get(name, envp) 16584f33deaSJordan K. Hubbard register char *name; 16684f33deaSJordan K. Hubbard register char **envp; 16784f33deaSJordan K. Hubbard { 16884f33deaSJordan K. Hubbard register int len = strlen(name); 16984f33deaSJordan K. Hubbard register char *p, *q; 17084f33deaSJordan K. Hubbard 17184f33deaSJordan K. Hubbard while (p = *envp++) { 17284f33deaSJordan K. Hubbard if (!(q = strchr(p, '='))) 17384f33deaSJordan K. Hubbard continue; 17484f33deaSJordan K. Hubbard if ((q - p) == len && !strncmp(p, name, len)) 17584f33deaSJordan K. Hubbard return (q+1); 17684f33deaSJordan K. Hubbard } 17784f33deaSJordan K. Hubbard return (NULL); 17884f33deaSJordan K. Hubbard } 179