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) 19401e6468SPhilippe Charnier static const char rcsid[] = 2097d92980SPeter Wemm "$FreeBSD$"; 2184f33deaSJordan K. Hubbard #endif 2284f33deaSJordan K. Hubbard 2384f33deaSJordan K. Hubbard 2484f33deaSJordan K. Hubbard #include "cron.h" 2584f33deaSJordan K. Hubbard 2684f33deaSJordan K. Hubbard 2784f33deaSJordan K. Hubbard char ** 2884f33deaSJordan K. Hubbard env_init() 2984f33deaSJordan K. Hubbard { 30d02e530bSGuy Helmer register char **p = (char **) malloc(sizeof(char *)); 3184f33deaSJordan K. Hubbard 32bdddbd2fSPaul Traina if (p) 3384f33deaSJordan K. Hubbard p[0] = NULL; 3484f33deaSJordan K. Hubbard return (p); 3584f33deaSJordan K. Hubbard } 3684f33deaSJordan K. Hubbard 3784f33deaSJordan K. Hubbard 3884f33deaSJordan K. Hubbard void 3984f33deaSJordan K. Hubbard env_free(envp) 4084f33deaSJordan K. Hubbard char **envp; 4184f33deaSJordan K. Hubbard { 4284f33deaSJordan K. Hubbard char **p; 4384f33deaSJordan K. Hubbard 4484f33deaSJordan K. Hubbard for (p = envp; *p; p++) 4584f33deaSJordan K. Hubbard free(*p); 4684f33deaSJordan K. Hubbard free(envp); 4784f33deaSJordan K. Hubbard } 4884f33deaSJordan K. Hubbard 4984f33deaSJordan K. Hubbard 5084f33deaSJordan K. Hubbard char ** 5184f33deaSJordan K. Hubbard env_copy(envp) 5284f33deaSJordan K. Hubbard register char **envp; 5384f33deaSJordan K. Hubbard { 5484f33deaSJordan K. Hubbard register int count, i; 5584f33deaSJordan K. Hubbard register char **p; 5684f33deaSJordan K. Hubbard 5784f33deaSJordan K. Hubbard for (count = 0; envp[count] != NULL; count++) 5884f33deaSJordan K. Hubbard ; 59d02e530bSGuy Helmer p = (char **) malloc((count+1) * sizeof(char *)); /* 1 for the NULL */ 60bdddbd2fSPaul Traina if (p == NULL) { 61bdddbd2fSPaul Traina errno = ENOMEM; 62bdddbd2fSPaul Traina return NULL; 63bdddbd2fSPaul Traina } 6484f33deaSJordan K. Hubbard for (i = 0; i < count; i++) 65bdddbd2fSPaul Traina if ((p[i] = strdup(envp[i])) == NULL) { 66bdddbd2fSPaul Traina while (--i >= 0) 67bdddbd2fSPaul Traina (void) free(p[i]); 68bdddbd2fSPaul Traina free(p); 69bdddbd2fSPaul Traina errno = ENOMEM; 70bdddbd2fSPaul Traina return NULL; 71bdddbd2fSPaul Traina } 7284f33deaSJordan K. Hubbard p[count] = NULL; 7384f33deaSJordan K. Hubbard return (p); 7484f33deaSJordan K. Hubbard } 7584f33deaSJordan K. Hubbard 7684f33deaSJordan K. Hubbard 7784f33deaSJordan K. Hubbard char ** 7884f33deaSJordan K. Hubbard env_set(envp, envstr) 7984f33deaSJordan K. Hubbard char **envp; 8084f33deaSJordan K. Hubbard char *envstr; 8184f33deaSJordan K. Hubbard { 8284f33deaSJordan K. Hubbard register int count, found; 8384f33deaSJordan K. Hubbard register char **p; 848261236dSGuy Helmer char *q; 8584f33deaSJordan K. Hubbard 8684f33deaSJordan K. Hubbard /* 8784f33deaSJordan K. Hubbard * count the number of elements, including the null pointer; 8884f33deaSJordan K. Hubbard * also set 'found' to -1 or index of entry if already in here. 8984f33deaSJordan K. Hubbard */ 9084f33deaSJordan K. Hubbard found = -1; 9184f33deaSJordan K. Hubbard for (count = 0; envp[count] != NULL; count++) { 9284f33deaSJordan K. Hubbard if (!strcmp_until(envp[count], envstr, '=')) 9384f33deaSJordan K. Hubbard found = count; 9484f33deaSJordan K. Hubbard } 9584f33deaSJordan K. Hubbard count++; /* for the NULL */ 9684f33deaSJordan K. Hubbard 9784f33deaSJordan K. Hubbard if (found != -1) { 9884f33deaSJordan K. Hubbard /* 9984f33deaSJordan K. Hubbard * it exists already, so just free the existing setting, 10084f33deaSJordan K. Hubbard * save our new one there, and return the existing array. 10184f33deaSJordan K. Hubbard */ 1028261236dSGuy Helmer q = envp[found]; 103bdddbd2fSPaul Traina if ((envp[found] = strdup(envstr)) == NULL) { 1048261236dSGuy Helmer envp[found] = q; 1058261236dSGuy Helmer /* XXX env_free(envp); */ 106bdddbd2fSPaul Traina errno = ENOMEM; 107bdddbd2fSPaul Traina return NULL; 108bdddbd2fSPaul Traina } 1098261236dSGuy Helmer free(q); 11084f33deaSJordan K. Hubbard return (envp); 11184f33deaSJordan K. Hubbard } 11284f33deaSJordan K. Hubbard 11384f33deaSJordan K. Hubbard /* 11484f33deaSJordan K. Hubbard * it doesn't exist yet, so resize the array, move null pointer over 11584f33deaSJordan K. Hubbard * one, save our string over the old null pointer, and return resized 11684f33deaSJordan K. Hubbard * array. 11784f33deaSJordan K. Hubbard */ 11884f33deaSJordan K. Hubbard p = (char **) realloc((void *) envp, 119d02e530bSGuy Helmer (unsigned) ((count+1) * sizeof(char *))); 120bdddbd2fSPaul Traina if (p == NULL) { 1218261236dSGuy Helmer /* XXX env_free(envp); */ 122bdddbd2fSPaul Traina errno = ENOMEM; 123bdddbd2fSPaul Traina return NULL; 124bdddbd2fSPaul Traina } 12584f33deaSJordan K. Hubbard p[count] = p[count-1]; 126bdddbd2fSPaul Traina if ((p[count-1] = strdup(envstr)) == NULL) { 1278261236dSGuy Helmer env_free(p); 128bdddbd2fSPaul Traina errno = ENOMEM; 129bdddbd2fSPaul Traina return NULL; 130bdddbd2fSPaul Traina } 13184f33deaSJordan K. Hubbard return (p); 13284f33deaSJordan K. Hubbard } 13384f33deaSJordan K. Hubbard 13484f33deaSJordan K. Hubbard 13584f33deaSJordan K. Hubbard /* return ERR = end of file 13684f33deaSJordan K. Hubbard * FALSE = not an env setting (file was repositioned) 13784f33deaSJordan K. Hubbard * TRUE = was an env setting 13884f33deaSJordan K. Hubbard */ 13984f33deaSJordan K. Hubbard int 14084f33deaSJordan K. Hubbard load_env(envstr, f) 14184f33deaSJordan K. Hubbard char *envstr; 14284f33deaSJordan K. Hubbard FILE *f; 14384f33deaSJordan K. Hubbard { 14484f33deaSJordan K. Hubbard long filepos; 14584f33deaSJordan K. Hubbard int fileline; 146482bfcccSPaul Traina char name[MAX_ENVSTR], val[MAX_ENVSTR]; 14784f33deaSJordan K. Hubbard int fields; 14884f33deaSJordan K. Hubbard 14984f33deaSJordan K. Hubbard filepos = ftell(f); 15084f33deaSJordan K. Hubbard fileline = LineNumber; 15184f33deaSJordan K. Hubbard skip_comments(f); 15284f33deaSJordan K. Hubbard if (EOF == get_string(envstr, MAX_ENVSTR, f, "\n")) 15384f33deaSJordan K. Hubbard return (ERR); 15484f33deaSJordan K. Hubbard 15584f33deaSJordan K. Hubbard Debug(DPARS, ("load_env, read <%s>\n", envstr)) 15684f33deaSJordan K. Hubbard 15784f33deaSJordan K. Hubbard name[0] = val[0] = '\0'; 15884f33deaSJordan K. Hubbard fields = sscanf(envstr, "%[^ =] = %[^\n#]", name, val); 15984f33deaSJordan K. Hubbard if (fields != 2) { 16084f33deaSJordan K. Hubbard Debug(DPARS, ("load_env, not 2 fields (%d)\n", fields)) 16184f33deaSJordan K. Hubbard fseek(f, filepos, 0); 16284f33deaSJordan K. Hubbard Set_LineNum(fileline); 16384f33deaSJordan K. Hubbard return (FALSE); 16484f33deaSJordan K. Hubbard } 16584f33deaSJordan K. Hubbard 16684f33deaSJordan K. Hubbard /* 2 fields from scanf; looks like an env setting 16784f33deaSJordan K. Hubbard */ 16884f33deaSJordan K. Hubbard 16984f33deaSJordan K. Hubbard /* 17084f33deaSJordan K. Hubbard * process value string 17184f33deaSJordan K. Hubbard */ 17284f33deaSJordan K. Hubbard /*local*/{ 17384f33deaSJordan K. Hubbard int len = strdtb(val); 17484f33deaSJordan K. Hubbard 17584f33deaSJordan K. Hubbard if (len >= 2) { 17684f33deaSJordan K. Hubbard if (val[0] == '\'' || val[0] == '"') { 17784f33deaSJordan K. Hubbard if (val[len-1] == val[0]) { 17884f33deaSJordan K. Hubbard val[len-1] = '\0'; 17984f33deaSJordan K. Hubbard (void) strcpy(val, val+1); 18084f33deaSJordan K. Hubbard } 18184f33deaSJordan K. Hubbard } 18284f33deaSJordan K. Hubbard } 18384f33deaSJordan K. Hubbard } 18484f33deaSJordan K. Hubbard 185bdddbd2fSPaul Traina if (strlen(name) + 1 + strlen(val) >= MAX_ENVSTR-1) 186bdddbd2fSPaul Traina return (FALSE); 18784f33deaSJordan K. Hubbard (void) sprintf(envstr, "%s=%s", name, val); 18884f33deaSJordan K. Hubbard Debug(DPARS, ("load_env, <%s> <%s> -> <%s>\n", name, val, envstr)) 18984f33deaSJordan K. Hubbard return (TRUE); 19084f33deaSJordan K. Hubbard } 19184f33deaSJordan K. Hubbard 19284f33deaSJordan K. Hubbard 19384f33deaSJordan K. Hubbard char * 19484f33deaSJordan K. Hubbard env_get(name, envp) 19584f33deaSJordan K. Hubbard register char *name; 19684f33deaSJordan K. Hubbard register char **envp; 19784f33deaSJordan K. Hubbard { 19884f33deaSJordan K. Hubbard register int len = strlen(name); 19984f33deaSJordan K. Hubbard register char *p, *q; 20084f33deaSJordan K. Hubbard 201401e6468SPhilippe Charnier while ((p = *envp++)) { 20284f33deaSJordan K. Hubbard if (!(q = strchr(p, '='))) 20384f33deaSJordan K. Hubbard continue; 20484f33deaSJordan K. Hubbard if ((q - p) == len && !strncmp(p, name, len)) 20584f33deaSJordan K. Hubbard return (q+1); 20684f33deaSJordan K. Hubbard } 20784f33deaSJordan K. Hubbard return (NULL); 20884f33deaSJordan K. Hubbard } 209