static size_t init_environment()

in modules/fcgid/fcgid_protocol.c [25:86]


static size_t init_environment(char *buf, char **envp)
{
    char *spliter;
    apr_size_t namelen, valuelen;
    char *cur_buf = buf;
    size_t buffer_size = 0;

    for (; *envp != NULL; envp++) {
        spliter = strchr(*envp, '=');
        if (spliter == NULL)
            continue;

        namelen = spliter - *envp;
        valuelen = strlen(spliter + 1);

        /* Put name length to buffer */
        if (namelen < 0x80) {
            if (!buf)
                buffer_size++;
            else
                *cur_buf++ = (unsigned char) namelen;
        } else {
            if (!buf)
                buffer_size += 4;
            else {
                *cur_buf++ = (unsigned char) ((namelen >> 24) | 0x80);
                *cur_buf++ = (unsigned char) (namelen >> 16);
                *cur_buf++ = (unsigned char) (namelen >> 8);
                *cur_buf++ = (unsigned char) namelen;
            }
        }

        /* Put value length to buffer */
        if (valuelen < 0x80) {
            if (!buf)
                buffer_size++;
            else
                *cur_buf++ = (unsigned char) valuelen;
        } else {
            if (!buf)
                buffer_size += 4;
            else {
                *cur_buf++ = (unsigned char) ((valuelen >> 24) | 0x80);
                *cur_buf++ = (unsigned char) (valuelen >> 16);
                *cur_buf++ = (unsigned char) (valuelen >> 8);
                *cur_buf++ = (unsigned char) valuelen;
            }
        }

        /* Now the name and body buffer */
        if (!buf) {
            buffer_size += namelen;
            buffer_size += valuelen;
        } else {
            memcpy(cur_buf, *envp, namelen);
            cur_buf += namelen;
            memcpy(cur_buf, spliter + 1, valuelen);
            cur_buf += valuelen;
        }
    }
    return buffer_size;
}