私たちの割り当てでは、ログのコピーが与えられ、wtmp
それを解析して、の出力と同様にソートされた形式で出力することが期待されますlast
。
wtmp
これで、ファイルが構造のリストで構成されていることがわかりましたutmp
。提供されるファイルには、少なくとも1つのutmp構造が含まれていることが保証されており、バイナリファイル内のすべての構造が正しく構築されていると想定しています。
をman utmp
読み通し、提供されたバイナリファイルから構造体を読み込むプログラムを正常に作成しました。(長い印刷方法についてお詫びします)
#include <stdio.h>
#include <string.h>
#include <utmp.h>
#include <stdlib.h>
void utmpprint(struct utmp *log);
int main() {
int logsize = 10;
FILE *file;
struct utmp log[logsize];
int i = 0;
file = fopen("wtmp", "rb");
if (file) {
fread(&log, sizeof(struct utmp), logsize, file);
for(i = 0; i < logsize; i++) {
utmpprint(&log[i]);
}
} else {
return(0);
}
return(0);
}
void utmpprint(struct utmp *log) {
printf("{ ut_type: %i, ut_pid: %i, ut_line: %s, ut_id: %s,
ut_user: %s, ut_host: %s, ut_exit: { e_termination: %i,
e_exit: %i }, ut_session: %i, timeval: { tv_sec: %i, tv_usec: %i },
ut_addr_v6: %i }\n\n", log->ut_type, log->ut_pid, log->ut_line,
log->ut_id, log->ut_user, log->ut_host, log->ut_exit.e_termination,
log->ut_exit.e_exit, log->ut_session, log->ut_tv.tv_sec,
log->ut_tv.tv_usec, log->ut_addr_v6);
}
さて、私が抱えている問題は、これを実行すると、の出力がut_id
期待したものと異なることです。
から:man utmp
char ut_id[4]; /*Terminal name suffix, or inittab(5) ID */
私の出力:
... ut_line: pts/2, ut_id: ts/2jsmith, ut_user: jsmith, ...
ここで何が起こっているのかよくわかりません。起こっていると思うのは、ut_idフィールドが、私が読み込んでいる構造体に存在しない可能性があるということです。これが、ut_idフィールドが両側のフィールドとして一緒に押しつぶされて表示されている理由を説明していると思います。
fprintf書式を使用してフィールドを正しく表示できると思いましたが、文字列内から特定の部分を取得することはできず、char配列の片側にのみテキストを書式設定できるようです。
そうでなければ、私はかなり迷っています。これは、構造体についての私の理解のギャップにすぎませんか?
答えを探しているのではなく、正しい方向に進んでいるだけです。
また、端末名のサフィックスは正確には何ですか?それは後に続く数字だけpts/
ですか?