00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00017
00018
00019
00020 #include <stdlib.h>
00021 #include <stdio.h>
00022 #include <string.h>
00023 #include <sys/types.h>
00024 #include <sys/stat.h>
00025 #include <unistd.h>
00026 #include <errno.h>
00027 #include <stdarg.h>
00028 #include <gssapi.h>
00029 #include "lcas_defines.h"
00030 #include "lcas_types.h"
00031
00032
00033
00034
00035
00036
00037
00038
00039 static char * cred_to_dn(gss_cred_id_t);
00040 static int fexist(char *);
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 int lcas_fill_cred(
00054 char * dn,
00055 gss_cred_id_t cred,
00056 lcas_cred_id_t * plcas_cred
00057 )
00058 {
00059
00060 plcas_cred->cred = cred;
00061
00062 if (cred == GSS_C_NO_CREDENTIAL)
00063 {
00064 plcas_cred->dn = strdup(dn);
00065 }
00066 else
00067 {
00068 plcas_cred->dn = cred_to_dn(cred);
00069 }
00070 if (plcas_cred->dn == NULL)
00071 return 1;
00072 return 0;
00073 }
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 int lcas_release_cred(
00084 lcas_cred_id_t * plcas_cred
00085 )
00086 {
00087 if (plcas_cred == NULL)
00088 return 0;
00089
00090 if (plcas_cred->dn != NULL)
00091 free(plcas_cred->dn);
00092
00093
00094 return 0;
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00104 char * lcas_get_dn(
00105 lcas_cred_id_t lcas_cred
00106 )
00107 {
00108 return (lcas_cred.dn);
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00118 gss_cred_id_t lcas_get_gss_cred(
00119 lcas_cred_id_t lcas_cred
00120 )
00121 {
00122 return (lcas_cred.cred);
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00143 static char * cred_to_dn(
00144 gss_cred_id_t globus_cred
00145 )
00146 {
00147 char* globusid = NULL;
00148 char* globusid_tmp = NULL;
00149 gss_name_t globus_name = GSS_C_NO_NAME;
00150 gss_buffer_desc globus_buffer_desc = GSS_C_EMPTY_BUFFER;
00151 gss_buffer_t globus_buffer = &globus_buffer_desc;
00152 OM_uint32 major_status = 0;
00153 OM_uint32 minor_status = 0;
00154 OM_uint32 minor_status2 = 0;
00155
00156 if ((major_status = gss_inquire_cred(&minor_status,
00157 globus_cred,
00158 &globus_name,
00159 NULL, NULL, NULL)) == GSS_S_COMPLETE)
00160 {
00161 major_status = gss_display_name(&minor_status,
00162 globus_name, globus_buffer, NULL);
00163 gss_release_name(&minor_status2, &globus_name);
00164 }
00165
00166
00167
00168
00169 if (major_status == GSS_S_COMPLETE)
00170 {
00171 globusid = globus_buffer_desc.value;
00172 }
00173 else
00174 {
00175 globusid = getenv("GLOBUSID");
00176 globusid = (globusid ? globusid : "GLOBUSID");
00177 }
00178 globusid_tmp = strdup(globusid);
00179
00180 if (globus_buffer_desc.value)
00181 {
00182 gss_release_buffer(&minor_status2, globus_buffer);
00183 }
00184 return globusid_tmp;
00185 }
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 char * lcas_genfilename(
00196 char * prefixp,
00197 char * pathp,
00198 char * suffixp
00199 )
00200 {
00201 char * newfilename;
00202 int prefixl, pathl, suffixl;
00203 char * prefix, * path, * suffix;
00204
00205 prefix = (prefixp) ? prefixp : "";
00206 path = (pathp) ? pathp : "";
00207 suffix = (suffixp) ? suffixp : "";
00208
00209 prefixl = strlen(prefix);
00210 pathl = strlen(path);
00211 suffixl = strlen(suffix);
00212
00213 newfilename = (char *) calloc(1, (prefixl + pathl + suffixl + 3));
00214 if (newfilename)
00215 {
00216 if (*path != '/')
00217 {
00218 strcat(newfilename, prefix);
00219 if ((prefixl != 0) && (prefix[prefixl-1] != '/'))
00220 {
00221 strcat(newfilename, "/");
00222 }
00223 }
00224 strcat(newfilename, path);
00225 if ((pathl != 0) &&
00226 (suffixl != 0) &&
00227 (path[pathl-1] != '/') &&
00228 suffix[0] != '/')
00229 {
00230 strcat(newfilename, "/");
00231 }
00232 strcat(newfilename, suffix);
00233 }
00234 return newfilename;
00235 }
00236
00237
00238
00239
00240
00241
00242
00252 static int fexist(
00253 char * path
00254 )
00255 {
00256 struct stat sbuf;
00257 int res;
00258
00259 if(!path || !*path) return 0;
00260
00261 res=stat(path,&sbuf);
00262 if (res)
00263 {
00264 if (errno==ENOENT)
00265 {
00266 return 0;
00267 }
00268 else
00269 {
00270 return -1;
00271 }
00272 }
00273 return 1;
00274 }
00275
00276
00277
00278
00279
00280
00281
00282
00283 char * lcas_getfexist(
00284 int n,
00285 ...
00286 )
00287 {
00288 va_list pvar;
00289 int i;
00290 char *cfilenm=NULL;
00291
00292 va_start(pvar, n);
00293
00294 for(i=0;i<n;i++) {
00295 cfilenm=va_arg(pvar,char*);
00296 if(*cfilenm) if(fexist(cfilenm)) return cfilenm;
00297 }
00298 va_end(pvar);
00299 return NULL;
00300 }
00301
00302
00303
00304
00305
00306
00307
00308 char * lcas_findfile(
00309 char * name
00310 )
00311 {
00312 char * newname=NULL;
00313 char * tmpname=NULL;
00314 char * names[5]={NULL,NULL,NULL,NULL,NULL};
00315 int i;
00316
00317 names[0]=lcas_genfilename(NULL,name,NULL);
00318 names[1]=lcas_genfilename("modules",name,NULL);
00319 names[2]=lcas_genfilename(LCAS_ETC_HOME,name,NULL);
00320 names[3]=lcas_genfilename(LCAS_MOD_HOME,name,NULL);
00321 names[4]=lcas_genfilename(LCAS_LIB_HOME,name,NULL);
00322
00323 tmpname=lcas_getfexist(5,names[0],
00324 names[1],names[2],
00325 names[3],names[4]);
00326 if (tmpname != NULL)
00327 newname=strdup(tmpname);
00328 else
00329 newname=NULL;
00330
00331 for (i=0; i < 5; i++)
00332 {
00333 if (names[i] != NULL) free(names[i]);
00334 }
00335
00336 return newname;
00337 }
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359 int lcas_tokenize(
00360 const char * command,
00361 char ** args,
00362 int * n,
00363 char * sep
00364 )
00365 {
00366 int maxargs;
00367 int i;
00368 const char * cp;
00369 const char * pp;
00370 const char * qp;
00371 char ** arg;
00372
00373 arg = args;
00374
00375 i = 0;
00376 maxargs = *n;
00377
00378 cp = command;
00379 while (*cp)
00380 {
00381
00382 while (*cp && strchr(sep, *cp))
00383 {
00384 cp++;
00385 }
00386 pp = NULL;
00387 if (*cp == '\"')
00388 {
00389 cp++;
00390 pp = cp;
00391 if ((qp = strchr(cp,'\"')) == NULL)
00392 {
00393 *n = i;
00394 return -3;
00395 }
00396 cp = qp + 1;
00397 }
00398 else if (*cp)
00399 {
00400 pp = cp;
00401 if ((qp = strpbrk(cp,sep)) == NULL)
00402 {
00403 qp = strchr(cp,'\0');
00404 }
00405 cp = qp;
00406 }
00407 else
00408 {
00409 continue;
00410 }
00411 if (pp)
00412 {
00413
00414
00415
00416 i++;
00417 if (i >= maxargs)
00418 {
00419 i--;
00420 *n = i;
00421 return(-2);
00422 }
00423 *arg = (char*)malloc((qp - pp) + 1);
00424 if (*arg == NULL)
00425 {
00426 i--;
00427 *n = i;
00428 return -1;
00429 }
00430 memcpy(*arg,pp,qp - pp);
00431 *(*arg + (qp - pp)) = '\0';
00432 arg++;
00433 }
00434 }
00435 *arg = NULL;
00436 *n = i;
00437 return(0);
00438 }
00439
00440
00441
00442
00443
00444
00445
00446