by shigemk2

当面は技術的なことしか書かない

whoコマンドを書く その2

そう、こんな感じで。

なお、OSはCentOS 6.5 finalでございます。

/* who1.c whoプログラムの最初のバージョン
 * utmpファイルをオープンし、読み出した結果を表示する
 */
#include <stdio.h>
#include <utmp.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>

#define SHOWHOST                /* 出力にリモートマシン名を組込む */

void showtime(long);
void show_info(struct utmp *);

int main()
{
    struct utmp utbuf; /* 情報をここに読み込む */
    int utmpfd;                 /* このデスクリプタから読み出す */

    if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1) {
        perror( UTMP_FILE );    /* UTMP_FILEはutmp.hで定義されている */
        exit(1);
    }

    while ( read(utmpfd, &utbuf, sizeof(utbuf)) == sizeof(utbuf))
        show_info(&utbuf);
    close(utmpfd);
    return 0;                   /* うまくいった */
}

/*
 * show_info()
 * utmp構造体の内容を人間が読めるように表示する
 * レコードにユーザー名が含まれていない場合は何も表示しない
*/
void show_info( struct  utmp *utbufp )
{
    if ( utbufp->ut_type != USER_PROCESS )
        return;
    printf ("%-8.8s", utbufp->ut_name); /* ログイン名 */
    printf (" ");               /* スペース */
    printf ("%-8.8s", utbufp->ut_line); /* tty */
    printf (" ");               /* スペース */
    showtime( utbufp->ut_time ); /* 時刻の表示 */
    printf (" ");               /* スペース */
#ifdef SHOWHOST
    printf ("(%s)", utbufp->ut_host); /* ホスト */
#endif
    printf ("\n"); /* 改行 */
};

/*
 * showtime()
 * 人間が理解しやすい形式で時刻を表示する
 * ctimeを使って文字列を組み立ててからその一部を抜き出す
 * 注意: %12.12sは文字列をchar12個分で出力し、
 * 長さを12バイト以下に制限する
*/
void showtime( long timeval )
{
    char *cp;                        /* 時刻のアドレスを保持するポインタ */
    cp = ctime(&timeval);
    printf("%12.12s", cp+4); /* 位置4から12個分を抜き出す */
};