/* I wrote this program from scratch, based on the description of D.J. Bernstein's program: */ #define AUTHORS "Jim Meyering"//定义宏AUTHORS,这些宏,程序名、作者都是标准做法,给man等程序用的
fputs (_("\ Drop any supplemental groups, assume the user-ID and group-ID of\n\ the specified USERNAME, and run COMMAND with any specified ARGUMENTs.\n\ Exit with status 111 if unable to assume the required user and group ID.\n\ Otherwise, exit with the exit status of COMMAND.\n\ This program is useful only when run by root (user ID zero).\n\ \n\ "), stdout);//写的挺清楚的,丢弃任何补充的组信息,使用给定的用户名和组来运行程序,如果设置用户名和组失败,返回111,否则返回调用程序的返回值,这个程序对root来说很有用 fputs (HELP_OPTION_DESCRIPTION, stdout); fputs (VERSION_OPTION_DESCRIPTION, stdout); printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); } exit (status);//再次注意,调用usage帮助函数后,不是return继续运行,而是直接跳出了程序。 }
#if HAVE_SETGROUPS //条件编译,如果宏HAVE_SETGROUPS的值不是0,则执行以下的代码 if (setgroups (1, &pwd->pw_gid))//为当前进程设置一个组id error (SETUIDGID_FAILURE, errno, _("cannot set supplemental group"));//这就是经验,在调用setgroups这样的系统调用的时候,也进行了判断,如果系统调用失败,则调用error函数,告诉用户发生了什么,这说明并不是所有的系统调用也是不会失败的,一会我测试一下,不用root用户,估计就会失败 #endif//条件编译结束
if (setgid (pwd->pw_gid))//调用系统调用setgid,设置当前进程的有效gid,如果系统调用失败,同样调用error函数 error (SETUIDGID_FAILURE, errno, _("cannot set group-ID to %lu"), (unsigned long int) pwd->pw_gid);
if (setuid (pwd->pw_uid))//通setgid一样,setuid设置当前进程的有效uid,如果此系统调用失败,也调用error函数 error (SETUIDGID_FAILURE, errno, _("cannot set user-ID to %lu"), (unsigned long int) pwd->pw_uid);