この 2 つの関数はクライアントとサーバー間でデータを送受信します。なお、マルチプロセスアプリケーションでは、プロセス間でデータを送受信できます。トークンと同様にメッセージも送受信するため、名前が若干間違っているように思えるかもしれません。この 2 つの関数は自分が処理する内容を意識しません。
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 * * 目的: ファイル記述子からトークンを読み取ります * * 引数: * * 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; } |