Logo Search packages:      
Sourcecode: g2ipmsg version File versions  Download package

static int ipmsg_proc_getlist ( const udp_con_t *  con,
const msg_data_t *  msg 
) [static]

IPMSGのIPMSG_GETLISTパケットを処理する.

Parameters:
[in] con UDPコネクション情報
[in] msg 受信メッセージ(未使用)
Return values:
0 正常終了
-EINVAL 引数異常
Note:
IPMSG_ANSLISTを返却する.
IPMSG_ANSLISTのパケット形式:

  • メッセージ部: ホストリストメッセージ
  • 拡張部 : なし

ホストリストメッセージの形式:

  • ホストリストの内容を1エントリ毎に:で区切って送信する.
  • 1エントリの情報は, 以下の順で, デリミタ(''(0x13))で区切って送信する.
    1. ユーザ名
    2. ホスト名
    3. IPMSG_ANSLIST(十進で記載:19)
    4. IPアドレス
    5. ポート番号
    6. ニックネーム
    7. グループ名

Attention:
内部リンケージ

Definition at line 859 of file protocol.c.

References G2IPMSG_DEFAULT_HOST_LIST_LEN, IPMSG_PROTOCOL_MSG_NO_EXTENSION, IPMSG_PROTOCOL_PKTNUM_AUTO, and ipmsg_send_packet().

Referenced by ipmsg_dispatch_message().

                                                              {
      char                *host_list = NULL;
      const char             *ipaddr = NULL;
      ipmsg_send_flags_t local_flags = 0;
      int                     length = 0;
      int                      start = 0;
      int                         rc = 0;

      dbg_out("here\n");

      if ( (con == NULL) || (msg == NULL) ) {
        rc = -EINVAL;
        goto error_out;
      }

      /*
       * フラグ設定
       */
      local_flags = IPMSG_ANSLIST;
      
      /*
       * ピアのIPアドレスを参照する
       */
      ipaddr = udp_get_peeraddr(con);
      if (ipaddr == NULL) {
            rc = -ENOENT;
            goto error_out;
      }

      /*
       * 返却するホストリスト作成
       */

      length = G2IPMSG_DEFAULT_HOST_LIST_LEN; /* ホストリスト長設定  */

      /* 要求されたホストリストの返却開始位置を取得する. */
      errno = 0;
      start = strtol(msg->message, (char **)NULL, 10);
      if (errno != 0) {
            err_out("Can not parse IPMSG_GETLIST packet no.\n");
            rc = -errno;
            goto error_out;
      }  

      dbg_out("require:%d(%s)\n", start, msg->message); 

      /* 返却するホストリストを作成する */
      rc = userdb_get_hostlist_string(start, &length, (const char **)&host_list);
      if (rc != 0) {
            g_assert(host_list == NULL);
            goto error_out;
      }

      /*
       * 送信
       */
      rc = ipmsg_send_packet(con, ipaddr, IPMSG_PROTOCOL_PKTNUM_AUTO, local_flags, 
          host_list, IPMSG_PROTOCOL_MSG_NO_EXTENSION);
      if (rc != 0) {
            goto free_hostlist_out;
      }

      rc = 0; /* 正常終了 */

free_hostlist_out:
      if (host_list != NULL)
            g_free(host_list);
error_out:
      return rc;
}


Generated by  Doxygen 1.6.0   Back to index