Back to index

courier  0.68.2
cgicookie.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 2007 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 */
00005 
00006 /*
00007 */
00008 
00009 #include      "cgi.h"
00010 #include      <stdio.h>
00011 #include      <string.h>
00012 #include      <stdlib.h>
00013 #include      <ctype.h>
00014 
00015 extern void error(const char *);
00016 
00017 static void enomem()
00018 {
00019        error("Out of memory.");
00020 }
00021 
00022 char   *cgi_cookie(const char *p)
00023 {
00024 size_t pl=strlen(p);
00025 const char *c=getenv("HTTP_COOKIE");
00026 char   *buf;
00027 
00028        while (c && *c)
00029        {
00030        size_t i;
00031 
00032               for (i=0; c[i] && c[i] != '='; i++)
00033                      ;
00034               if (i == pl && strncmp(p, c, i) == 0)
00035               {
00036                      c += i;
00037                      if (*c)       ++c;   /* skip over = */
00038                      for (i=0; c[i] && c[i] != ';'; i++)
00039                             ;
00040 
00041                      buf=malloc(i+1);
00042                      if (!buf)     enomem();
00043                      memcpy(buf, c, i);
00044                      buf[i]=0;
00045                      cgiurldecode(buf);
00046                      return (buf);
00047               }
00048               c=strchr(c, ';');
00049               if (c)
00050                      do
00051                      {
00052                             ++c;
00053                      } while (isspace((int)(unsigned char)*c));
00054        }
00055        buf=malloc(1);
00056        if (!buf)     enomem();
00057        *buf=0;
00058        return (buf);
00059 }
00060 
00061 void cgi_setcookie(const char *name, const char *value)
00062 {
00063 char   *p;
00064 const  char *sn;
00065 
00066        p=cgiurlencode(value);
00067        sn=getenv("SCRIPT_NAME");
00068        if (!sn || !*sn)
00069               sn="/";
00070        printf("Set-Cookie: %s=%s; path=%s\n", name, value, sn);
00071        free(p);
00072 }