diff options
author | Jerzi Kaminsky <JerziKaminsky@users.noreply.github.com> | 2017-04-14 23:37:43 +0300 |
---|---|---|
committer | Jerzi Kaminsky <JerziKaminsky@users.noreply.github.com> | 2017-04-16 17:09:53 +0300 |
commit | c9694ee63d451da62dc50b234b3080a35a40e844 (patch) | |
tree | cb826b8dba53c28dff9b1c440007e1b21a6fba5e /common/util.c | |
parent | Add validate_ipc_target() (diff) | |
download | sway-c9694ee63d451da62dc50b234b3080a35a40e844.tar.gz sway-c9694ee63d451da62dc50b234b3080a35a40e844.tar.zst sway-c9694ee63d451da62dc50b234b3080a35a40e844.zip |
Add resolve_path() to utils
Diffstat (limited to 'common/util.c')
-rw-r--r-- | common/util.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/common/util.c b/common/util.c index 12ed0cdc..a9e6a9c2 100644 --- a/common/util.c +++ b/common/util.c | |||
@@ -1,3 +1,7 @@ | |||
1 | #define _XOPEN_SOURCE 500 | ||
2 | #include <sys/types.h> | ||
3 | #include <sys/stat.h> | ||
4 | #include <unistd.h> | ||
1 | #include <math.h> | 5 | #include <math.h> |
2 | #include <stdint.h> | 6 | #include <stdint.h> |
3 | #include <stdio.h> | 7 | #include <stdio.h> |
@@ -118,3 +122,40 @@ uint32_t parse_color(const char *color) { | |||
118 | } | 122 | } |
119 | return res; | 123 | return res; |
120 | } | 124 | } |
125 | |||
126 | char* resolve_path(const char* path) { | ||
127 | struct stat sb; | ||
128 | ssize_t r; | ||
129 | int i; | ||
130 | char *current = NULL; | ||
131 | char *resolved = NULL; | ||
132 | |||
133 | if(!(current = strdup(path))) { | ||
134 | return NULL; | ||
135 | } | ||
136 | for (i = 0; i < 16; ++i) { | ||
137 | if (lstat(current, &sb) == -1) { | ||
138 | goto failed; | ||
139 | } | ||
140 | if((sb.st_mode & S_IFMT) != S_IFLNK) { | ||
141 | return current; | ||
142 | } | ||
143 | if (!(resolved = malloc(sb.st_size + 1))) { | ||
144 | goto failed; | ||
145 | } | ||
146 | r = readlink(current, resolved, sb.st_size); | ||
147 | if (r == -1 || r > sb.st_size) { | ||
148 | goto failed; | ||
149 | } | ||
150 | resolved[r] = '\0'; | ||
151 | free(current); | ||
152 | current = strdup(resolved); | ||
153 | free(resolved); | ||
154 | resolved = NULL; | ||
155 | } | ||
156 | |||
157 | failed: | ||
158 | free(resolved); | ||
159 | free(current); | ||
160 | return NULL; | ||
161 | } \ No newline at end of file | ||