Activate globus modules only once (deactivation is not thread safe).
authorFrantišek Dvořák <valtri@civ.zcu.cz>
Tue, 7 Dec 2010 12:14:55 +0000 (12:14 +0000)
committerFrantišek Dvořák <valtri@civ.zcu.cz>
Tue, 7 Dec 2010 12:14:55 +0000 (12:14 +0000)
Add a cleanup function.

org.glite.security.gss/interface/glite_gss.h
org.glite.security.gss/src/glite_gss.c

index 9468689..37f719f 100644 (file)
@@ -78,6 +78,9 @@ typedef struct _edg_wll_GssCred_data *edg_wll_GssCred;
 int
 edg_wll_gss_initialize(void);
 
+void
+edg_wll_gss_finalize(void);
+
 int
 edg_wll_gss_acquire_cred_gsi(const char *cert_file,
                             const char *key_file,
index 08a4349..bae85f8 100644 (file)
@@ -59,6 +59,8 @@ struct asyn_result {
        int             err;
 };
 
+static int globus_common_activated = 0;
+
 static int decrement_timeout(struct timeval *timeout, struct timeval before, struct timeval after)
 {
         (*timeout).tv_sec = (*timeout).tv_sec - (after.tv_sec - before.tv_sec);
@@ -1165,16 +1167,31 @@ edg_wll_gss_reject(int sock)
 int
 edg_wll_gss_initialize(void)
 {
-   int ret;
+   int ret = 0;
 
-   ret = globus_module_activate(GLOBUS_GSI_GSSAPI_MODULE);
-   if (ret != GLOBUS_SUCCESS) {
+   if (globus_module_activate(GLOBUS_GSI_GSSAPI_MODULE) != GLOBUS_SUCCESS) {
       errno = EINVAL;
       ret = EDG_WLL_GSS_ERROR_ERRNO;
    }
+
+   if (globus_module_activate(GLOBUS_COMMON_MODULE) == GLOBUS_SUCCESS)
+       globus_common_activated = 1;
+
    return ret;
 }
 
+
+void
+edg_wll_gss_finalize(void)
+{
+   globus_module_deactivate(GLOBUS_GSI_GSSAPI_MODULE);
+   if (globus_common_activated) {
+      globus_module_deactivate(GLOBUS_COMMON_MODULE);
+      globus_common_activated = 0;
+   }
+}
+
+
 int
 edg_wll_gss_release_cred(edg_wll_GssCred *cred, edg_wll_GssStatus* gss_code)
 {
@@ -1457,13 +1474,10 @@ edg_wll_gss_gethostname(char *name, int len)
 {
    int ret;
 
-   ret = globus_module_activate(GLOBUS_COMMON_MODULE);
-   if (ret != GLOBUS_SUCCESS) {
+   if (globus_common_activated)
+      ret = globus_libc_gethostname(name, len);
+   else
       ret = gethostname(name, len);
-      return ret;
-   }
-   ret = globus_libc_gethostname(name, len);
-   globus_module_deactivate(GLOBUS_COMMON_MODULE);
 
    return ret;
 }