Exemple #1
0
int get_casn_file(
    struct casn *casnp,
    const char *name,
    int fd)
{
    long siz,
        tmp;
    uchar *b,
       *c;

    // if name is NULL, we were passed an active file descriptor
    if (name)
    {
        struct stat statbuf;
        if (stat(name, &statbuf) < 0 ||
            !(b = (uchar *) calloc(1, statbuf.st_size + 4)) ||
            (fd = open(name, (O_RDONLY | O_DOS))) < 0 ||
            (siz = read(fd, b, statbuf.st_size + 1)) < 0)
            return _casn_obj_err(casnp, ASN_FILE_ERR);
        close(fd);
    }
    else
    {
        for (siz = 2048, b = c = (uchar *) calloc(1, siz); 1;)
        {
            if ((tmp = read(fd, c, 2048)) == 2048)
            {
                b = (uchar *) realloc(b, siz + 2048);
                c = &b[siz];
                siz += 2048;
            }
            else if (tmp < 0)
            {
                if (name)
                    close(fd);  // if we opened it
                return _casn_obj_err(casnp, ASN_FILE_ERR);
            }
            else
                break;
        }
        siz = (siz - 1024 + tmp);
    }
    // defend against a truncated file
    c = b;
    tmp = _get_tag(&c);
    if ((tmp = _calc_lth(&c, *b)) >= 0)
    {
        tmp += (c - b);
        if (tmp != siz)
        {
            free(b);
            return _casn_obj_err(casnp, ASN_FILE_SIZE_ERR);
        }
    }
    tmp = decode_casn_lth(casnp, b, siz);
    free(b);
    return tmp;
}
Exemple #2
0
/* ----------------------------------------------------------------
 * 功    能:将字符串解包为TLV格式数据
 * 输入参数:szBuf           输入字符串
 *           iBufLen         输入字符串长度
 * 输出参数:pTLV            TLV格式数据
 * 返 回 值:0  成功;    -1 失败
 * 作    者:fengwei
 * 日    期:2012-9-24
 * 调用说明:UnpackTLV(pTLV, szBuf, iLen)
 * 修改日志:修改日期    修改者      修改内容简述
 * ----------------------------------------------------------------
 */
int UnpackTLV(T_TLVStru *pTLV, char* szBuf, int iBufLen)
{
    int  i, iIndex, iLen;
    char szTagBuf[MAX_TAG_LEN+1];
    T_TLVData *pData;

    iIndex = 0;
    i = 0;

    while (iIndex < iBufLen)
    {
        pData = pTLV->tTLVData + i;
        
        iLen = _get_tag(szBuf+iIndex, pTLV->iTagType, pData->szTag);
        if (iLen == 0)
        {
            WriteLog(ERROR, "unpack tlv Tag error");
            return FAIL;
        }
        iIndex += iLen;

        iLen = _get_len(szBuf+iIndex, pTLV->iLenType, &(pData->iLen));
        if (iLen == 0)
        {
            WriteLog(ERROR, "unpack tlv len error");
            return FAIL;
        }
        iIndex += iLen;

        iLen = _get_value(szBuf+iIndex, pData->iLen, pTLV->iValueType, 
                          pData->szValue);
        if (iLen < 0)
        {
            WriteLog(ERROR, "unpack tlv value error");
            return FAIL;
        }
        iIndex += iLen;

        pData->iFlag = DATA_NOTNULL;

        i++;
    }

    return SUCC;
}
Exemple #3
0
char *
_nedje_text_escape(const char *text)
{
   Eina_Strbuf *txt;
   char *ret;
   const char *text_end;
   size_t text_len;
   Eina_Array *arr;
   const char *cur_tag = NULL;

   if (!text) return NULL;

   txt = eina_strbuf_new();
   text_len = strlen(text);
   arr = eina_array_new(3);

   text_end = text + text_len;
   while (text < text_end)
     {
        int advance;

        if ((text[0] == '<') && text[1])
          {
             const char *tag, *popped;
             Eina_Bool closing = EINA_FALSE;

             if (text[1] == '/') //closing tag
               {
                  closing = EINA_TRUE;
                  tag = _get_tag(text + 2);
               }
             else
               tag = _get_tag(text + 1);
             if (closing)
               {
                  if (cur_tag && (tag != cur_tag))
                    {
                       /* tag mismatch: autoclose all failure tags
                        * not technically required by the spec,
                        * but it makes me feel better about myself
                        */
                       do
                         {
                            popped = eina_array_pop(arr);
                            if (eina_array_count(arr))
                              cur_tag = eina_array_data_get(arr, eina_array_count(arr) - 1);
                            else
                              cur_tag = NULL;
                            eina_strbuf_append_printf(txt, "</%c>", popped[1]);
                         } while (cur_tag && (popped != tag));
                       advance = 4;
                    }
                  else if (cur_tag)
                    {
                       /* tag match: just pop */
                       popped = eina_array_pop(arr);
                       if (eina_array_count(arr))
                         cur_tag = eina_array_data_get(arr, eina_array_count(arr) - 1);
                       else
                         cur_tag = NULL;
                       eina_strbuf_append_printf(txt, "</%c>", popped[1]);
                       advance = 4;
                    }
                  else
                    {
                       /* no current tag: escape */
                       advance = _text_escape(txt, text);
                    }
               }
             else
               {
                  if (tag)
                    {
                       cur_tag = tag;
                       eina_array_push(arr, tag);
                       eina_strbuf_append_printf(txt, "<%c>", tag[1]);
                       advance = 3;
                    }
                  else
                    advance = _text_escape(txt, text);
               }
          }
        else if (text[0] == '&')
          {
             const char *s;

             s = strchr(text, ';');
             if (s)
               s = evas_textblock_escape_string_range_get(text, s + 1);
             if (s)
               {
                  eina_strbuf_append_char(txt, text[0]);
                  advance = 1;
               }
             else
               advance = _text_escape(txt, text);
          }
        else
          advance = _text_escape(txt, text);

        text += advance;
     }

   eina_array_free(arr);
   ret = eina_strbuf_string_steal(txt);
   eina_strbuf_free(txt);
   return ret;
}