aboutsummaryrefslogtreecommitdiffstats
path: root/src/SctCommon.h
blob: a26d5ac54c4fe67dccaf8b34c1e2bc5761ebb88a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#ifndef SCTJUDGE_SCT_COMMON
#define SCTJUDGE_SCT_COMMON

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>

/* --- SctCommon.c --- */

/* 字串轉整數 wrapper */
int str_to_u(const char*, unsigned*);

/* 一定要讀到 count 位元組的資料才會回傳,所以只要回傳 < count
 * 就表示已經讀到 EOF 了 */
int read_complete(int fd, void* buf, size_t count);



/* 安全的 strerror */
int strerror_threadsafe(int, char*, size_t);

/* 會自動配置空間的 sprintf */
int sprintf_malloc(char**, const char*, ...);


/* 將某個 timespec 調整成合理的數值 */
void checktimespec(struct timespec*);

/* 計算前兩個 timespec 的數值差異,存到第三個參數 */
void difftimespec(const struct timespec*, const struct timespec*,
        struct timespec*);

/* 比較兩個 timespec 的大小,使用方法與 strcmp 相同 */
int comparetimespec(const struct timespec*, const struct timespec*);



/* 這個一定要先執行,不然預設 uid 就是 0 
 * 注意這函式只應該在 main() 一開始執行,不然就不知道最初的 uid 了! */
void save_uids(void);    

#ifndef HAVE_CONF_CAP
void disable_setuid(void);
void enable_setuid(void);
#endif

/* 避免 disable_setuid() 之後 getuid() 得到錯誤的值,所以用這些變數把最初的
 * UID 給記下來!*/
extern uid_t procrealuid;
extern uid_t proceffuid;





/* --- SctMain.c --- */

/* 如果不是 NULL 就 free 掉它 */
#define FREE_IF_NOT_NULL(p) \
    if((p) != NULL){ \
        free(p); \
    } \
    (p) = NULL

/* 如果是 NULL 就替換成 "(NULL)" */
#define STRING_NULL(p) \
    ((p) == NULL) ? ("(NULL)") : (p)

/* 測試 flag 是 yes 還是 no 並轉成字串 */
#define DISPLAY_YESNO(flag, value) \
    (((flag) & (value)) ? ("Yes") : ("No"))

/* sctjudge 的使用者界面選擇 */
#define SCTJUDGE_UI_CLI 0
#define SCTJUDGE_UI_TUI 1
#define SCTJUDGE_UI_GUI 2

/* sctjudge 這個程式的 exit status 
 * 注意,檢測 malloc 失敗的東西已經去掉了 */
#define SCTJUDGE_EXIT_SUCCESS   0  /* 當然就是正常結束 */
#define SCTJUDGE_EXIT_SYNTAX    1  /* 解析階段:命令列語法錯誤 */
#define SCTJUDGE_EXIT_INVALID   2  /* 配置無效或需要強制執行 */
#define SCTJUDGE_EXIT_INSECURE  3  /* 不安全的設定值 */
#define SCTJUDGE_EXIT_REJECT    4  /* 拒絕此參數或需要強制執行 */
#define SCTJUDGE_EXIT_NA      255  /* 尚未實作的功能 */

#endif