Skip to content
Snippets Groups Projects
Commit a81a3a4d authored by Olof Barring's avatar Olof Barring Committed by Steven Murray
Browse files

Add re-entrant getconfent_r(). Make getconfent() thread-safe by declaring

internal buffer in thread local storage and call getconfent_r() internally.
parent b6d193b0
No related branches found
No related tags found
No related merge requests found
/*
* Copyright (C) 1991-1997 by CERN CN-PDP/CS
* All rights reserved
*/
#ifndef lint
static char sccsid[] = "@(#)getconfent.c 1.11 08/19/97 CERN CN-PDP/CS F. Hemmer";
#endif /* not lint */
/* getconfent.c - get configuration entry */
#include <stdio.h>
#include <string.h>
#include <Cglobals.h>
#include <serrno.h>
#ifndef PATH_CONFIG
#if !defined(vms)
#if defined(_WIN32)
#define PATH_CONFIG "%SystemRoot%\\system32\\drivers\\etc\\shift.conf"
#else
#define PATH_CONFIG "/etc/shift.conf"
#endif
#else /* vms */
#define PATH_CONFIG "SYS$MANAGER:shift.conf"
#endif /* vms */
#endif /* PATH_CONFIG */
#include <stdio.h> /* Standard input/output */
#include <ctype.h> /* Character manipulation */
#include <string.h> /* String handling functions */
#ifndef vms
#include <serrno.h> /* Special Error numbers */
#else
#include "serrno.h" /* Special Error numbers */
#endif /* vms */
#if defined(vms) && defined(__alpha) && defined(COMPILE_NOPREFIX)
#define fclose DECC$FCLOSE
#define fgets DECC$FGETS
#define fopen DECC$FOPEN
#define getenv DECC$GETENV
#define strcmp DECC$STRCMP
#define strcpy DECC$STRCPY
#define strtok DECC$STRTOK
#endif /* vms && __alpha && COMPILE_NOPREFIX */
static char in_line[BUFSIZ+1];
const char char_set[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+|~`\\=-{}[]:;''\",./<>?";
extern char* getenv();
static char value[BUFSIZ];
char *
getconfent(category, name, flags)
char *category;
char *name;
int flags;
{
char *filename=PATH_CONFIG;
FILE *fp;
char *p, *cp;
int found = 0;
char path_config[256];
char *separator;
char *getconfent_r(char *category, char *name, int flags,
char *buffer, int bufsiz) {
char *filename=PATH_CONFIG;
FILE *fp;
char *p, *cp, *ep;
char *getenv();
int found = 0;
char path_config[256];
char *separator;
if ((p = getenv("PATH_CONFIG")) != NULL) {
filename=p;
}
#if defined(_WIN32)
if (strncmp (filename, "%SystemRoot%\\", 13) == 0 &&
(p = getenv ("SystemRoot")))
sprintf (path_config, "%s\\%s", p, strchr (filename, '\\'));
else
if (strncmp (filename, "%SystemRoot%\\", 13) == 0 &&
(p = getenv ("SystemRoot")))
sprintf (path_config, "%s\\%s", p, strchr (filename, '\\'));
else
#endif
strcpy (path_config, filename);
strcpy (path_config, filename);
#ifdef DEBUG
log(LOG_DEBUG ,"getconfent(%s,%s,%d)\n",
category, name, flags);
log(LOG_DEBUG ,"getconfent: opening %s\n",path_config);
#endif /* DEBUG */
if ((fp = fopen(path_config,"r")) == NULL) {
serrno = SENOCONFIG;
serrno = SENOCONFIG;
return (NULL);
}
for (;;) {
p = fgets(in_line, BUFSIZ, fp);
p = fgets(buffer, bufsiz-1, fp);
if (p == NULL) {
break;
}
#ifdef DEBUG
log(LOG_DEBUG ,"getconfent: read <%s>",p);
#endif /* DEBUG */
if (*p == '#') continue;
#ifdef DEBUG
log(LOG_DEBUG ,"getconfent: processing <%s>",p);
#endif /* DEBUG */
if ((cp = strtok(p," \t")) == NULL) continue; /* empty line */
if (*cp == '#') continue; /* comment */
if (strcmp(cp, category) == 0) { /* a category match */
#ifdef DEBUG
log(LOG_DEBUG ,"getconfent: category <%s>\n", cp);
#endif /* DEBUG */
if ((cp = strtok(NULL," \t")) == NULL) continue;
if (*cp == '#') continue; /* comment, invalid */
if (strcmp(cp, name) == 0) { /* A match */
#ifdef DEBUG
log(LOG_DEBUG ,"getconfent: category <%s>, processing<%s>\n",
category, cp);
#endif /* DEBUG */
if (flags) {
/* Don't tokenize next arg */
separator = "#\n";
} else {
/* Don't tokenize next arg */
separator = "#\t \n";
}
if ((cp = strtok(NULL, separator)) == NULL) continue; /* invalid format */
if (*cp == '#') continue; /* comment, invalid */
#ifdef DEBUG
log(LOG_DEBUG ,"getconfent: category <%s>, got<%s>\n",
category, cp);
#endif /* DEBUG */
found++;
strcpy(value,cp);
break;
}
else {
continue;
}
}
else {
continue;
}
}
#ifdef DEBUG
log(LOG_DEBUG ,"getconfent: closing %s\n",path_config);
#endif /* DEBUG */
if (fclose(fp)) return (NULL);
if (!found) {
return(NULL);
}
else {
return(value);
}
if (*p == '#') continue;
if ((cp = strpbrk(p,char_set)) == NULL) continue;
if (*cp == '#') continue;
if ((ep = strpbrk(cp," \t")) == NULL) ep = &cp[strlen(cp)];
if ( *ep == '\n' ) continue;
*ep = '\0';
if (strcmp(cp,category) == 0) {
p = &ep[1];
if ((cp = strpbrk(p,char_set)) == NULL ) continue;
if (*cp == '#') continue;
if ((ep = strpbrk(cp," \t")) == NULL) ep = &cp[strlen(cp)];
if ( *ep == '\n' ) continue;
*ep = '\0';
if ( strcmp(cp,name) == 0) {
if (flags != 0) {
separator = "#\n";
} else {
separator = "#\t \n";
}
p = &ep[1];
if ((cp = strpbrk(p,char_set)) == NULL) continue;
if (*cp == '#') continue;
if ((ep = strpbrk(cp,separator)) == NULL) ep = &cp[strlen(cp)];
*ep = '\0';
found++;
break;
}
else {
continue;
}
} else {
continue;
}
}
if (fclose(fp)) return(NULL);
if (found == 0) return(NULL);
else return(cp);
}
static int value_key = -1;
char *getconfent(char *category, char *name, int flags) {
char *value = NULL;
Cglobals_get(&value_key,&value,BUFSIZ+1);
if ( value == NULL ) {
return(NULL);
}
return(getconfent_r(category,name,flags,value,BUFSIZ+1));
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment