⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 message.c

📁 Linux下的飞鸽传书
💻 C
字号:
/* *  Copyright (C) 2006 Takeharu KATO * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#include <stdio.h>#include <errno.h>#include <string.h>#include <sys/time.h>#include <iconv.h>#include <glib.h>#include "common.h"#define UNKNOWN_NAME _("UnKnown")#define TO_CODE_SET "UTF-8"#define IPMSG_CODE_SET "SHIFT-JIS"#define FROM_CODE_SET IPMSG_CODE_SETconst char *refer_user_name_from_msg(const msg_data_t *msg){  if (!msg)    return UNKNOWN_NAME;  return (msg->username)?(msg->username):(UNKNOWN_NAME);}const char *refer_host_name_from_msg(const msg_data_t *msg){  if (!msg)    return UNKNOWN_NAME;  return (msg->hostname)?(msg->hostname):(UNKNOWN_NAME);}const char *refer_nick_name_from_msg(const msg_data_t *msg){  if (!msg)    return UNKNOWN_NAME;  return (msg->message)?(msg->message):(UNKNOWN_NAME);}const char *refer_group_name_from_msg(const msg_data_t *msg){  if (!msg)    return UNKNOWN_NAME;  return (msg->extstring)?(msg->extstring):(UNKNOWN_NAME);}intrefer_pkt_no_name_from_msg(const msg_data_t *msg){  return msg->pkt_seq_no;}intinit_message_data(msg_data_t *msg){  if (!msg)    return -EINVAL;  memset(msg,0,sizeof(msg_data_t));  msg->magic=IPMSG_MSG_MAGIC;  return 0;}intrelease_message_data(msg_data_t *msg){  if ( (!msg) || (msg->magic!= IPMSG_MSG_MAGIC) )    return -EINVAL;    if (msg->username)    g_free(msg->username);  if (msg->hostname)    g_free(msg->hostname);  if (msg->extstring)    g_free(msg->extstring);  if (msg->message)    g_free(msg->message);  msg->magic=0;  return 0;}intparse_message(const char *ipaddr,msg_data_t *msg,const char *message_buff,size_t len){  long int_val;  char *sp=NULL;  char *ep=NULL;  char *buffer;  ssize_t remains;  char *temp_buffer=NULL;  size_t tmp_len;  int rc=0;  /*   * TCP経由でよばれた場合は, ipaddrがNULLになりうる     */  if  ( (!message_buff) || (!msg)  || (msg->magic!= IPMSG_MSG_MAGIC) )    return -EINVAL;  _assert(len>0);  buffer=g_malloc(len);  if (!buffer)    return -ENOMEM;  gettimeofday(&msg->tv, NULL);  memcpy(buffer,message_buff,len);  remains=len;  /*   * バージョン番号      */  sp=buffer;  ep=memchr(sp, ':', remains);  if (!ep) {    rc=-EINVAL;    goto err_out;  }  *ep='\0';  remains =len - ((unsigned long)ep-(unsigned long)buffer);  if (remains<=0) {    rc=-EINVAL;    goto err_out;  }  ++ep;  int_val=strtol(sp, (char **)NULL, 10);  msg->version=int_val;  dbg_out("Version:%d\n",msg->version);  sp=ep;  /*   * シーケンス番号      */  ep=memchr(sp, ':', remains);  if (!ep) {    rc=-EINVAL;    goto err_out;  }  *ep='\0';  remains =len - ((unsigned long)ep-(unsigned long)buffer);  if (remains<=0) {    rc=-EINVAL;    goto err_out;  }  ++ep;  int_val=strtol(sp, (char **)NULL, 10);  msg->pkt_seq_no=int_val;  dbg_out("pkt_no:%d(%x)\n",msg->pkt_seq_no,msg->pkt_seq_no);  sp=ep;  /*   * 名前   */  ep=memchr(sp, ':', remains);  if (!ep) {    rc=-EINVAL;    goto err_out;  }  *ep='\0';  remains =len - ((unsigned long)ep-(unsigned long)buffer);  if (remains<=0) {    rc=-EINVAL;    goto err_out;  }  ++ep;  msg->username=g_strdup(sp);  dbg_out("Name:%s\n",msg->username);  sp=ep;  /*   * ホスト名   */  ep=memchr(sp, ':', remains);  if (!ep) {    rc=-EINVAL;    goto err_out;  }  *ep='\0';  remains =len - ((unsigned long)ep-(unsigned long)buffer);  if (remains<=0) {    rc=-EINVAL;    goto err_out;  }  ++ep;  msg->hostname=g_strdup(sp);  dbg_out("Host:%s\n",msg->hostname);  sp=ep;  /*   * コマンド番号      */  ep=memchr(sp, ':', remains);  if (!ep) {    rc=-EINVAL;    goto err_out;  }  *ep='\0';  ++ep;  int_val=strtol(sp, (char **)NULL, 10);  msg->command=(int_val & 0xff);  msg->command_opts=(int_val & ~0xffUL);  dbg_out("Command:0x%x Option:0x%x\n",msg->command,msg->command_opts);  sp=ep;   /*   *メッセージ本文   */  ep=memchr(sp, '\0', remains);  if (!ep) {    rc=-EINVAL;    goto err_out;  }  if ( (msg->command == IPMSG_SENDMSG) && (msg->command_opts & (IPMSG_ENCRYPTOPT)) )  {#if defined(USE_OPENSSL)    unsigned char *enc_buff=NULL;    char *extend=NULL;    char *sep=NULL;    size_t enc_len;    g_assert(ipaddr); /* 暗号化がある場合は, NULLを許さない(署名の検証があるので) */    dbg_out("This is encrypted message:%s.\n",sp);    rc=ipmsg_decrypt_message(ipaddr,sp,&enc_buff,&enc_len);    if (rc) {      err_out("Can not decrypt message.\n");      goto err_out;    }    msg->message=g_strdup(enc_buff);    if (!(msg->message))      goto decode_end;    dbg_out("body:%s\n",msg->message);    dbg_out("Decrypt message %s(%d) total=%d.\n",enc_buff,strlen(enc_buff),enc_len);  decode_end:    if (enc_buff)      g_free(enc_buff);#else    dbg_out("I can not decode encrypted message.Ignore the message.");    goto err_out; /*  暗号化されたメッセージは捨てる		   *  (暗号化できないクライアントに送ってきた方が悪い)  		   */    #endif  /*  USE_OPENSSL  */  }else{    msg->message=g_strdup(sp);    if (!(msg->message))      goto err_out;    dbg_out("body:%s\n",msg->message);  }  /*   *拡張部   */  if ( ((unsigned long)ep - (unsigned long)buffer) < len) {    ++ep;    sp=ep;    msg->extstring=g_strdup(sp);    dbg_out("extention:%s\n",msg->extstring);  }err_out:  g_free(buffer);  return rc;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -