aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLAN-TW <lantw44@gmail.com>2012-09-21 08:16:32 +0800
committerLAN-TW <lantw44@gmail.com>2012-09-21 08:16:32 +0800
commit29d8911510eef6155ffd29596be036df3c6b8e4c (patch)
tree00cb2e6486fdde00df2d20750e6db7d90bd9f1dd
parent2c3b537131707a966abdb1a79ba203f14cbade4b (diff)
downloadsctjudge-29d8911510eef6155ffd29596be036df3c6b8e4c.tar.gz
sctjudge-29d8911510eef6155ffd29596be036df3c6b8e4c.tar.zst
sctjudge-29d8911510eef6155ffd29596be036df3c6b8e4c.zip
加入 UID/GID 與名稱轉換的功能
這樣以後就可以只輸入使用者或群組名稱,而不需要手動去把 UID/GID 找出。
-rw-r--r--configure.ac5
-rw-r--r--src/main.c33
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
diff --git a/src/main.c b/src/main.c
index da40b8f..5200104 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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],