Mercurial > hg > th-libs
annotate th_file.c @ 184:b256db93cf25
Initial import of th_file module.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 20 Jan 2016 16:40:05 +0200 |
parents | |
children | 5c7de25666e7 |
rev | line source |
---|---|
184
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
1 /* |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
2 * File, directory etc helper functions |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
3 * Programmed and designed by Matti 'ccr' Hamalainen |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
4 * (C) Copyright 2016 Tecnic Software productions (TNSP) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
5 * |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
6 * Please read file 'COPYING' for information on license and distribution. |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
7 */ |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
8 #include "th_file.h" |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
9 #include "th_string.h" |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
10 #include <unistd.h> |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
11 //#include <fcntl.h> |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
12 #ifdef TH_PLAT_WINDOWS |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
13 # include <shlwapi.h> |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
14 # include <shfolder.h> |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
15 #else |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
16 //# include <sys/wait.h> |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
17 # include <sys/stat.h> |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
18 # include <sys/types.h> |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
19 #endif |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
20 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
21 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
22 char * th_get_home_dir() |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
23 { |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
24 #if defined(TH_PLAT_WINDOWS) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
25 char tmpPath[MAX_PATH]; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
26 if (SHGetFolderPath(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, tmpPath) == S_OK) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
27 return th_strdup(tmpPath); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
28 #endif |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
29 return th_strdup(getenv("HOME")); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
30 } |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
31 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
32 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
33 char * th_get_data_dir() |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
34 { |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
35 #if defined(TH_PLAT_WINDOWS) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
36 char tmpPath[MAX_PATH]; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
37 if (SHGetFolderPath(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, tmpPath) == S_OK) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
38 return th_strdup(tmpPath); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
39 #endif |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
40 return th_strdup(getenv("HOME")); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
41 } |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
42 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
43 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
44 char * th_get_config_dir() |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
45 { |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
46 #if defined(TH_PLAT_WINDOWS) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
47 // For Windows, we just use the appdata directory |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
48 return th_get_data_dir(); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
49 #elif defined(USE_XDG) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
50 const char *xdgConfigDir = getenv("XDG_CONFIG_HOME"); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
51 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
52 // If XDG is enabled, try the environment variable first |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
53 if (xdgConfigDir != NULL && strcmp(xdgConfigDir, "")) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
54 return th_strdup_printf("%s" TH_DIR_SEPARATOR "%s" TH_DIR_SEPARATOR, xdgConfigDir, SET_XDG_CONFIG_DIR); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
55 else |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
56 // Nope, try the obvious alternative |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
57 return th_strdup_printf("%s" TH_DIR_SEPARATOR ".config" TH_DIR_SEPARATOR "%s" TH_DIR_SEPARATOR, |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
58 setHomeDir, SET_XDG_CONFIG_DIR); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
59 #else |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
60 // XDG not enabled |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
61 return th_get_data_dir(); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
62 #endif |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
63 } |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
64 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
65 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
66 BOOL th_stat_path(const char *path, int *flags) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
67 { |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
68 *flags = 0; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
69 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
70 #ifdef TH_PLAT_WINDOWS |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
71 DWORD attr = GetFileAttributes(path); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
72 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
73 *flags |= (attr & FILE_ATTRIBUTE_DIRECTORY) ? TH_IS_DIR : 0; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
74 *flags |= (attr & FILE_ATTRIBUTE_READONLY) ? 0 : TH_IS_WRITABLE; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
75 *flags |= TH_IS_READABLE; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
76 #else |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
77 uid_t id = geteuid(); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
78 struct stat sb; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
79 if (stat(path, &sb) < 0) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
80 return FALSE; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
81 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
82 *flags |= S_ISDIR(sb.st_mode) ? TH_IS_DIR : 0; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
83 *flags |= (id == sb.st_uid && (sb.st_mode & S_IWUSR)) ? TH_IS_WRITABLE : 0; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
84 *flags |= (id == sb.st_uid && (sb.st_mode & S_IRUSR)) ? TH_IS_READABLE : 0; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
85 #endif |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
86 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
87 return TRUE; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
88 } |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
89 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
90 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
91 BOOL th_mkdir_path(const char *cpath, int mode) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
92 { |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
93 char save, *path = th_strdup(cpath); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
94 size_t start = 0, end; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
95 BOOL res = FALSE; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
96 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
97 // If mode is 0, default to something sensible |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
98 if (mode == 0) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
99 mode = 0711; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
100 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
101 // Start creating the directory stucture |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
102 do |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
103 { |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
104 // Split foremost path element out |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
105 for (save = 0, end = start; path[end] != 0; end++) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
106 if (path[end] == TH_DIR_SEPARATOR) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
107 { |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
108 save = path[end]; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
109 path[end] = 0; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
110 break; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
111 } |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
112 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
113 // If the element is there, create it |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
114 if (path[start] != 0) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
115 { |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
116 int flags; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
117 BOOL exists = th_stat_path(path, &flags); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
118 if (exists && (flags & TH_IS_DIR) == 0) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
119 goto error; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
120 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
121 if (!exists) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
122 { |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
123 #ifdef TH_PLAT_WINDOWS |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
124 if (!CreateDirectory(path, NULL)) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
125 goto error; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
126 #else |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
127 if (mkdir(path, mode) < 0) |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
128 goto error; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
129 #endif |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
130 } |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
131 } |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
132 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
133 // Restore separator character and jump to next element |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
134 path[end] = save; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
135 start = end + 1; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
136 } while (save != 0); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
137 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
138 res = TRUE; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
139 |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
140 error: |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
141 th_free(path); |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
142 return res; |
b256db93cf25
Initial import of th_file module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
143 } |