📄 gcgi.c
字号:
parseToken(cookie, name, &encoded); tokenizeURLString(encoded, strlen(encoded), &tokens); gcgiDecodeBaseSixtyFourString(tokens[0], &ciphertext, &ctlen); decryptString(ciphertext, ctlen, key, &decoded, &size); gcgiDecodeBaseSixtyFourString(tokens[1], &cdigest, &cdlen); generateStringHMAC(ciphertext, ctlen, &digest, &dlen); if (dlen != cdlen && strncmp(digest, cdigest, dlen) != 0) return GCGIBADDATA; size++; decoded = XREALLOC(char, decoded, size); decoded[size-1] = '\0'; *value = decoded; freeStringArray(tokens); XFREE(encoded); XFREE(ciphertext); XFREE(digest); XFREE(cdigest); return GCGISUCCESS;}gcgiReturnType gcgiGenerateKey(unsigned char **key){ *key = generateKey(); return GCGISUCCESS;}gcgiReturnType gcgiWriteKeyToFile(unsigned char *key, char *path){ if (writeKeyToFile(key, path) < 0) return GCGIFATALERROR; return GCGISUCCESS;}gcgiReturnType gcgiReadKeyFromFile(char *path, unsigned char **key){ if (readKeyFromFile(path, key) < 0) return GCGIFATALERROR; return GCGISUCCESS;}#endifgcgiReturnTypegcgiNumFormFields(int *ret){ *ret = cgiQuery->queryCount; return GCGISUCCESS;}gcgiReturnTypegcgiNumFields(char *field, int *ret){ int i; if (findQueryStringColl(field, &i) == GCGIFIELDNOTFOUND) { *ret = 0; return GCGIFIELDNOTFOUND; } *ret = cgiQuery->query[i]->num; return GCGISUCCESS;}gcgiReturnType gcgiFetchInteger(char *field, int *ret, int defaultRet){ int i; QueryStringNode *qs; if (findQueryStringNodeFirst(field, &qs) == GCGIFIELDNOTFOUND) { *ret = defaultRet; return GCGIFIELDNOTFOUND; } if (qs->size <= 1 && qs->data[0] == '\0') { *ret = defaultRet; return GCGIFIELDEMPTY; } i = strtol(qs->data,NULL,10); if (errno == ERANGE) { *ret = defaultRet; return GCGIBADDATA; } else *ret = i; return GCGISUCCESS;}gcgiReturnType gcgiFetchIntegerNext(char *field, int *ret, int defaultRet){ int i; QueryStringNode *qs; if (findQueryStringNode(field, &qs) == GCGIFIELDNOTFOUND) { *ret = defaultRet; return GCGIFIELDNOTFOUND; } if (qs->size <= 1 && qs->data[0] == '\0') { *ret = defaultRet; return GCGIFIELDEMPTY; } i = strtol(qs->data,NULL,10); if (errno == ERANGE) { *ret = defaultRet; return GCGIBADDATA; } else *ret = i; return GCGISUCCESS;}gcgiReturnType gcgiFetchDouble(char *field, double *ret, double defaultRet){ double i; QueryStringNode *qs; if (findQueryStringNodeFirst(field, &qs) == GCGIFIELDNOTFOUND) { *ret = defaultRet; return GCGIFIELDNOTFOUND; } if (qs->size <= 1 && qs->data[0] == '\0') { *ret = defaultRet; return GCGIFIELDEMPTY; } i = strtod(qs->data, NULL); if (errno == ERANGE) { *ret = defaultRet; return GCGIBADDATA; } else *ret = i; return GCGISUCCESS;}gcgiReturnType gcgiFetchDoubleNext(char *field, double *ret, double defaultRet){ double i; QueryStringNode *qs; if (findQueryStringNode(field, &qs) == GCGIFIELDNOTFOUND) { *ret = defaultRet; return GCGIFIELDNOTFOUND; } if (qs->size <= 1 && qs->data[0] == '\0') { *ret = defaultRet; return GCGIFIELDEMPTY; } i = strtod(qs->data, NULL); if (errno == ERANGE) { *ret = defaultRet; return GCGIBADDATA; } else *ret = i; return GCGISUCCESS;}gcgiReturnType gcgiFieldLength(char *field, int *ret){ QueryStringNode *qs; if (findQueryStringNodeFirst(field, &qs) == GCGIFIELDNOTFOUND) { *ret = 0; return GCGIFIELDNOTFOUND; } *ret = strlen(qs->data); if (*ret == 0) return GCGIFIELDEMPTY; else return GCGISUCCESS;}gcgiReturnType gcgiFieldLengthCur(char *field, int *ret){ QueryStringNode *qs; if (findQueryStringNodeCur(field, &qs) == GCGIFIELDNOTFOUND) { *ret = 0; return GCGIFIELDNOTFOUND; } *ret = strlen(qs->data); if (*ret == 0) return GCGIFIELDEMPTY; else return GCGISUCCESS;}gcgiReturnType gcgiFieldLengthNext(char *field, int *ret){ QueryStringNode *qs; if (findQueryStringNode(field, &qs) == GCGIFIELDNOTFOUND) { *ret = 0; return GCGIFIELDNOTFOUND; } *ret = strlen(qs->data); if (*ret == 0) return GCGIFIELDEMPTY; else return GCGISUCCESS;}gcgiReturnType gcgiFieldSize(char *field, int *ret){ QueryStringNode *qs; if (findQueryStringNodeFirst(field, &qs) == GCGIFIELDNOTFOUND) { *ret = 0; return GCGIFIELDNOTFOUND; } *ret = qs->size; return GCGISUCCESS;}gcgiReturnType gcgiFieldSizeCur(char *field, int *ret){ QueryStringNode *qs; if (findQueryStringNodeCur(field, &qs) == GCGIFIELDNOTFOUND) { *ret = 0; return GCGIFIELDNOTFOUND; } *ret = qs->size; return GCGISUCCESS;}gcgiReturnType gcgiFieldSizeNext(char *field, int *ret){ QueryStringNode *qs; if (findQueryStringNode(field, &qs) == GCGIFIELDNOTFOUND) { *ret = 0; return GCGIFIELDNOTFOUND; } *ret = qs->size; return GCGISUCCESS;}char *gcgiFetchEnvVar(int env){ return cgiQuery->env[env];}gcgiReturnType gcgiFetchString(char *field, char *ret, int max){ int i; QueryStringNode *qs; if (findQueryStringNodeFirst(field, &qs) == GCGIFIELDNOTFOUND) { ret[0] = '\0'; return GCGIFIELDNOTFOUND; } i = strlen(qs->data); if (i >= max) i = max-1; strncpy(ret, qs->data, i); ret[i] = '\0'; if (i == 0) return GCGIFIELDEMPTY; else return GCGISUCCESS;}gcgiReturnType gcgiFetchStringNext(char *field, char *ret, int max){ int i; QueryStringNode *qs; if (findQueryStringNode(field, &qs) == GCGIFIELDNOTFOUND) { ret[0] = '\0'; return GCGIFIELDNOTFOUND; } i = strlen(qs->data); if (i >= max) i = max-1; strncpy(ret, qs->data, i); ret[i] = '\0'; if (i == 0) return GCGIFIELDEMPTY; else return GCGISUCCESS;}gcgiReturnType gcgiFetchStringNoNewLines(char *field, char *ret, int max){ int len,i,j; QueryStringNode *qs; if (findQueryStringNodeFirst(field, &qs) == GCGIFIELDNOTFOUND) { ret[0] = '\0'; return GCGIFIELDNOTFOUND; } len = strlen(qs->data); if (len >= max) len = max-1; for (j = 0, i = 0; i <= len && qs->data[j] != '\0'; j++, i++) if (qs->data[j] == '\r' && qs->data[j+1] == '\n') { ret[i] = ' '; j++; } else if (qs->data[j] == '\n') { ret[i] = ' '; } else ret[i] = qs->data[j]; if (i <= len) ret[i] = '\0'; else ret[len] = '\0'; if (len == 0) return GCGIFIELDEMPTY; else return GCGISUCCESS;}gcgiReturnType gcgiFetchStringNoNewLinesNext(char *field, char *ret, int max){ int len,i,j; QueryStringNode *qs; if (findQueryStringNode(field, &qs) == GCGIFIELDNOTFOUND) { ret[0] = '\0'; return GCGIFIELDNOTFOUND; } len = strlen(qs->data); if (len >= max) len = max-1; for (j = 0, i = 0; i <= len && qs->data[j] != '\0'; j++, i++) if (qs->data[j] == '\r' && qs->data[j+1] == '\n') { ret[i] = ' '; i++; j += 2; } else if (qs->data[j] == '\n') { ret[i] = ' '; j++; } else ret[i] = qs->data[j]; if (i <= len) ret[i] = '\0'; else ret[len] = '\0'; if (i == 0) return GCGIFIELDEMPTY; else return GCGISUCCESS;}gcgiReturnTypegcgiFetchData(char *field, char *ret, int max, MimeType *type, char **subtype, MimeEncoding *encoding, char **filename, int *truncated){ size_t i; QueryStringNode *qs; if (findQueryStringNodeFirst(field, &qs) == GCGIFIELDNOTFOUND) return GCGIFIELDNOTFOUND; if (qs->truncated) *truncated = 1; else *truncated = 0; i = qs->size; if (i >= max) i = max; if (i == 0) return GCGIFIELDNOTFOUND; memcpy(ret, qs->data, i); *type = qs->type; *encoding = qs->encoding; if (subtype != NULL) { *subtype = XMALLOC(char, strlen(qs->subtype)+1); strcpy(*subtype, qs->subtype); } if (filename != NULL) { *filename = XMALLOC(char, strlen(qs->filename)+1); strcpy(*filename, qs->filename); } return GCGISUCCESS;}gcgiReturnTypegcgiFetchDataNext(char *field, char *ret, int max, MimeType *type, char **subtype, MimeEncoding *encoding, char **filename, int *truncated){ size_t i; QueryStringNode *qs; if (findQueryStringNode(field, &qs) == GCGIFIELDNOTFOUND) return GCGIFIELDNOTFOUND; i = qs->size; if (i >= max) i = max; if (i == 0) return GCGIFIELDNOTFOUND; memcpy(ret, qs->data, i); *type = qs->type; *encoding = qs->encoding; return GCGISUCCESS;}gcgiReturnType gcgiFetchMultipleString(char *field, char ***data){ int i, j; QueryStringNode *qs; QueryStringColl *qsc; if (findQueryStringColl(field, &i) == GCGIFIELDNOTFOUND) { *data = NULL; return GCGIFIELDNOTFOUND; } qsc = cgiQuery->query[i]; /* Malloc the array of char pointers. */ *data = XMALLOC(char *, qsc->num + 1); (*data)[qsc->num] = '\0'; for (qs = qsc->beg, j = 0; qs != NULL; qs = qs->next, j++) { (*data)[j] = XMALLOC(char, qs->size); strncpy((*data)[j], qs->data, qs->size - 1); (*data)[j][qs->size - 1] = '\0'; } return GCGISUCCESS;}gcgiReturnTypegcgiFreeMultipleString(char **data){ int i; if (data == NULL) return GCGISUCCESS; for (i = 0; data[i] != NULL; i++) XFREE(data[i]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -