⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 names.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/* $Source: /u/mark/src/pax/RCS/names.c,v $ * * $Revision: 1.2 $ * * names.c - Look up user and/or group names.  * * DESCRIPTION * *	These functions support UID and GID name lookup.  The results are *	cached to improve performance. * * AUTHOR * *	Mark H. Colburn, NAPS International (mark@jhereg.mn.org) * * Sponsored by The USENIX Association for public distribution.  * * Copyright (c) 1989 Mark H. Colburn. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice is duplicated in all such  * forms and that any documentation, advertising materials, and other  * materials related to such distribution and use acknowledge that the  * software was developed * by Mark H. Colburn and sponsored by The  * USENIX Association.  * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * $Log:	names.c,v $ * Revision 1.2  89/02/12  10:05:05  mark * 1.2 release fixes *  * Revision 1.1  88/12/23  18:02:19  mark * Initial revision *  */#ifndef lintstatic char *ident = "$Id: names.c,v 1.2 89/02/12 10:05:05 mark Exp $";static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";#endif /* ! lint *//* Headers */#include "pax.h"/* Defines */#define myuid	( my_uid < 0? (my_uid = getuid()): my_uid )#define	mygid	( my_gid < 0? (my_gid = getgid()): my_gid )/* Internal Identifiers */static int      saveuid = -993;static char     saveuname[TUNMLEN];static int      my_uid = -993;static int      savegid = -993;static char     savegname[TGNMLEN];static int      my_gid = -993;/* finduname - find a user or group name from a uid or gid * * DESCRIPTION * * 	Look up a user name from a uid/gid, maintaining a cache.  * * PARAMETERS * *	char	uname[]		- name (to be returned to user) *	int	uuid		- id of name to find * * * RETURNS * *	Returns a name which is associated with the user id given.  If there *	is not name which corresponds to the user-id given, then a pointer *	to a string of zero length is returned. *	 * FIXME * * 	1. for now it's a one-entry cache.  *	2. The "-993" is to reduce the chance of a hit on the first lookup.  */#ifdef __STDC__char *finduname(int uuid)#else    char *finduname(uuid)int             uuid;#endif{    struct passwd  *pw;    if (uuid != saveuid) {	saveuid = uuid;	saveuname[0] = '\0';	pw = getpwuid(uuid);	if (pw) {	    strncpy(saveuname, pw->pw_name, TUNMLEN);	}    }    return(saveuname);}/* finduid - get the uid for a given user name * * DESCRIPTION * *	This does just the opposit of finduname.  Given a user name it *	finds the corresponding UID for that name. * * PARAMETERS * *	char	uname[]		- username to find a UID for * * RETURNS * *	The UID which corresponds to the uname given, if any.  If no UID *	could be found, then the UID which corrsponds the user running the *	program is returned. * */#ifdef __STDC__int finduid(char *uname)#else    int finduid(uname)char            *uname;#endif{    struct passwd  *pw;    extern struct passwd *getpwnam();    if (uname[0] != saveuname[0]/* Quick test w/o proc call */	||0 != strncmp(uname, saveuname, TUNMLEN)) {	strncpy(saveuname, uname, TUNMLEN);	pw = getpwnam(uname);	if (pw) {	    saveuid = pw->pw_uid;	} else {	    saveuid = myuid;	}    }    return (saveuid);}/* findgname - look up a group name from a gid * * DESCRIPTION * * 	Look up a group name from a gid, maintaining a cache. *	 * * PARAMETERS * *	int	ggid		- goupid of group to find * * RETURNS * *	A string which is associated with the group ID given.  If no name *	can be found, a string of zero length is returned. */#ifdef __STDC__char *findgname(int ggid)#else    char *findgname(ggid)int             ggid;#endif{    struct group   *gr;    if (ggid != savegid) {	savegid = ggid;	savegname[0] = '\0';#ifndef _POSIX_SOURCE	setgrent();#endif	gr = getgrgid(ggid);	if (gr) {	    strncpy(savegname, gr->gr_name, TGNMLEN);	}    }    return(savegname);}/* findgid - get the gid for a given group name * * DESCRIPTION * *	This does just the opposit of finduname.  Given a group name it *	finds the corresponding GID for that name. * * PARAMETERS * *	char	uname[]		- groupname to find a GID for * * RETURNS * *	The GID which corresponds to the uname given, if any.  If no GID *	could be found, then the GID which corrsponds the group running the *	program is returned. * */#ifdef __STDC__int findgid(char *gname)#else    int findgid(gname)char           *gname;#endif{    struct group   *gr;    /* Quick test w/o proc call */    if (gname[0] != savegname[0] || strncmp(gname, savegname, TUNMLEN) != 0) {	strncpy(savegname, gname, TUNMLEN);	gr = getgrnam(gname);	if (gr) {	    savegid = gr->gr_gid;	} else {	    savegid = mygid;	}    }    return (savegid);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -