示例#1
0
文件: frame.c 项目: jalishah/airborne
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;
}
示例#2
0
文件: mimg.c 项目: adderly/cmoon
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;
}