gridsite.h
Go to the documentation of this file.
00001 /*
00002    Copyright (c) 2002-10, Andrew McNab, University of Manchester
00003    All rights reserved.
00004 
00005    Redistribution and use in source and binary forms, with or
00006    without modification, are permitted provided that the following
00007    conditions are met:
00008 
00009      o Redistributions of source code must retain the above
00010        copyright notice, this list of conditions and the following
00011        disclaimer. 
00012      o Redistributions in binary form must reproduce the above
00013        copyright notice, this list of conditions and the following
00014        disclaimer in the documentation and/or other materials
00015        provided with the distribution. 
00016 
00017    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
00018    CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
00019    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00020    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00021    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
00022    BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00023    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
00024    TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00025    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
00026    ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00027    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00028    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00029    POSSIBILITY OF SUCH DAMAGE.
00030 */
00031 
00032 /*---------------------------------------------------------------*
00033  * For more about GridSite: http://www.gridsite.org/             *
00034  *---------------------------------------------------------------*/
00035 
00036 #ifndef HEADER_GRIDSITE_H
00037 #define HEADER_GRIDSITE_H
00038 
00039 #ifndef GRST_VERSION
00040 #define GRST_VERSION 010500
00041 #endif
00042 
00043 #ifdef __cplusplus
00044 extern "C" {
00045 #endif
00046 
00047 #ifndef GRST_NO_OPENSSL
00048 
00049 #ifndef HEADER_SSL_H
00050 #include <openssl/ssl.h>
00051 #endif
00052 
00053 #ifndef HEADER_CRYPTO_H
00054 #include <openssl/crypto.h>
00055 #endif
00056 
00057 #endif
00058 
00059 #ifndef _TIME_H
00060 #include <time.h>
00061 #endif
00062 
00063 #ifndef _STDIO_H
00064 #include <stdio.h>
00065 #endif
00066 
00067 #ifndef _STDINT_H
00068 #include <stdint.h>
00069 #endif
00070 
00071 #ifndef FALSE
00072 #define FALSE (0)
00073 #endif
00074 #ifndef TRUE
00075 #define TRUE (!FALSE)
00076 #endif
00077 
00078 // Everything ok (= OpenSSL X509_V_OK)
00079 #define GRST_RET_OK             0
00080 
00081 // Failed for unspecified reason
00082 #define GRST_RET_FAILED         1000
00083 
00084 // Failed to find certificate in some cert store / directory
00085 #define GRST_RET_CERT_NOT_FOUND 1001
00086 
00087 // Bad signature
00088 #define GRST_RET_BAD_SIGNATURE  1002
00089 
00090 // No such file or directory
00091 #define GRST_RET_NO_SUCH_FILE   1003
00092 
00093 /* We use && now rather than if so this macro can be used inside if...else
00094    but that means the function must return an int rather than be void */
00095 #define GRSTerrorLog(GRSTerrorLevel, ...) ((GRSTerrorLogFunc != NULL) && ((GRSTerrorLogFunc)(__FILE__, __LINE__, GRSTerrorLevel, __VA_ARGS__)))
00096 
00097 extern int (*GRSTerrorLogFunc)(char *, int, int, char *, ...);
00098 
00099 /* these levels are the same as Unix syslog() and Apache ap_log_error() */
00100 
00101 #define GRST_LOG_EMERG   0
00102 #define GRST_LOG_ALERT   1
00103 #define GRST_LOG_CRIT    2
00104 #define GRST_LOG_ERR     3
00105 #define GRST_LOG_WARNING 4
00106 #define GRST_LOG_NOTICE  5
00107 #define GRST_LOG_INFO    6
00108 #define GRST_LOG_DEBUG   7
00109 
00110 #define GRST_MAX_TIME_T  INT32_MAX
00111 
00112 typedef struct { char                      *auri;
00113                  int                        delegation;
00114                  int                        nist_loa;
00115                  time_t                     notbefore;
00116                  time_t                     notafter;
00117                  void                      *next;     } GRSTgaclCred;
00118 
00119 /* used by pre-AURI GRSTgaclCred structs */ 
00120 __attribute__ ((deprecated))
00121 typedef struct { char                      *name;
00122                  char                      *value;
00123                  void                      *next;  } GRSTgaclNamevalue;
00124 
00125 typedef int                GRSTgaclAction;
00126 typedef unsigned int       GRSTgaclPerm;
00127  
00128 typedef struct { GRSTgaclCred   *firstcred;
00129                  GRSTgaclPerm    allowed;
00130                  GRSTgaclPerm    denied;
00131                  void           *next;    } GRSTgaclEntry;
00132  
00133 typedef struct { GRSTgaclEntry *firstentry; } GRSTgaclAcl;
00134  
00135 typedef struct { GRSTgaclCred *firstcred; char *dnlists; } GRSTgaclUser;
00136 
00137 #define GRST_PERM_NONE   0
00138 #define GRST_PERM_READ   1
00139 #define GRST_PERM_EXEC   2
00140 #define GRST_PERM_LIST   4
00141 #define GRST_PERM_WRITE  8
00142 #define GRST_PERM_ADMIN 16
00143 #define GRST_PERM_ALL   31
00144 
00145 /* DO NOT USE PermIsNone!! */
00146 #define GRSTgaclPermIsNone(perm)    ((perm) == 0)
00147 
00148 #define GRSTgaclPermHasNone(perm)    ((perm) == 0)
00149 #define GRSTgaclPermHasRead(perm)  (((perm) & GRST_PERM_READ ) != 0)
00150 #define GRSTgaclPermHasExec(perm)  (((perm) & GRST_PERM_EXEC ) != 0)
00151 #define GRSTgaclPermHasList(perm)  (((perm) & GRST_PERM_LIST ) != 0)
00152 #define GRSTgaclPermHasWrite(perm) (((perm) & GRST_PERM_WRITE) != 0)
00153 #define GRSTgaclPermHasAdmin(perm) (((perm) & GRST_PERM_ADMIN) != 0)
00154 
00155 #define GRST_ACTION_ALLOW 0
00156 #define GRST_ACTION_DENY  1
00157 
00158 #define GRST_HIST_PREFIX  ".grsthist"
00159 #define GRST_ACL_FILE     ".gacl"
00160 #define GRST_DN_LISTS     "/etc/grid-security/dn-lists"
00161 #define GRST_RECURS_LIMIT 9
00162 
00163 #define GRST_PROXYCERTINFO_OLD_OID      "1.3.6.1.4.1.3536.1.222"
00164 #define GRST_PROXYCERTINFO_OID          "1.3.6.1.5.5.7.1.14"
00165 #define GRST_VOMS_OID           "1.3.6.1.4.1.8005.100.100.5"
00166 #define GRST_VOMS_PK_CERT_LIST_OID      "1.3.6.1.4.1.8005.100.100.10"
00167 #define GRST_VOMS_DIR           "/etc/grid-security/vomsdir"
00168 #define GRST_KEYUSAGE_OID       "2.5.29.15"
00169 
00170 #define GRST_ASN1_MAXCOORDLEN   50
00171 #define GRST_ASN1_MAXTAGS       500
00172 
00173 struct GRSTasn1TagList { char treecoords[GRST_ASN1_MAXCOORDLEN+1];
00174                          int  start;
00175                          int  headerlength;
00176                          int  length;
00177                          int  tag; } ;
00178 
00179 #define GRST_X509_SERIAL_DIGITS 49
00180 
00181 typedef struct { int    type;           /* CA, user, proxy, VOMS, ... */
00182                  int    errors;         /* unchecked, bad sig, bad time */
00183                  char   *issuer;        /* Cert CA DN, EEC of PC, or VOMS DN */
00184                  char   *dn;            /* Cert DN, or VOMS AC holder DN */
00185                  char   *value;         /* VOMS FQAN or NULL */
00186                  time_t notbefore;
00187                  time_t notafter;
00188                  int    delegation;     /* relative to END of any chain */
00189                  char   serial[GRST_X509_SERIAL_DIGITS+1];
00190                  char   *ocsp;          /* accessLocation field */
00191                  void   *raw;           /* X509 or VOMS Extension object */
00192                  void   *next; } GRSTx509Cert;
00193 
00194 #define GRST_CERT_BAD_FORMAT 1
00195 #define GRST_CERT_BAD_CHAIN  2
00196 #define GRST_CERT_BAD_SIG    4
00197 #define GRST_CERT_BAD_TIME   8
00198 #define GRST_CERT_BAD_OCSP  16
00199 
00200 #define GRST_CERT_TYPE_CA    1
00201 #define GRST_CERT_TYPE_EEC   2
00202 #define GRST_CERT_TYPE_PROXY 3
00203 #define GRST_CERT_TYPE_VOMS  4
00204 
00205 /* a chain of certs, starting from the first CA */
00206 typedef struct { GRSTx509Cert *firstcert; } GRSTx509Chain;
00207 
00208 #ifndef GRST_NO_OPENSSL
00209 int GRSTx509CertLoad(GRSTx509Cert *, X509 *);
00210 int GRSTx509ChainLoadCheck(GRSTx509Chain **, STACK_OF(X509) *, X509 *, char *, char *);
00211 #endif
00212 int GRSTx509ChainFree(GRSTx509Chain *);
00213 
00214 #define GRST_HTTP_PORT          777
00215 #define GRST_HTTPS_PORT         488
00216 #define GRST_HTCP_PORT          777
00217 #define GRST_GSIFTP_PORT        2811
00218                          
00219 #define GRSThtcpNOPop 0
00220 #define GRSThtcpTSTop 1
00221 
00222 typedef struct { unsigned char length_msb;
00223                  unsigned char length_lsb;
00224                  char text[1]; } GRSThtcpCountstr;
00225 
00226 #define GRSThtcpCountstrLen(string) (256*((string)->length_msb) + (string)->length_lsb)
00227 
00228 typedef struct { unsigned char total_length_msb;
00229                  unsigned char total_length_lsb;
00230                  unsigned char version_msb;
00231                  unsigned char version_lsb;
00232                  unsigned char data_length_msb;
00233                  unsigned char data_length_lsb;
00234                  unsigned int  response : 4;
00235                  unsigned int  opcode   : 4;
00236                  unsigned int  rr       : 1;                 
00237                  unsigned int  f1       : 1;
00238                  unsigned int  reserved : 6;
00239                  unsigned int  trans_id;        /* must be 4 bytes */
00240                  GRSThtcpCountstr *method;
00241                  GRSThtcpCountstr *uri;
00242                  GRSThtcpCountstr *version;
00243                  GRSThtcpCountstr *req_hdrs;
00244                  GRSThtcpCountstr *resp_hdrs;
00245                  GRSThtcpCountstr *entity_hdrs;
00246                  GRSThtcpCountstr *cache_hdrs;   } GRSThtcpMessage;
00247 
00248 int GRSTgaclInit(void);
00249 
00250 __attribute__ ((deprecated))
00251 GRSTgaclCred *GRSTgaclCredNew(char *);
00252 
00253 GRSTgaclCred *GRSTgaclCredCreate(char *, char *);
00254 
00255 __attribute__ ((deprecated))
00256 int     GRSTgaclCredAddValue(GRSTgaclCred *, char *, char *);
00257 
00258 #define GRSTgaclCredGetAuri(cred) ((cred)->auri)
00259 
00260 #define GRSTgaclCredSetNotBefore(cred, time) ((cred)->notbefore = (time))
00261 #define GRSTgaclCredGetNotBefore(cred) ((cred)->notbefore)
00262 
00263 #define GRSTgaclCredSetNotAfter(cred, time) ((cred)->notafter = (time))
00264 #define GRSTgaclCredGetNotAfter(cred) ((cred)->notafter)
00265 
00266 #define GRSTgaclCredSetDelegation(cred, level) ((cred)->delegation = (level))
00267 #define GRSTgaclCredGetDelegation(cred) ((cred)->delegation)
00268 
00269 #define GRSTgaclCredSetNistLoa(cred, level) ((cred)->nist_loa = (level))
00270 #define GRSTgaclCredGetNistLoa(cred) ((cred)->nist_loa)
00271 
00272 /* #define GACLfreeCred(x)              GRSTgaclCredFree((x)) */
00273 int        GRSTgaclCredFree(GRSTgaclCred *);
00274 
00275 /*  #define GACLaddCred(x,y)    GRSTgaclEntryAddCred((x),(y)) */
00276 int        GRSTgaclEntryAddCred(GRSTgaclEntry *, GRSTgaclCred *);
00277 
00278 /*  #define GACLdelCred(x,y)    GRSTgaclEntryDelCred((x),(y)) */
00279 int        GRSTgaclEntryDelCred(GRSTgaclEntry *, GRSTgaclCred *);
00280 
00281 /*  #define GACLprintCred(x,y)  GRSTgaclCredPrint((x),(y)) */
00282 int        GRSTgaclCredCredPrint(GRSTgaclCred *, FILE *);
00283 
00284 int        GRSTgaclCredCmpAuri(GRSTgaclCred *, GRSTgaclCred *);
00285 
00286 /*  #define GACLnewEntry(x)             GRSTgaclEntryNew((x)) */
00287 GRSTgaclEntry *GRSTgaclEntryNew(void);
00288 
00289 /*  #define GACLfreeEntry(x)    GRSTgaclEntryFree((x)) */
00290 int        GRSTgaclEntryFree(GRSTgaclEntry *);
00291 
00292 /*  #define GACLaddEntry(x,y)   GRSTgaclAclAddEntry((x),(y)) */
00293 int        GRSTgaclAclAddEntry(GRSTgaclAcl *, GRSTgaclEntry *);
00294 
00295 /*  #define GACLprintEntry(x,y) GRSTgaclEntryPrint((x),(y)) */
00296 int        GRSTgaclEntryPrint(GRSTgaclEntry *, FILE *);
00297 
00298 
00299 /*  #define GACLprintPerm(x,y)  GRSTgaclPermPrint((x),(y)) */
00300 int        GRSTgaclPermPrint(GRSTgaclPerm, FILE *);
00301 
00302 /*  #define GACLallowPerm(x,y)  GRSTgaclEntryAllowPerm((x),(y)) */
00303 int        GRSTgaclEntryAllowPerm(GRSTgaclEntry *, GRSTgaclPerm);
00304 
00305 /*  #define GACLunallowPerm(x,y)        GRSTgaclEntryUnallowPerm((x),(y)) */
00306 int        GRSTgaclEntryUnallowPerm(GRSTgaclEntry *, GRSTgaclPerm);
00307 
00308 /*  #define GACLdenyPerm(x,y)   GRSTgaclEntryDenyPerm((x),(y)) */
00309 int        GRSTgaclEntryDenyPerm(GRSTgaclEntry *, GRSTgaclPerm);
00310 
00311 /*  #define GACLundenyPerm(x,y) GRSTgaclEntryUndenyPerm((x),(y)) */
00312 int        GRSTgaclEntryUndenyPerm(GRSTgaclEntry *, GRSTgaclPerm);
00313 
00314 /*  #define GACLpermToChar(x)   GRSTgaclPermToChar((x)) */
00315 char      *GRSTgaclPermToChar(GRSTgaclPerm);
00316 
00317 /*  #define GACLcharToPerm(x)   GRSTgaclPermFromChar((x)) */
00318 GRSTgaclPerm   GRSTgaclPermFromChar(char *);
00319 
00320 /*  #define GACLnewAcl(x)               GRSTgaclAclNew((x)) */
00321 GRSTgaclAcl   *GRSTgaclAclNew(void);
00322 
00323 /*  #define GACLfreeAcl(x)              GRSTgaclAclFree((x)) */
00324 int        GRSTgaclAclFree(GRSTgaclAcl *);
00325 
00326 /*  #define GACLprintAcl(x,y)   GRSTgaclAclPrint((x),(y)) */
00327 int        GRSTgaclAclPrint(GRSTgaclAcl *, FILE *);
00328 
00329 /*  #define GACLsaveAcl(x,y)    GRSTgaclAclSave((y),(x)) */
00330 int        GRSTgaclAclSave(GRSTgaclAcl *, char *);
00331 
00332 /*  #define GACLloadAcl(x)              GRSTgaclFileLoadAcl((x)) */
00333 GRSTgaclAcl   *GRSTgaclAclLoadFile(char *);
00334 
00335 /*  #define GACLfindAclForFile(x)       GRSTgaclFileFindAclname((x)) */
00336 char      *GRSTgaclFileFindAclname(char *);
00337 
00338 /*  #define GACLloadAclForFile(x)       GRSTgaclFileLoadAcl((x)) */
00339 GRSTgaclAcl   *GRSTgaclAclLoadforFile(char *);
00340 
00341 /*  #define GACLisAclFile(x)    GRSTgaclFileIsAcl((x)) */
00342 int        GRSTgaclFileIsAcl(char *);
00343 
00344 
00345 /*  #define GACLnewUser(x)              GRSTgaclUserNew((x)) */
00346 GRSTgaclUser *GRSTgaclUserNew(GRSTgaclCred *);
00347 
00348 /*  #define GACLfreeUser(x)             GRSTgaclUserFree((x)) */
00349 int       GRSTgaclUserFree(GRSTgaclUser *);
00350 
00351 /*  #define GACLuserAddCred(x,y)        GRSTgaclUserAddCred((x),(y)) */
00352 int       GRSTgaclUserAddCred(GRSTgaclUser *, GRSTgaclCred *);
00353 
00354 /*  #define GACLuserHasCred(x,y)        GRSTgaclUserHasCred((x),(y)) */
00355 int       GRSTgaclUserHasCred(GRSTgaclUser *, GRSTgaclCred *);
00356 
00357 __attribute__ ((deprecated))
00358 int       GRSTgaclUserSetDNlists(GRSTgaclUser *, char *);
00359 
00360 int       GRSTgaclUserLoadDNlists(GRSTgaclUser *, char *);
00361 
00362 /*  #define GACLuserFindCredType(x,y) GRSTgaclUserFindCredtype((x),(y)) */
00363 GRSTgaclCred *GRSTgaclUserFindCredtype(GRSTgaclUser *, char *);
00364 
00365 __attribute__ ((deprecated))
00366 int GRSTgaclDNlistHasUser(char *, GRSTgaclUser *);
00367 
00368 int GRSTgaclUserHasAURI(GRSTgaclUser *, char *);
00369 
00370 /*  #define GACLtestUserAcl(x,y)        GRSTgaclAclTestUser((x),(y)) */
00371 GRSTgaclPerm   GRSTgaclAclTestUser(GRSTgaclAcl *, GRSTgaclUser *);
00372 
00373 /*  #define GACLtestExclAcl(x,y)        GRSTgaclAclTestexclUser((x),(y)) */
00374 GRSTgaclPerm   GRSTgaclAclTestexclUser(GRSTgaclAcl *, GRSTgaclUser *);
00375 
00376 char      *GRSThttpUrlDecode(char *);
00377 
00378 /*  #define GACLurlEncode(x)    GRSThttpUrlEncode((x)) */
00379 char      *GRSThttpUrlEncode(char *);
00380 
00381 /*  #define GACLmildUrlEncode(x)        GRSThttpMildUrlEncode((x)) */
00382 char      *GRSThttpUrlMildencode(char *);
00383 
00384 int GRSTx509NameCmp(char *, char *);
00385 
00386 #ifndef GRST_NO_OPENSSL
00387 int GRSTx509KnownCriticalExts(X509 *);
00388 
00389 int GRSTx509IsCA(X509 *);
00390 int GRSTx509CheckChain(int *, X509_STORE_CTX *);
00391 int GRSTx509VerifyCallback(int, X509_STORE_CTX *);
00392 
00393 __attribute__ ((deprecated))
00394 int GRSTx509GetVomsCreds(int *, int, size_t, char *, X509 *, STACK_OF(X509) *, char *);
00395 
00396 __attribute__ ((deprecated))
00397 GRSTgaclCred *GRSTx509CompactToCred(char *);
00398 
00399 __attribute__ ((deprecated))
00400 int GRSTx509CompactCreds(int *, int, size_t, char *, STACK_OF(X509) *, char *, X509 *);
00401 #endif 
00402 
00403 char *GRSTx509CachedProxyFind(char *, char *, char *);
00404 char *GRSTx509FindProxyFileName(void);
00405 int GRSTx509MakeProxyCert(char **, FILE *, char *, char *, char *, int);
00406 char *GRSTx509CachedProxyKeyFind(char *, char *, char *);
00407 int GRSTx509ProxyDestroy(char *, char *, char *);
00408 int GRSTx509ProxyGetTimes(char *, char *, char *, time_t *, time_t *);
00409 int GRSTx509CreateProxyRequest(char **, char **, char *);
00410 int GRSTx509MakeProxyRequest(char **, char *, char *, char *);
00411 
00412 char *GRSTx509MakeDelegationID(void);
00413 
00414 #ifndef GRST_NO_OPENSSL
00415 int GRSTx509StringToChain(STACK_OF(X509) **, char *);
00416 char *GRSTx509MakeProxyFileName(char *, STACK_OF(X509) *);
00417 #endif
00418 
00419 int GRSTx509CacheProxy(char *, char *, char *, char *);
00420 
00421 #define GRST_HEADFILE   "gridsitehead.txt"
00422 #define GRST_FOOTFILE   "gridsitefoot.txt"
00423 #define GRST_ADMIN_FILE "gridsite-admin.cgi"
00424 
00425 typedef struct { char *text;
00426                  void *next; } GRSThttpCharsList;
00427 
00428 typedef struct { size_t             size;
00429                  GRSThttpCharsList *first;
00430                  GRSThttpCharsList *last;  } GRSThttpBody;
00431 
00432 void  GRSThttpBodyInit(GRSThttpBody *); 
00433 void  GRSThttpPrintf(GRSThttpBody *, char *, ...);
00434 int   GRSThttpCopy(GRSThttpBody *, char *);
00435 void  GRSThttpWriteOut(GRSThttpBody *);
00436 int   GRSThttpPrintHeaderFooter(GRSThttpBody *, char *, char *);
00437 int   GRSThttpPrintHeader(GRSThttpBody *, char *);
00438 int   GRSThttpPrintFooter(GRSThttpBody *, char *);
00439 char *GRSThttpGetCGI(char *);
00440 
00441 time_t GRSTasn1TimeToTimeT(char *, size_t);
00442 int    GRSTasn1SearchTaglist(struct GRSTasn1TagList taglist[], int, char *);
00443 #ifndef GRST_NO_OPENSSL
00444 int    GRSTasn1ParseDump(BIO *, unsigned char *, long,
00445                          struct GRSTasn1TagList taglist[], int, int *);
00446 #endif
00447 int    GRSTasn1GetX509Name(char *, int, char *, char *,
00448                            struct GRSTasn1TagList taglist[], int);
00449 
00450 int    GRSThtcpNOPrequestMake(char **, int *, unsigned int);
00451 int    GRSThtcpNOPresponseMake(char **, int *, unsigned int);
00452 int    GRSThtcpTSTrequestMake(char **, int *, unsigned int, char *, char *, char *);
00453 int    GRSThtcpTSTresponseMake(char **, int *, unsigned int, char *, char *, char *);
00454 int    GRSThtcpMessageParse(GRSThtcpMessage *, char *, int);
00455 
00456 #ifndef GRST_PASSCODE_JS
00457 //#define __GRST_PASSCODE_JS__
00458 #define GRST_PASSCODE_JS "<script type=\"text/javascript\" language=\"Javascript\"><!--\nfunction changeValue(formName){        if( document.forms[formName].passcode.value==\"\" ) document.forms[formName].passcode.value=getCookie(\"GRIDHTTP_PASSCODE\");       return true;   } \nfunction getCookie(c_name){ if (document.cookie.length>0)  {  c_start=document.cookie.indexOf(c_name + \"=\");  if (c_start!=-1)    {    c_start=c_start + c_name.length+1;    c_end=document.cookie.indexOf(\";\",c_start);    if (c_end==-1) c_end=document.cookie.length;    return unescape(document.cookie.substring(c_start,c_end)); }} return \"\"; } \n -->\n</script>"
00459 #endif
00460 
00461 #ifdef __cplusplus
00462 } // extern "C"
00463 #endif
00464 
00465 #endif // HEADER_GRIDSITE_H