summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/afb-hreq.c44
-rw-r--r--src/afb-hreq.h1
-rw-r--r--src/main.c5
3 files changed, 49 insertions, 1 deletions
diff --git a/src/afb-hreq.c b/src/afb-hreq.c
index 8a0b2804..93cce62b 100644
--- a/src/afb-hreq.c
+++ b/src/afb-hreq.c
@@ -52,6 +52,7 @@ static const char token_cookie[] = "token";
static char *cookie_name = NULL;
static char *cookie_setter = NULL;
+static char *tmp_pattern = NULL;
struct hreq_data {
struct hreq_data *next;
@@ -492,12 +493,53 @@ int afb_hreq_post_add(struct afb_hreq *hreq, const char *key, const char *data,
return 1;
}
+int afb_hreq_init_download_path(const char *directory)
+{
+ struct stat st;
+ size_t n;
+ char *p;
+
+ if (access(directory, R_OK|W_OK)) {
+ /* no read/write access */
+ return -1;
+ }
+ if (stat(directory, &st)) {
+ /* can't get info */
+ return -1;
+ }
+ if (!S_ISDIR(st.st_mode)) {
+ /* not a directory */
+ errno = ENOTDIR;
+ return -1;
+ }
+ n = strlen(directory);
+ while(n > 1 && directory[n-1] == '/') n--;
+ p = malloc(n + 8);
+ if (p == NULL) {
+ /* can't allocate memory */
+ errno = ENOMEM;
+ return -1;
+ }
+ memcpy(p, directory, n);
+ p[n++] = '/';
+ p[n++] = 'X';
+ p[n++] = 'X';
+ p[n++] = 'X';
+ p[n++] = 'X';
+ p[n++] = 'X';
+ p[n++] = 'X';
+ p[n] = 0;
+ free(tmp_pattern);
+ tmp_pattern = p;
+ return 0;
+}
+
static int opentempfile(char **path)
{
int fd;
char *fname;
- fname = strdup("XXXXXX"); /* TODO improve the path */
+ fname = strdup(tmp_pattern ? : "XXXXXX"); /* TODO improve the path */
if (fname == NULL)
return -1;
diff --git a/src/afb-hreq.h b/src/afb-hreq.h
index aa2cf117..f717cc8d 100644
--- a/src/afb-hreq.h
+++ b/src/afb-hreq.h
@@ -74,3 +74,4 @@ extern void afb_hreq_reply_free(struct afb_hreq *hreq, unsigned status, size_t s
extern void afb_hreq_reply_empty(struct afb_hreq *hreq, unsigned status, ...);
+extern int afb_hreq_init_download_path(const char *directory);
diff --git a/src/main.c b/src/main.c
index d8065e42..e899739c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -516,6 +516,11 @@ static struct afb_hsrv *start_http_server(struct afb_config * config)
int rc;
struct afb_hsrv *hsrv;
+ if (afb_hreq_init_download_path("/tmp")) { /* TODO: sessiondir? */
+ fprintf(stderr, "unable to set the tmp directory\n");
+ return NULL;
+ }
+
hsrv = afb_hsrv_create();
if (hsrv == NULL) {
fprintf(stderr, "memory allocation failure\n");