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