/*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 Lev Walkin . * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: cookies.c,v 1.3 2006/12/11 07:11:52 vlm Exp $ */ #include #include #include #include #include #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_TIME_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_ALLOCA_H #include #endif #include int set_cookie(char *name, char *value, char *optDomain, char *optPath, time_t optMaxAge, char *optComment, int optSecure) { if(value == NULL || name == NULL || *name == '\0') { errno = EINVAL; return -1; } printf("Set-Cookie: %s=\"%s\"", name, url_encode(value)); if(optDomain) printf("; Domain=%s", optDomain); if(optPath) printf("; path=\"%s\"", optPath); if(optMaxAge >= 0) printf("; Max-Age=%ld", optMaxAge); if(optComment) printf("; Comment=\"%s\"", html_quote(optComment)); if(optSecure) printf("; Secure"); printf("\n"); return 0; } static svect *_sf_cgi_csla = NULL; static svect *_sf_cgi_cslv = NULL; svect * cookies() { if(_sf_cgi_csla == NULL) cookie(""); return _sf_cgi_csla; } char * cookie(char *name) { if(name == NULL) { errno = EINVAL; return NULL; } if(_sf_cgi_csla == NULL) { char *p, *s, *pt; pt=getenv("HTTP_COOKIE"); if(pt == NULL || *pt == '\0') { /* No cookies */ errno = ESRCH; return NULL; } p = (char *)alloca(strlen(pt) + 1); if(p == NULL) { errno = EINVAL; return NULL; } strcpy(p, pt); _sf_cgi_csla = sinit(); if(_sf_cgi_csla == NULL) /* ENOMEM? */ return NULL; _sf_cgi_cslv = sinit(); if(_sf_cgi_cslv == NULL) /* ENOMEM? */ return NULL; for(s=p; *p; p++) { if(*p == '=') { *p++='\0'; if(sadd(_sf_cgi_csla, s) == -1) { sfree(_sf_cgi_csla); sfree(_sf_cgi_cslv); _sf_cgi_csla = NULL; _sf_cgi_cslv = NULL; /* ENOMEM? */ return NULL; } s=p; if(*s == '"') p=strchr(++s, '"'); else p=strchr(s, ';'); if(p == NULL) p=strrchr(s, '\0'); *p++ = 0; if( sadd(_sf_cgi_cslv, url_decode(s)) == -1 ) { sfree(_sf_cgi_csla); sfree(_sf_cgi_cslv); _sf_cgi_csla = NULL; _sf_cgi_cslv = NULL; /* ENOMEM? */ return NULL; } if(*p == '"') p++; if(*p == ';') p++; while(*p == ' ') p++; s=p; } } } if(_sf_cgi_csla->count == 0) { errno = ESRCH; return NULL; } return scget2(_sf_cgi_csla, name, _sf_cgi_cslv); }