GETLOGIN(2)

명칭
getlogin, getlogin_r, setlogin - 로그인명을 취득 / 설정

프로그램 라이브러리
libc

서식
<unistd.h> char * getlogin(void) <sys/param.h> int getlogin_r(char *name, int len) int setlogin(const char *name)

해설
getlogin() routine는, setlogin() 그리고 설정한 현재의 세션에 대응한다 유저의 로그인명을 돌려줍니다. 통상, 이름은 세션이 작성된 시점에서 로그인 쉘에 대응해, 로그인 쉘로부터 파생하는 모든 프로세스에 계승됩니다 (이러한 프로세스가 다른 유저 ID 를 상정하고 있는 경우, 예를 들어, su(1) 하지만 사용될 때에도 해당합니다).

getlogin_r() 하 getlogin() (와)과 같은 서비스를 제공합니다만, 호출측은 결과를 보관 유지하기 위한 길이 len 바이트의 버퍼 name (을)를 준비하지 않으면 안됩니다. 버퍼는 적어도 MAXLOGNAME 바이트의 길이가 있어야 합니다.

setlogin() (은)는, 현재의 세션에 대응하는 유저의 로그인명을 name 에 대응시킵니다. 이 호출은 슈퍼 유저에게 제한되고 있어 새로운 세션이 유저를 위해서(때문에) 작성될 때만 사용되는 것이 보통입니다 (예를 들어, 로그인시, 또는 리모트 쉘이 기동될 때입니다).

주석: 세션 마다 1 개의 로그인명 밖에 없습니다.

프로세스가, 확실히 부모의 세션으로부터 떼어내지는 것 같은 적절한 스텝을 취한 후에게만, setlogin() 하지만 불려 가도록(듯이) 하는 것은 매우 중요합니다. setsid() 시스템 콜 (을)를 행하는 것이 이것을 한다 유일한 방법입니다. daemon() 프로그램 라이브러리는 setsid() (을)를 호출합니다만, 이것은 제어 단말을 떼어내 포크로 백그라운드에 들어가는 이상적인 방법입니다.

특히, ioctl(ttyfd, TIOCNOTTY, ...) 또는 setpgrp(...) 그럼 충분한 것은 없습니다.

parent process가 일단 setsid() 호출을 행하면, 세션 리더가 아니다 그 프로세스의 아이가 setlogin() (을)를 행하는 일도 받아들여집니다만, 부모를 포함해 세션내의 모든 프로세스가 동시에 로그인명이 변경되는 것에 주의해 주세요.

이것은 특권을 계승하는 종래의 UNIX 의 동작과 같지는 않습니다.

setlogin() 시스템 콜은 슈퍼 유저에게 제한되고 있으므로, 보안 침범을 방지하기 위해서 (다른 특권이 있는 모든 프로그램과 같이) 프로그래머가 적절한 주위를 기울이는 것이라고 가정하고 있습니다.

반환값
getlogin() 의 호출이 성공하면(자), 정적 버퍼내의 눌로 종단 된 캐릭터 라인에의 포인터가 돌려주어집니다. 이름이 설정되어 있지 않은 경우는, NULL 하지만 돌려주어집니다. getlogin_r() 의 호출이 성공하면(자), 0 이 돌려주어집니다. 실패하면(자) 에러 번호 하지만 돌려주어집니다.

에러
이러한 호출에 의해 이하의 에러가 돌려주어질 가능성이 있습니다.

[EFAULT]
    name 파라미터로 무효인 주소를 주었습니다.

[EINVAL]
    name 파라미터가 너무 긴 캐릭터 라인을 가리키고 있습니다. 로그인명은 (<sys/param.h> 의) MAXLOGNAME 캐릭터까지 제한됩니다. 현시점에서는 눌을 포함해 17 캐릭터입니다.

[EPERM]
    로그인명을 설정하려고 한 호출원이 슈퍼 유저가 아니었습니다.

[ERANGE]
    돌려주어지는 결과보다 버퍼의 사이즈가 너무 작습니다.

관련 항목
setsid(2), daemon(3)

버그
시스템의 이전의 버젼에서는, getlogin() (은)는 프로세스가 로그인 단말에 대응하고 있지 않는 한 처리에 실패했습니다. 현재는, (setlogin() (을)를 사용해) 프로세스에 제어 단말이 없을 때에서도 getlogin 는 정상적으로 완료합니다. 초기의 버젼에서는, getlogin() 하지만 돌려주는 값은 유저 ID 를 체크하지 않고에는 신뢰할 수가 없었습니다. 이식성의 높은 프로그램은 아마 아직 이 체크를 행하고 있을 것입니다.

역사
getlogin() 함수는 4.4BSD 그리고 처음 등장했습니다. getlogin_r() 의 반환값은 p1003.1-96 에 준거하기 위해서 FreeBSD 의 초기의 버젼으로부터 변경되었습니다.

표준
getlogin() (와)과 getlogin_r() 하 p1003.1-96 에 준거하고 있습니다.