| Index: ccache.c |
| =================================================================== |
| --- ccache.c (révision 7695) |
| +++ ccache.c (copie de travail) |
| @@ -1029,6 +1029,14 @@ |
| exit(1); |
| } |
| |
| + if (!getenv("CCACHE_READONLY")) { |
| + if (create_cachedirtag(cache_dir) != 0) { |
| + fprintf(stderr,"ccache: failed to create %s/CACHEDIR.TAG (%s)\n", |
| + cache_dir, strerror(errno)); |
| + exit(1); |
| + } |
| + } |
| + |
| ccache(argc, argv); |
| return 1; |
| } |
| Index: ccache.h |
| =================================================================== |
| --- ccache.h (révision 7695) |
| +++ ccache.h (copie de travail) |
| @@ -81,6 +81,7 @@ |
| int copy_file(const char *src, const char *dest); |
| |
| int create_dir(const char *dir); |
| +int create_cachedirtag(const char *dir); |
| void x_asprintf(char **ptr, const char *format, ...); |
| char *x_strdup(const char *s); |
| void *x_realloc(void *ptr, size_t size); |
| Index: util.c |
| =================================================================== |
| --- util.c (révision 7695) |
| +++ util.c (copie de travail) |
| @@ -138,6 +138,39 @@ |
| return 0; |
| } |
| |
| +char const CACHEDIR_TAG[] = |
| + "Signature: 8a477f597d28d172789f06886806bc55\n" |
| + "# This file is a cache directory tag created by ccache.\n" |
| + "# For information about cache directory tags, see:\n" |
| + "# http://www.brynosaurus.com/cachedir/\n"; |
| + |
| +int create_cachedirtag(const char *dir) |
| +{ |
| + char *filename; |
| + struct stat st; |
| + FILE *f; |
| + x_asprintf(&filename, "%s/CACHEDIR.TAG", dir); |
| + if (stat(filename, &st) == 0) { |
| + if (S_ISREG(st.st_mode)) { |
| + goto success; |
| + } |
| + errno = EEXIST; |
| + goto error; |
| + } |
| + f = fopen(filename, "w"); |
| + if (!f) goto error; |
| + if (fwrite(CACHEDIR_TAG, sizeof(CACHEDIR_TAG)-1, 1, f) != 1) { |
| + goto error; |
| + } |
| + if (fclose(f)) goto error; |
| +success: |
| + free(filename); |
| + return 0; |
| +error: |
| + free(filename); |
| + return 1; |
| +} |
| + |
| /* |
| this is like asprintf() but dies if the malloc fails |
| note that we use vsnprintf in a rather poor way to make this more portable |