NFSSVC(2)

명칭
nfssvc - NFS nfssvc - NFS 서비스

프로그램 라이브러리
libc

서식
<sys/param.h> <sys/mount.h> <sys/time.h> <nfs/rpcv2.h> <nfs/nfs.h> <unistd.h> int nfssvc(int flags, void *argstructp)

해설
nfssvc() 함수는, NFS demon가, 정보를 커널안에 건네주거나 커널로부터 밖으로 건네주거나 하는데 사용되어 또, NFS demon가 서버 demon로서 커널에 들어가는데도 사용됩니다. flags 인수는, 커널내에서 어떠한 처리를 실행하는지를 나타낸다 몇개의 비트로 구성되어 있어 argstructp (은)는, flags 인수로 어느 비트가 설정되었는지를 따라서 3 개 있는 구조체 중 1 개를 가리킵니다.

클라이언트측에서는, nfsiod(8) 하 flags 인수를 NFSSVC_BIOD (으)로 설정해, argstructp (을)를 NULL (으)로 설정해 nfssvc() (을)를 호출해, 블록 입출력 서버 demon로서 커널에 들어갑니다. NQNFS 의 경우, mount_nfs(8) 하 NFSSVC_MNTD 플래그를, 또, 옵션으로 NFSSVC_GOTAUTH (와)과 NFSSVC_AUTHINFAIL 의 논리합 (or)을 취한 것을 설정해, 다음의 구조체를 가리키는 포인터와 함께 nfssvc() (을)를 호출합니다.

    struct nfsd_cargs {
    	char		*ncd_dirp;	/* mount 디렉토리 패스 */
    	uid_t		ncd_authuid;	/* 실효 uid */
    	int		ncd_authtype;	/* 인증의 타입 */
    	int		ncd_authlen;	/* 인증 캐릭터 라인의 길이 */
    	u_char		*ncd_authstr;	/* 인증 캐릭터 라인 */
    	int		ncd_verflen;	/* 및 검증 기능 */
    	u_char		*ncd_verfstr;
    	NFSKERBKEY_T	ncd_key;	/* 세션 키 */
    };

최초의 호출에서는, 마운트 포인트에 대한 서비스를 지정한다 NFSSVC_MNTD 플래그만이 설정되어 있습니다. 마운트 포인트가 Kerberos 를 사용하고 있는 경우, 클라이언트측이 유저용의 ``rcmd''인증 티켓을 요구할 때마다, mount_nfs(8) demon는, errno == ENEEDAUTH 로 nfssvc() (으)로부터 돌아옵니다. mount_nfs(8) (은)는, Kerberos 티켓을 취득하려고 해, 성공하면(자), nfsd_cargs 구조체의 ncd_authstr 필드에 티켓을 입금시켜 ncd_authlen 필드와 ncd_authtype 필드를 설정한 다음에, 플래그 NFSSVC_MNTD 및 NFSSVC_GOTAUTH (을)를 지정해 nfssvc() (을)를 호출합니다. mount_nfs(8) 하지만 티켓을 취득하는데 실패했을 경우, nfssvc() (은)는, 플래그 NFSSVC_MNTD, NFSSVC_GOTAUTH 및 NFSSVC_AUTHINFAIL (을)를 지정해 불려 가, 인증의 시도가 실패한 것을 나타냅니다.

서버측에서는, nfssvc() 하지만 플래그 NFSSVC_NFSD (와)과 다음의 구조체를 가리키는 포인터와 함께 불려 가, nfsd(8) demon로서 커널에 들어갑니다.

    struct nfsd_srvargs {
    	struct nfsd	*nsd_nfsd;	/*
    					 * 커널내의 nfsd struct 를
    					 * 가리키는 포인터
    					 */
    	uid_t		nsd_uid;	/* cred 에 MAP 되는 실효 uid*/
    	u_int32t	nsd_haddr;	/* 클라이언트의 IP 주소 */
    	struct ucred	nsd_cr;		/* Cred.  uid 의 MAP 행선지 */
    	int		nsd_authlen;	/* 인증 캐릭터 라인의 길이 (귀가) */
    	u_char		*nsd_authstr;	/* 인증 캐릭터 라인 (귀가) */
    	int		nsd_verflen;	/* 및 검증 기능 */
    	u_char		*nsd_verfstr;
    	struct timeval	nsd_timestamp;	/* 검증 기능으로부터의 타임 스탬프 */
    	u_int32t	nsd_ttl;	/* 증서의 지속 시간 (초) */
    	NFSKERBKEY_T	nsd_key;	/* 세션 키 */
    };

nfsd(8) demon는, Kerberos 인증 티켓을 수신할 때마다, nfssvc() (으)로부터 errno == ENEEDAUTH 로 돌아옵니다. nfsd(8) (은)는, 티켓을 인증해, 필드 nsd_uid 로 지정되었다 ``user id''용무의 일련의 증서를 서버상에서 생성하려고 합니다. 이것을 실시하려면 , 최초로 Kerberos 티켓을 인증하고 나서, Kerberos 의 주체명 (principal)을 로컬명에 MAP 해, getpwnam(3) (와)과 getgrouplist(3) 경유로 그 유저에 대한 일련의 증서를 얻습니다. 정상적으로 완료하면(자), nfsd(8) (은)는, NFSSVC_NFSD 플래그와 NFSSVC_AUTHIN 플래그를 설정해 nfssvc() (을)를 호출해, nsd_cr 내의 증서의 매핑을 커널에 건네주어, 그 클라이언트용의 서버 소켓상에서 MAP가 캐쉬되도록(듯이) 합니다. 인증이 실패했을 경우, nfsd(8) (은)는 플래그 NFSSVC_NFSD 및 NFSSVC_AUTHINFAIL (을)를 설정해 nfssvc() (을)를 호출해, 인증이 실패한 것을 나타냅니다.

nfsd(8) 마스터 서버 demon는, 플래그 NFSSVC_ADDSOCK 및 다음의 구조체를 가리키는 포인터를 설정해 nfssvc() (을)를 호출해, nfsd(8) demon가 서비스를 실시할 수 있도록(듯이) 서버측의 NFS 소켓을 커널에 건네줍니다.

    struct nfsd_args {
    	int	sock;	/* 서비스를 실시하는 소켓 */
    	caddr_t	name;	/* 접속 지향의 소켓의 클라이언트 주소 */
    	int	namelen;/* 이름의 길이 */
    };

반환값
통상, nfssvc() (은)는, 서버가 시그널에 의해 종료될 때를 제외해 돌아오지 않습니다. 이 때에는, 값 0 이 돌려주어집니다. 그렇지 않은 경우는,-1 이 돌려주어져 에러를 지정하기 위해서 글로벌 변수 errno 하지만 설정됩니다.

에러

[ENEEDAUTH]
    이 특수한 에러치는, 실제로는 인증 서포트용, 특히, 전술한 Kerberos 용으로 사용됩니다.

[EPERM]
    호출측이 슈퍼 유저가 아닙니다.

관련 항목
mount_nfs(8), nfsd(8), nfsiod(8)

역사
nfssvc() 함수는 4.4BSD 그리고 처음 등장했습니다.

버그
nfssvc() 시스템 콜은 NFS 서포트용으로 특별히 설계되고 있습니다. 그러한 것이기 때문에, NFS 의 요구 정의에 특별히 따른 것에 되어 있습니다. 본래라면, 인증 서포트가 필요한 것을 나타내는 값을 돌려줄 필요가 있습니다. 왜냐하면, ENEEDAUTH (은)는 본래라면 에러는 아니기 때문입니다. 인수인 구조체의 몇개의 필드는 정당한 것이라고 가정되고 있어 직전의 호출로부터 변경되지 않는 것이 가끔 있습니다. 이 같다 것으로, nfssvc() (은)는 특히 주위를 기울여 사용하지 않으면 안됩니다.