1
by Frank Lichtenheld
Import upstream version 2.3 |
1 |
#define CCACHE_VERSION "2.3"
|
2 |
||
3 |
#include "config.h" |
|
4 |
||
5 |
#include <stdio.h> |
|
6 |
#include <unistd.h> |
|
7 |
#include <stdlib.h> |
|
8 |
#include <errno.h> |
|
9 |
#include <sys/stat.h> |
|
10 |
#include <sys/types.h> |
|
11 |
#include <sys/wait.h> |
|
12 |
#include <sys/mman.h> |
|
13 |
#include <sys/file.h> |
|
14 |
#include <fcntl.h> |
|
15 |
#include <time.h> |
|
16 |
#include <string.h> |
|
17 |
#include <ctype.h> |
|
18 |
#include <utime.h> |
|
19 |
#include <stdarg.h> |
|
20 |
#include <dirent.h> |
|
21 |
#include <limits.h> |
|
22 |
||
23 |
#define STATUS_NOTFOUND 3
|
|
24 |
#define STATUS_FATAL 4
|
|
25 |
#define STATUS_NOCACHE 5
|
|
26 |
||
27 |
#define MYNAME "ccache"
|
|
28 |
||
29 |
#define LIMIT_MULTIPLE 0.8
|
|
30 |
||
31 |
/* default maximum cache size */
|
|
32 |
#ifndef DEFAULT_MAXSIZE
|
|
33 |
#define DEFAULT_MAXSIZE (1000*1000)
|
|
34 |
#endif
|
|
35 |
||
36 |
enum stats { |
|
37 |
STATS_NONE=0, |
|
38 |
STATS_STDOUT, |
|
39 |
STATS_STATUS, |
|
40 |
STATS_ERROR, |
|
41 |
STATS_TOCACHE, |
|
42 |
STATS_PREPROCESSOR, |
|
43 |
STATS_COMPILER, |
|
44 |
STATS_MISSING, |
|
45 |
STATS_CACHED, |
|
46 |
STATS_ARGS, |
|
47 |
STATS_LINK, |
|
48 |
STATS_NUMFILES, |
|
49 |
STATS_TOTALSIZE, |
|
50 |
STATS_MAXFILES, |
|
51 |
STATS_MAXSIZE, |
|
52 |
STATS_NOTC, |
|
53 |
STATS_DEVICE, |
|
54 |
STATS_NOINPUT, |
|
55 |
STATS_MULTIPLE, |
|
56 |
STATS_CONFTEST, |
|
57 |
STATS_UNSUPPORTED, |
|
58 |
STATS_OUTSTDOUT, |
|
59 |
||
60 |
STATS_END
|
|
61 |
};
|
|
62 |
||
63 |
typedef unsigned uint32; |
|
64 |
||
65 |
#include "mdfour.h" |
|
66 |
||
67 |
void hash_start(void); |
|
68 |
void hash_string(const char *s); |
|
69 |
void hash_int(int x); |
|
70 |
void hash_file(const char *fname); |
|
71 |
char *hash_result(void); |
|
72 |
void hash_buffer(const char *s, int len); |
|
73 |
||
74 |
void cc_log(const char *format, ...); |
|
75 |
void fatal(const char *msg); |
|
76 |
||
77 |
void copy_fd(int fd_in, int fd_out); |
|
78 |
int copy_file(const char *src, const char *dest); |
|
79 |
||
80 |
int create_dir(const char *dir); |
|
81 |
void x_asprintf(char **ptr, const char *format, ...); |
|
82 |
char *x_strdup(const char *s); |
|
83 |
void *x_realloc(void *ptr, size_t size); |
|
84 |
void *x_malloc(size_t size); |
|
85 |
void traverse(const char *dir, void (*fn)(const char *, struct stat *)); |
|
86 |
char *str_basename(const char *s); |
|
87 |
char *dirname(char *s); |
|
88 |
int lock_fd(int fd); |
|
89 |
size_t file_size(struct stat *st); |
|
90 |
int safe_open(const char *fname); |
|
91 |
char *x_realpath(const char *path); |
|
92 |
char *gnu_getcwd(void); |
|
93 |
int create_empty_file(const char *fname); |
|
94 |
||
95 |
void stats_update(enum stats stat); |
|
96 |
void stats_zero(void); |
|
97 |
void stats_summary(void); |
|
98 |
void stats_tocache(size_t size); |
|
99 |
void stats_read(const char *stats_file, unsigned counters[STATS_END]); |
|
100 |
void stats_set_limits(long maxfiles, long maxsize); |
|
101 |
size_t value_units(const char *s); |
|
102 |
void display_size(unsigned v); |
|
103 |
void stats_set_sizes(const char *dir, size_t num_files, size_t total_size); |
|
104 |
||
105 |
int unify_hash(const char *fname); |
|
106 |
||
107 |
#ifndef HAVE_VASPRINTF
|
|
108 |
int vasprintf(char **, const char *, va_list ); |
|
109 |
#endif
|
|
110 |
#ifndef HAVE_ASPRINTF
|
|
111 |
int asprintf(char **ptr, const char *format, ...); |
|
112 |
#endif
|
|
113 |
||
114 |
#ifndef HAVE_SNPRINTF
|
|
115 |
int snprintf(char *,size_t ,const char *, ...); |
|
116 |
#endif
|
|
117 |
||
118 |
void cleanup_dir(const char *dir, size_t maxfiles, size_t maxsize); |
|
119 |
void cleanup_all(const char *dir); |
|
120 |
void wipe_all(const char *dir); |
|
121 |
||
122 |
int execute(char **argv, |
|
123 |
const char *path_stdout, |
|
124 |
const char *path_stderr); |
|
125 |
char *find_executable(const char *name, const char *exclude_name); |
|
126 |
||
127 |
typedef struct { |
|
128 |
char **argv; |
|
129 |
int argc; |
|
130 |
} ARGS; |
|
131 |
||
132 |
||
133 |
ARGS *args_init(int , char **); |
|
134 |
void args_add(ARGS *args, const char *s); |
|
135 |
void args_add_prefix(ARGS *args, const char *s); |
|
136 |
void args_pop(ARGS *args, int n); |
|
137 |
void args_strip(ARGS *args, const char *prefix); |
|
138 |
void args_remove_first(ARGS *args); |
|
139 |
||
140 |
#if HAVE_COMPAR_FN_T
|
|
141 |
#define COMPAR_FN_T __compar_fn_t
|
|
142 |
#else
|
|
143 |
typedef int (*COMPAR_FN_T)(const void *, const void *); |
|
144 |
#endif
|