/* Public domain */ #define CGI_SESSION_ID_MAX 33 #define CGI_SESSION_VAR_KEY_MAX 32 #define CGI_SESSION_VAR_VALUE_MAX 1024 #define CGI_SESSION_DATA_MAGIC 0x50657243 #define CGI_SESSION_VARIABLES_MAX 100 #define CGI_SESSION_DATA_MAX 4096 struct cgi_session; typedef struct cgi_session_ops { const char *name; /* Session class name */ size_t size; /* Structure size */ Uint flags; #define CGI_SESSION_PREFORK_AUTH 0x01 /* Call auth() before fork() */ time_t sessTimeout; /* Session inactivity timeout (s) */ time_t workerTimeout; /* Worker inactivity timeout (s) */ void (*init)(void *); void (*destroy)(void *); int (*load)(void *, int fd); void (*save)(void *, int fd); int (*auth)(void *, const char *u, const char *p); void (*authChallenge)(CGI_Query *q); const char *authChallengeName; void (*authRegister)(CGI_Query *q); const char *authRegisterName; void (*authRegConfirm)(CGI_Query *q); const char *authRegConfirmName; void (*authAssist)(CGI_Query *q); const char *authAssistName; void (*authRequest)(CGI_Query *q); const char *authRequestName; void (*authConfirm)(CGI_Query *q); const char *authConfirmName; void (*authCommit)(CGI_Query *q); const char *authCommitName; void (*authCmd)(CGI_Query *q); const char *authCmdName; int (*sessOpen)(void *s, const char *user); void (*sessRestored)(void *s, const char *user); void (*sessClose)(void *s); void (*sessExpired)(void *s); void (*beginQueryUnauth)(CGI_Query *q, const char *op); void (*loginPage)(CGI_Query *q); void (*logout)(CGI_Query *q); void (*addSelectFDs)(void *s, fd_set *rd, fd_set *wr, int *maxfds); void (*procSelectFDs)(void *s, fd_set *rd, fd_set *wr); } CGI_SessionOps; typedef struct cgi_session_var { char key[CGI_SESSION_VAR_KEY_MAX]; /* Variable name */ char value[CGI_SESSION_VAR_VALUE_MAX]; /* Variable value */ TAILQ_ENTRY(cgi_session_var) vars; } CGI_SessionVar; typedef struct cgi_session { CGI_SessionOps *ops; /* Operations */ char id[CGI_SESSION_ID_MAX]; /* Session identifier */ TAILQ_HEAD(, cgi_session_var) vars; /* Session variables */ TAILQ_ENTRY(cgi_session) sessions; pid_t worker; /* Spawned worker PID */ int pp[2]; /* Status pipe */ } CGI_Session; #define CGISESSION(p) ((CGI_Session *)(p)) TAILQ_HEAD(cgi_sessionq, cgi_session); typedef int (*CGI_SessionAuthFn)(void *, CGI_Query *, const char *, const char *); __BEGIN_DECLS int CGI_SessionMgrInit(void); void CGI_SessionMgrDestroy(void); void CGI_SessionInit(CGI_Session *, CGI_SessionOps *); void CGI_SessionDestroy(CGI_Session *); void CGI_CloseSession(CGI_Session *); int CGI_SessionLoad(void *, int); int CGI_SessionSaveToFD(void *, int); #define CGI_SessionSave(sess) CGI_SessionSaveToFD((sess),-1) int CGI_SetSV_ALL(CGI_SessionOps *, const char *, const char *, const char *); void CGI_SetSV(void *, const char *, const char *, ...); void CGI_SetSV_S(void *, const char *, const char *); int CGI_ExecQuery(CGI_Query *, CGI_SessionOps *); void CGI_ProcessQuery(CGI_Query *, CGI_SessionOps *); /* Return the value of a session variable (or "" if it doesn't exists) */ static __inline__ const char * CGI_GetSV(void *pSess, const char *key) { CGI_Session *sess = pSess; CGI_SessionVar *var; TAILQ_FOREACH(var, &sess->vars, vars) { if (strcmp(var->key, key) == 0) break; } if (var != NULL) { return (var->value); } else { return (""); } } __END_DECLS #if defined(_PERCGI_INTERNAL) || defined(_USE_PERCGI_VAR) #define GetSV CGI_GetSV #define SetSV CGI_SetSV #define SetSV_S CGI_SetSV_S #endif