GSS-API のプログラミング

send_token()recv_token()

この 2 つの関数はクライアントとサーバー間でデータを送受信します。なお、マルチプロセスアプリケーションでは、プロセス間でデータを送受信できます。トークンと同様にメッセージも送受信するため、名前が若干間違っているように思えるかもしれません。この 2 つの関数は自分が処理する内容を意識しません。

send_token()

send_token() はトークンまたはメッセージを送信します。


例 A–18 send_token()


/*
 * 関数: send_token
 *
 * 目的: トークンをファイル記述子に書き込む
 *
 * 引数:
 *
 *      s               (r) 開いたファイル記述子
 *      tok             (r) 書き込むトークン
 *
 * 戻り値: 成功した場合は 0、失敗した場合は -1
 *
 * 効果:
 *
 * send_token はまずトークンの長さ (ネットワーク上の長さ) を、次にトークンの
 * データをファイル記述子 s に書き込みます。成功した場合は 0 を戻し、
 * エラーが発生したり、すべてのデータを書き込むことができなかった場合は 
 * -1 を戻します。
 */
int send_token(s, tok)
     int s;
     gss_buffer_t tok;
{
     int len, ret;

     len = htonl((OM_uint32)tok->length);
     ret = write_all(s, (char *) &len, sizeof(int));
     if (ret < 0) {
          perror("sending token length");
          return -1;
     } else if (ret != 4) {
         if (display_file)
             fprintf(display_file,
                     "sending token length: %d of %d bytes written\n",
                     ret, 4);
          return -1;
     }

     ret = write_all(s, tok->value, (OM_uint32)tok->length);
     if (ret < 0) {
          perror("sending token data");
          return -1;
     } else if (ret != tok->length) {
         if (display_file)
             fprintf(display_file,
                     "sending token data: %d of %d bytes written\n",
                     ret, tok->length);
         return -1;
     }

     return 0;
}

recv_token()

recv_token() はトークンまたはメッセージを受信します。


例 A–19 recv_token()


/*
 * 関数: recv_token
 *
 * 目的: ファイル記述子からトークンを読み取ります
 *
 * 引数:
 *
 *      s               (r) 開いたファイル記述子
 *      tok             (w) 読み取るトークン
 *
 * 戻り値: 成功した場合は 0、失敗した場合は -1
 *
 * 効果:
 *
 * recv_token はまずトークンの長さ (ネットワーク上の長さ) を読み取り、その
 * データを保持するメモリーを割り当て、そして、ファイル記述子 s からトークン
 * のデータを読み取る。必要であれば、長さとデータの読みとりを中止する。
 * 成功した場合、gss_release_buffer でトークンを解放する必要がある。
 * 成功した場合は 0 を戻し、エラーが発生したり、すべてのデータを読み取る
 * ことができなかった場合は -1 を戻す。
 */
int recv_token(s, tok)
     int s;
     gss_buffer_t tok;
{
     int ret, len;

     ret = read_all(s, (char *) &len, sizeof(int));
     if (ret < 0) {
          perror("reading token length");
          return -1;
     } else if (ret != 4) {
         if (display_file)
             fprintf(display_file,
                     "reading token length: %d of %d bytes read\n",
                     ret, 4);
         return -1;
     }

     tok->length = ntohl(len);
     tok->value = (char *) malloc(tok->length);
     if (tok->value == NULL) {
         if (display_file)
             fprintf(display_file,
                     "Out of memory allocating token data\n");
          return -1;
     }

     ret = read_all(s, (char *) tok->value, (OM_uint32)tok->length);
     if (ret < 0) {
          perror("reading token data");
          free(tok->value);
          return -1;
     } else if (ret != tok->length) {
          fprintf(stderr, "sending token data: %d of %d bytes written\n",
                  ret, tok->length);
          free(tok->value);
          return -1;
     }

     return 0;
}