Fix the way system files are handled at surf startup.
1. Do not chmod existing directories. 2. Fix the handling of tilde expansion in paths, don't expand ~foo to $HOME/foo but to foo's home directory. 3. Separate the creation of files and directories. We don't have to worry anymore about pathnames having to end with a '/' to be correctly handled. Signed-off-by: Christoph Lohmann <20h@r-36.net>
This commit is contained in:
parent
1554354f16
commit
8a898ec4df
1 changed files with 56 additions and 27 deletions
83
surf.c
83
surf.c
|
@ -24,6 +24,8 @@
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "arg.h"
|
#include "arg.h"
|
||||||
|
|
||||||
|
@ -113,6 +115,7 @@ static void addaccelgroup(Client *c);
|
||||||
static void beforerequest(WebKitWebView *w, WebKitWebFrame *f,
|
static void beforerequest(WebKitWebView *w, WebKitWebFrame *f,
|
||||||
WebKitWebResource *r, WebKitNetworkRequest *req,
|
WebKitWebResource *r, WebKitNetworkRequest *req,
|
||||||
WebKitNetworkResponse *resp, Client *c);
|
WebKitNetworkResponse *resp, Client *c);
|
||||||
|
static char *buildfile(const char *path);
|
||||||
static char *buildpath(const char *path);
|
static char *buildpath(const char *path);
|
||||||
static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c);
|
static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c);
|
||||||
static void cleanup(void);
|
static void cleanup(void);
|
||||||
|
@ -257,37 +260,63 @@ beforerequest(WebKitWebView *w, WebKitWebFrame *f, WebKitWebResource *r,
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
buildpath(const char *path) {
|
buildfile(const char *path) {
|
||||||
char *apath, *p;
|
char *dname, *bname, *bpath, *fpath;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
||||||
/* creating directory */
|
dname = g_path_get_dirname(path);
|
||||||
if(path[0] == '/') {
|
bname = g_path_get_basename(path);
|
||||||
apath = g_strdup(path);
|
|
||||||
} else if(path[0] == '~') {
|
bpath = buildpath(dname);
|
||||||
if(path[1] == '/') {
|
g_free(dname);
|
||||||
apath = g_strconcat(g_get_home_dir(), &path[1], NULL);
|
|
||||||
|
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 {
|
} else {
|
||||||
apath = g_strconcat(g_get_home_dir(), "/",
|
if((p = strchr(path, '/')))
|
||||||
&path[1], NULL);
|
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 {
|
} else {
|
||||||
apath = g_strconcat(g_get_current_dir(), "/", path, NULL);
|
apath = g_strdup(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if((p = strrchr(apath, '/'))) {
|
/* creating directory */
|
||||||
*p = '\0';
|
if (g_mkdir_with_parents(apath, 0700) < 0)
|
||||||
g_mkdir_with_parents(apath, 0700);
|
die("Could not access directory: %s\n", apath);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
return apath;
|
fpath = realpath(apath, NULL);
|
||||||
|
g_free(apath);
|
||||||
|
|
||||||
|
return fpath;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -1221,8 +1250,8 @@ setup(void) {
|
||||||
atoms[AtomUri] = XInternAtom(dpy, "_SURF_URI", False);
|
atoms[AtomUri] = XInternAtom(dpy, "_SURF_URI", False);
|
||||||
|
|
||||||
/* dirs and files */
|
/* dirs and files */
|
||||||
cookiefile = buildpath(cookiefile);
|
cookiefile = buildfile(cookiefile);
|
||||||
scriptfile = buildpath(scriptfile);
|
scriptfile = buildfile(scriptfile);
|
||||||
cachefolder = buildpath(cachefolder);
|
cachefolder = buildpath(cachefolder);
|
||||||
styledir = buildpath(styledir);
|
styledir = buildpath(styledir);
|
||||||
if(stylefile == NULL) {
|
if(stylefile == NULL) {
|
||||||
|
@ -1234,12 +1263,12 @@ setup(void) {
|
||||||
styles[i].regex);
|
styles[i].regex);
|
||||||
styles[i].regex = NULL;
|
styles[i].regex = NULL;
|
||||||
}
|
}
|
||||||
styles[i].style = buildpath(
|
styles[i].style = buildfile(
|
||||||
g_strconcat(styledir,
|
g_strconcat(styledir,
|
||||||
styles[i].style, NULL));
|
styles[i].style, NULL));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
stylefile = buildpath(stylefile);
|
stylefile = buildfile(stylefile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* request handler */
|
/* request handler */
|
||||||
|
|
Loading…
Reference in a new issue