about summary refs log tree commit diff
path: root/surf.c
diff options
context:
space:
mode:
Diffstat (limited to 'surf.c')
-rw-r--r--surf.c83
1 files changed, 56 insertions, 27 deletions
diff --git a/surf.c b/surf.c
index 02656ec..cd43e41 100644
--- a/surf.c
+++ b/surf.c
@@ -24,6 +24,8 @@
 #include <libgen.h>
 #include <stdarg.h>
 #include <regex.h>
+#include <pwd.h>
+#include <string.h>
 
 #include "arg.h"
 
@@ -113,6 +115,7 @@ static void addaccelgroup(Client *c);
 static void beforerequest(WebKitWebView *w, WebKitWebFrame *f,
 		WebKitWebResource *r, WebKitNetworkRequest *req,
 		WebKitNetworkResponse *resp, Client *c);
+static char *buildfile(const char *path);
 static char *buildpath(const char *path);
 static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c);
 static void cleanup(void);
@@ -257,37 +260,63 @@ beforerequest(WebKitWebView *w, WebKitWebFrame *f, WebKitWebResource *r,
 }
 
 static char *
-buildpath(const char *path) {
-	char *apath, *p;
+buildfile(const char *path) {
+	char *dname, *bname, *bpath, *fpath;
 	FILE *f;
 
-	/* creating directory */
-	if(path[0] == '/') {
-		apath = g_strdup(path);
-	} else if(path[0] == '~') {
-		if(path[1] == '/') {
-			apath = g_strconcat(g_get_home_dir(), &path[1], NULL);
+	dname = g_path_get_dirname(path);
+	bname = g_path_get_basename(path);
+
+	bpath = buildpath(dname);
+	g_free(dname);
+
+	fpath = g_build_filename(bpath, bname, NULL);
+	g_free(bname);
+
+
+	if(!(f = fopen(fpath, "a")))
+		die("Could not open file: %s\n", fpath);
+
+	g_chmod(fpath, 0600); /* always */
+	fclose(f);
+
+	return fpath;
+}
+
+static char *
+buildpath(const char *path) {
+	struct passwd *pw;
+	char *apath, *name, *p, *fpath;
+
+	if(path[0] == '~') {
+		if(path[1] == '/' || path[1] == '\0') {
+			p = (char *)&path[1];
+			pw = getpwuid(getuid());
 		} else {
-			apath = g_strconcat(g_get_home_dir(), "/",
-					&path[1], NULL);
+			if((p = strchr(path, '/')))
+				name = g_strndup(&path[1], --p - path);
+			else
+				name = g_strdup(&path[1]);
+
+			if(!(pw = getpwnam(name))) {
+				die("Can't get user %s home directory: %s.\n",
+						name, path);
+			}
+			g_free(name);
 		}
+		apath = g_build_filename(pw->pw_dir, p, NULL);
 	} else {
-		apath = g_strconcat(g_get_current_dir(), "/", path, NULL);
+		apath = g_strdup(path);
 	}
 
-	if((p = strrchr(apath, '/'))) {
-		*p = '\0';
-		g_mkdir_with_parents(apath, 0700);
-		g_chmod(apath, 0700); /* in case it existed */
-		*p = '/';
-	}
-	/* creating file (gives error when apath ends with "/") */
-	if((f = fopen(apath, "a"))) {
-		g_chmod(apath, 0600); /* always */
-		fclose(f);
-	}
+	/* creating directory */
+	if (g_mkdir_with_parents(apath, 0700) < 0)
+		die("Could not access directory: %s\n", apath);
+
+	fpath = realpath(apath, NULL);
+	g_free(apath);
 
-	return apath;
+	return fpath;
 }
 
 static gboolean
@@ -1221,8 +1250,8 @@ setup(void) {
 	atoms[AtomUri] = XInternAtom(dpy, "_SURF_URI", False);
 
 	/* dirs and files */
-	cookiefile = buildpath(cookiefile);
-	scriptfile = buildpath(scriptfile);
+	cookiefile = buildfile(cookiefile);
+	scriptfile = buildfile(scriptfile);
 	cachefolder = buildpath(cachefolder);
 	styledir = buildpath(styledir);
 	if(stylefile == NULL) {
@@ -1234,12 +1263,12 @@ setup(void) {
 					styles[i].regex);
 				styles[i].regex = NULL;
 			}
-			styles[i].style = buildpath(
+			styles[i].style = buildfile(
 					g_strconcat(styledir,
 						styles[i].style, NULL));
 		}
 	} else {
-		stylefile = buildpath(stylefile);
+		stylefile = buildfile(stylefile);
 	}
 
 	/* request handler */