사용자 관련 정보 검색함수 getutxent()에 대해서
오늘 우연히 사용하게 되어 이에 대한 기록을 남겨놓고 감.

utmp => who 명령어에서 사용함.

wtmp => last 명령어에서 사용함

 

함수를 사용할때 추가해야할 해더파일

#include <utmpx.h>

   

getutxent함수와 관련된 다른 함수들

struct utmpx *getutxent(void);

void setutxent(void);

void endutxent(void);

int utmpxname(const char *file);     => file - 교체할 파일이름이 매개변수로 넘어간다. 

   

 getutxent 함수는 /var/adm/utmpx 파일에서 로그인 정보를 순차적으로 읽어들임.

 setutxent 함수는 /var/adm/utmpx 파일의 오프셋을 파일의 시작에 위치시킴.

 endutxent 함수는 /var/adm/utmpx 위에서 열었던 파일을 닫는다.

 utmpxname 함수는 로그인 정보 파일을 file로 지정한 다른 파일로 변경.

   

해당 정보가 있는 파일의 경로 (각 OS별)

로그파일

Solaris

HP UX

LINUX

wtmp,utmp

/var/adm/wtmpx

/var/adm/utmpx

/usr/adm/wtmp

/etc/utmp

/var/log/wtmp

/var/run/utmp

   

====================================

 

#include "sys/types.h"
#include 
#include 

int main(void) {

    struct utmpx *utx;

    printf("-----------------\n");
    printf("   Login User\n");
    printf("-----------------\n");

    while((utx=getutxent()) != NULL) {
        if(utx->ut_type != USER_PROCESS)
            continue;

        printf("%10s %5s\n", utx->ut_user, utx->ut_line);
    }

    return 0;

}
결과화면
$ ./a.out 
-----------------
   Login User
-----------------
  telcosys  tty1
     fresh pts/4
      jeon pts/3

* who 명령의 결과화면
$ who
telcosys tty1         May 17 09:08
fresh    pts/4        Aug 13 14:34 (10.10.101.55)
jeon     pts/3        Aug 13 19:57 (10.10.104.55)

====================================   

   

utmp파일에는 현재 접속중(Telnet ..) 사용자의 정보가 저장되는데,

로그아웃을 하면 이에 대한 정보가 삭제됨.

   

wtmp파일은 로그인시 utmp파일에 쓰이는 것과 같은 정보가 쓰여지고,

사용자가 로그아웃을 하면 정보도 쓰여지게 됨.(updwtmp).

또한 컴퓨터의 리부팅과, 몇몇정보들이 추가로 쓰여짐.

   

 

원본 source 파일을 첨부해서 살펴보면 아래와 같다.

출처 : http://www2.oldlinux.org/Linux.old/Linux-0.98/Yggdrasil-0.98.3/usr/src/sbin/getty_ps/getutent.c

==========================

 

/* getutxent.c */

#include 
#include 

struct utmpx *
getutxent (void)
{
  return (struct utmpx *) __getutent ();
}
/* getutent.c */


#include "getty.h"

#if defined(RCSID) && !defined(lint)
static char *RcsId =
"@(#)$Id: getutent.c,v 2.0 90/09/19 20:00:51 paul Rel $";
#endif

typedef	struct utmp	UTMP;

static	char	*utmpfil = UTMP_FILE;	/* default utmp file */
static	FILE	*ufp = (FILE *) NULL;	/* file pointer to utmp file */
					/* NULL = no utmp file open  */
static	UTMP	ut;			/* buffer for utmp record */


/*
**	getutent() - get next valid utmp entry
**
**	Returns (UTMP*)NULL if no vaild entry found.
*/

UTMP *
getutent()
{
	if (ufp == (FILE *) NULL)
		if ((ufp = fopen(utmpfil, "r+")) == (FILE *) NULL)
			return((UTMP *) NULL);

	do {
		if (fread((char *)&ut, sizeof(ut), 1, ufp) != 1)
			return((UTMP *) NULL);

	} while (ut.ut_name[0] == '\0');	/* valid entry? */

	return(&ut);
}


/*
**	getutline() - get utmp entry that matches line.
**
**	Returns (UTMP*)NULL if no match found.
*/

UTMP *
getutline(line)
register UTMP *line;
{
	do {
		if (strequal(ut.ut_line, line->ut_line))
			return(&ut);	/* match! */

	} while (getutent() != NULL);

	return((UTMP *) NULL);
}


/*
**	setutent() - rewind utmp back to beginning
*/

void
setutent()
{
	if (ufp != (FILE *) NULL)
		rewind(ufp);
}

/*
**	endutent() - close utmp file
*/

void
endutent()
{
	if (ufp != (FILE *) NULL) {
		(void) fclose(ufp);
		ufp = (FILE *) NULL;
	}
}

/*
**	utmpname() - change utmp file name to "file"
*/

void
utmpname(file)
register char *file;
{
	endutent();
	utmpfil = strdup(file);
}

/* end of getutent.c */

==========================

반응형

'Language > C' 카테고리의 다른 글

strchr 함수 예제  (442) 2012.08.14
strdup 함수 예제  (476) 2012.08.14
strtok 함수 예제  (3377) 2012.08.06
writev 함수 예제  (472) 2012.07.31
readv 함수 예제  (480) 2012.07.30

+ Recent posts