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