この 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;
}
|