aboutsummaryrefslogtreecommitdiffstats
path: root/src/libtipidee/tipidee_fcgi_addenv.c
blob: fb9e85905f0fcfb574e41073e2a5719702a4fc2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* ISC license. */

#include <errno.h>

#include <skalibs/uint32.h>
#include <skalibs/stralloc.h>

#include <tipidee/fcgi.h>

static int encode (stralloc *sa, size_t n)
{
  if (n <= 0x7f)
  {
    char c = n ;
    return stralloc_catb(sa, &c, 1) ;
  }
  else if (n < 0x7ffffffful)
  {
    char pack[4] ;
    uint32_pack_big(pack, n | 0x80000000) ;
    return stralloc_catb(sa, pack, 4) ;
  }
  else return (errno = EOVERFLOW, 0) ;
}

int tipidee_fcgi_addenvb (stralloc *sa, char const *key, size_t keylen, char const *val, size_t vallen)
{
  size_t start = sa->len ;
  if (!encode(sa, keylen)) return 0 ;
  if (!encode(sa, vallen)
    || !stralloc_catb(sa, key, keylen)
    || !stralloc_catb(sa, val, vallen)) goto err ;
  if (sa->len > 0x7fff) goto err0 ;
  return 1 ;

 err0:
  errno = E2BIG ;
 err:
  sa->len = start ;
  return 0 ;
}