?? message.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 + -