ParserStatus parse_frame(in_cmd_t *cmd, plchar_t *payload, const frame_t frame) { int in_pos = 0; int in_len = strlen(frame); if (frame[in_pos++] != START_CHAR) { return PARSER_INVALID_START; } mk_address_t addr = addr_decode(frame[in_pos++]); if (addr < 1 || addr > 3) { return PARSER_INVALID_ADDRESS; } in_cmd_t _cmd = MERGE_ADDR_CMD(addr, frame[in_pos++]); if (!in_command_exists(_cmd)) { return PARSER_INVALID_COMMAND; } const char *crc_chars = &frame[in_len - 3]; crc_t crc = calc_crc(frame, in_len - 3); if (!crc_ok(crc, crc_chars)) { return PARSER_INVALID_CRC; /* invalid crc */ } (void)mb64_decode(payload, in_len - 6, &frame[in_pos]); *cmd = _cmd; return PARSER_NO_ERROR; }
NEOERR* mimg_accept(CGI *cgi, char *form_name, char *imgroot, char result[LEN_MD5], int *ftype) { unsigned char data[IMAGE_MD5_SIZE]; unsigned int bytes; char tok[3] = {0}; NEOERR *err; FILE *fp, *fpout; char *s; MCS_NOT_NULLC(cgi->hdf, imgroot, ftype); /* TODO memory leak */ fp = mfile_get_safe_from_std(cgi_filehandle(cgi, form_name)); MCS_NOT_NULLA(fp); s = mfile_get_type(cgi, form_name); if (!s || strncmp(s, "image/", 6)) { return nerr_raise(NERR_ASSERT, "file %s not image type", s); } s = s + 6; *ftype = mimg_type_str2int(s); memset(data, 0x0, sizeof(data)); fseek(fp, 0, SEEK_SET); bytes = fread(data, 1, sizeof(data), fp); if (bytes <= 0) return nerr_raise(NERR_IO, "read image file error %d ", bytes); mstr_md5_buf(data, bytes, result); strncpy(tok, result, 2); err = mfile_openf(&fpout, "w+", "%s/%s/%s.%s", imgroot, tok, result, mimg_type_int2str(*ftype)); if (err != STATUS_OK) return nerr_pass(err); s = hdf_get_value(cgi->hdf, PRE_QUERY"._upfile_data_type", NULL); if (s && !strcmp(s, "dataurl")) { err = mb64_decode(fp, fpout); if (err != STATUS_OK) return nerr_pass(err); } else { if (bytes < IMAGE_MD5_SIZE-10) { fwrite(data, 1, bytes, fpout); } else { mfile_copy(fpout, fp); } } fclose(fpout); return STATUS_OK; }