aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--src/pj_init.c35
2 files changed, 24 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index db369487..22e433bd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-22 Frank Warmerdam <warmerdam@pobox.com>
+
+ * src/pj_init.c: removed static "start" variable to resolve
+ thread-safety problems (bug 1283).
+
2006-09-14 Frank Warmerdam <warmerdam@pobox.com>
* Produce 4.5.0beta2 release.
diff --git a/src/pj_init.c b/src/pj_init.c
index 489a6b82..94383e85 100644
--- a/src/pj_init.c
+++ b/src/pj_init.c
@@ -30,6 +30,9 @@
******************************************************************************
*
* $Log$
+ * Revision 1.17 2006/09/22 23:06:24 fwarmerdam
+ * remote static start variable in pj_init (bug 1283)
+ *
* Revision 1.16 2004/09/08 15:23:37 warmerda
* added new error for unknown prime meridians
*
@@ -68,14 +71,13 @@
PJ_CVSID("$Id$");
-static paralist *start;
extern FILE *pj_open_lib(char *, char *);
/************************************************************************/
/* get_opt() */
/************************************************************************/
static paralist *
-get_opt(FILE *fid, char *name, paralist *next) {
+get_opt(paralist **start, FILE *fid, char *name, paralist *next) {
char sword[302], *word = sword+1;
int first = 1, len, c;
@@ -92,16 +94,16 @@ get_opt(FILE *fid, char *name, paralist *next) {
while((c = fgetc(fid)) != EOF && c != '\n') ;
break;
}
- } else if (!first && !pj_param(start, sword).i) {
+ } else if (!first && !pj_param(*start, sword).i) {
/* don't default ellipse if datum, ellps or any earth model
information is set. */
if( strncmp(word,"ellps=",6) != 0
- || (!pj_param(start, "tdatum").i
- && !pj_param(start, "tellps").i
- && !pj_param(start, "ta").i
- && !pj_param(start, "tb").i
- && !pj_param(start, "trf").i
- && !pj_param(start, "tf").i) )
+ || (!pj_param(*start, "tdatum").i
+ && !pj_param(*start, "tellps").i
+ && !pj_param(*start, "ta").i
+ && !pj_param(*start, "tb").i
+ && !pj_param(*start, "trf").i
+ && !pj_param(*start, "tf").i) )
{
next = next->next = pj_mkparam(word);
}
@@ -117,13 +119,13 @@ get_opt(FILE *fid, char *name, paralist *next) {
/* get_defaults() */
/************************************************************************/
static paralist *
-get_defaults(paralist *next, char *name) {
+get_defaults(paralist **start, paralist *next, char *name) {
FILE *fid;
if (fid = pj_open_lib("proj_def.dat", "rt")) {
- next = get_opt(fid, "general", next);
+ next = get_opt(start, fid, "general", next);
rewind(fid);
- next = get_opt(fid, name, next);
+ next = get_opt(start, fid, name, next);
(void)fclose(fid);
}
if (errno)
@@ -135,7 +137,7 @@ get_defaults(paralist *next, char *name) {
/* get_init() */
/************************************************************************/
static paralist *
-get_init(paralist *next, char *name) {
+get_init(paralist **start, paralist *next, char *name) {
char fname[MAX_PATH_FILENAME+ID_TAG_MAX+3], *opt;
FILE *fid;
@@ -144,7 +146,7 @@ get_init(paralist *next, char *name) {
*opt++ = '\0';
else { pj_errno = -3; return(0); }
if (fid = pj_open_lib(fname, "rt"))
- next = get_opt(fid, opt, next);
+ next = get_opt(start, fid, opt, next);
else
return(0);
(void)fclose(fid);
@@ -225,6 +227,7 @@ pj_init_plus( const char *definition )
PJ *
pj_init(int argc, char **argv) {
char *s, *name;
+ paralist *start = NULL;
PJ *(*proj)(PJ *);
paralist *curr;
int i;
@@ -246,7 +249,7 @@ pj_init(int argc, char **argv) {
if (pj_param(start, "tinit").i) {
paralist *last = curr;
- if (!(curr = get_init(curr, pj_param(start, "sinit").s)))
+ if (!(curr = get_init(&start, curr, pj_param(start, "sinit").s)))
goto bum_call;
if (curr == last) { pj_errno = -2; goto bum_call; }
}
@@ -259,7 +262,7 @@ pj_init(int argc, char **argv) {
/* set defaults, unless inhibited */
if (!pj_param(start, "bno_defs").i)
- curr = get_defaults(curr, name);
+ curr = get_defaults(&start, curr, name);
proj = (PJ *(*)(PJ *)) pj_list[i].proj;
/* allocate projection structure */