diff options
author | LAN-TW <lantw44@gmail.com> | 2012-09-21 08:16:32 +0800 |
---|---|---|
committer | LAN-TW <lantw44@gmail.com> | 2012-09-21 08:16:32 +0800 |
commit | 29d8911510eef6155ffd29596be036df3c6b8e4c (patch) | |
tree | 00cb2e6486fdde00df2d20750e6db7d90bd9f1dd | |
parent | 2c3b537131707a966abdb1a79ba203f14cbade4b (diff) | |
download | sctjudge-29d8911510eef6155ffd29596be036df3c6b8e4c.tar.gz sctjudge-29d8911510eef6155ffd29596be036df3c6b8e4c.tar.zst sctjudge-29d8911510eef6155ffd29596be036df3c6b8e4c.zip |
加入 UID/GID 與名稱轉換的功能
這樣以後就可以只輸入使用者或群組名稱,而不需要手動去把 UID/GID 找出。
-rw-r--r-- | configure.ac | 5 | ||||
-rw-r--r-- | src/main.c | 33 |
2 files changed, 35 insertions, 3 deletions
diff --git a/configure.ac b/configure.ac index c9630a1..0661c5e 100644 --- a/configure.ac +++ b/configure.ac @@ -117,9 +117,12 @@ AC_TYPE_SIZE_T # Checks for library functions. AC_FUNC_FORK AC_FUNC_MALLOC -AC_CHECK_FUNCS([clock_gettime dup2 memset setlocale strchr strerror strrchr], +AC_CHECK_FUNCS([clock_gettime dup2 memset setlocale strchr strerror strrchr getuid getpid setpgid wait4 fcntl fchown open close setrlimit chmod unlink], [], AC_MSG_ERROR(This program requires all these functions!)) +AC_CHECK_FUNCS([getpwnam getgrnam getpwuid getgrgid], + AC_DEFINE([HAVE_CONF_UGIDNAME], [1], + [Conversion between user or group ID and name]), []) AC_CONFIG_FILES([Makefile sctjudge.spec src/Makefile src/version.h]) AC_OUTPUT @@ -12,8 +12,11 @@ #include <string.h> #include <locale.h> #include <time.h> +#include <grp.h> +#include <pwd.h> #include <sys/time.h> #include <sys/resource.h> +#include <sys/types.h> #include <pthread.h> #include <semaphore.h> @@ -75,6 +78,10 @@ int main(int argc, char* argv[]){ char verbose=0; /* 0 是安靜模式(機器模式)、1 是 verbose、2 是 debug */ char dryrun=0, force=0; L4QARG* qarglist; +#ifdef HAVE_CONF_UGIDNAME + struct passwd* pwinfo; + struct group* grinfo; +#endif /* 預設值當然都是 0 */ memset(&mcopt, 0 ,sizeof(mcopt)); @@ -234,9 +241,20 @@ int main(int argc, char* argv[]){ mcopt.flags |= SCTMC_SETUID; if(sscanf(qarglist[j].arg_value, "%u", &mcopt.uid) <= 0){ - fprintf(stderr, "%s: 「%s」並不是整數\n", +#ifdef HAVE_CONF_UGIDNAME + pwinfo = getpwnam(qarglist[j].arg_value); + if(pwinfo == NULL){ + fprintf(stderr, "%s: 「%s」不是正確的 UID 或" + "使用者名稱\n", + argv[0], qarglist[j].arg_value); + exit(SCTEXIT_SYNTAX); + } + mcopt.uid = pwinfo->pw_uid; +#else + fprintf(stderr, "%s: 「%s」並不是整數\n", argv[0], qarglist[j].arg_value); exit(SCTEXIT_SYNTAX); +#endif } }else if(!strcmp(qarglist[j].arg_name, "gid") || !strcmp(qarglist[j].arg_name, "group")){ @@ -244,9 +262,20 @@ int main(int argc, char* argv[]){ mcopt.flags |= SCTMC_SETGID; if(sscanf(qarglist[j].arg_value, "%u", &mcopt.gid) <= 0){ - fprintf(stderr, "%s: 「%s」並不是整數\n", +#ifdef HAVE_CONF_UGIDNAME + grinfo = getgrnam(qarglist[j].arg_value); + if(grinfo == NULL){ + fprintf(stderr, "%s: 「%s」不是正確的 GID 或" + "群組名稱\n", + argv[0], qarglist[j].arg_value); + exit(SCTEXIT_SYNTAX); + } + mcopt.gid = grinfo->gr_gid; +#else + fprintf(stderr, "%s: 「%s」並不是整數\n", argv[0], qarglist[j].arg_value); exit(SCTEXIT_SYNTAX); +#endif } }else{ fprintf(stderr, "%s: 「%s」是不明的選項\n", argv[0], |