aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorLibravatar Jerzi Kaminsky <JerziKaminsky@users.noreply.github.com>2017-04-14 23:37:43 +0300
committerLibravatar Jerzi Kaminsky <JerziKaminsky@users.noreply.github.com>2017-04-16 17:09:53 +0300
commitc9694ee63d451da62dc50b234b3080a35a40e844 (patch)
treecb826b8dba53c28dff9b1c440007e1b21a6fba5e /common
parentAdd validate_ipc_target() (diff)
downloadsway-c9694ee63d451da62dc50b234b3080a35a40e844.tar.gz
sway-c9694ee63d451da62dc50b234b3080a35a40e844.tar.zst
sway-c9694ee63d451da62dc50b234b3080a35a40e844.zip
Add resolve_path() to utils
Diffstat (limited to 'common')
-rw-r--r--common/util.c41
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
126char* 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
157failed:
158 free(resolved);
159 free(current);
160 return NULL;
161} \ No newline at end of file