aboutsummaryrefslogtreecommitdiffstats
path: root/src/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common.c')
-rw-r--r--src/common.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/common.c b/src/common.c
new file mode 100644
index 0000000..3bc7cdb
--- /dev/null
+++ b/src/common.c
@@ -0,0 +1,89 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "common.h"
+
+#include <time.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#ifndef HAVE_CONF_CAP
+static uid_t procrealuid = 0;
+static uid_t proceffuid = 0;
+#endif
+
+void checktimespec(struct timespec* arg){
+ long tominus;
+ if(arg->tv_nsec >= 1000000000){
+ arg->tv_sec += (arg->tv_nsec / 1000000000);
+ arg->tv_nsec %= 1000000000;
+ }else if(arg->tv_nsec < 0){
+ if((-(arg->tv_nsec)) % 1000000000 == 0){
+ arg->tv_sec -= ((-(arg->tv_nsec)) / 1000000000);
+ arg->tv_nsec = 0;
+ }else{
+ tominus = (((-(arg->tv_nsec)) / 1000000000) + 1);
+ arg->tv_sec -= tominus;
+ arg->tv_nsec += tominus * 1000000000;
+ }
+ }
+}
+
+void difftimespec(start, end, out)
+ const struct timespec* start;
+ const struct timespec* end;
+ struct timespec* out;
+{
+ out->tv_sec = end->tv_sec - start->tv_sec;
+ out->tv_nsec = end->tv_nsec - start->tv_nsec;
+ if(out->tv_nsec < 0){
+ out->tv_nsec += 1000000000;
+ out->tv_sec--;
+ }
+}
+
+int comparetimespec(t1, t2)
+ const struct timespec* t1;
+ const struct timespec* t2;
+{
+ if(t1->tv_sec < t2->tv_sec){
+ return -1;
+ }else if(t1->tv_sec > t2->tv_sec){
+ return 1;
+ }else{
+ if(t1->tv_nsec < t2->tv_nsec){
+ return -1;
+ }else if(t1->tv_nsec > t2->tv_nsec){
+ return 1;
+ }else{
+ return 0;
+ }
+ }
+ return 0;
+}
+
+#ifndef HAVE_CONF_CAP
+
+void save_uids(void){ /* 這個一定要先執行,不然預設 uid 就是 0 */
+ procrealuid = getuid();
+ proceffuid = geteuid();
+}
+
+void disable_setuid(void){
+#ifdef _POSIX_SAVED_IDS
+ seteuid(procrealuid);
+#else
+ setreuid(proceffuid, procrealuid);
+#endif
+}
+
+void enable_setuid(void){
+#ifdef _POSIX_SAVED_IDS
+ seteuid(proceffuid);
+#else
+ setreuid(procrealuid, proceffuid);
+#endif
+}
+
+#endif