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