set download path
authorJosé Bollo <jose.bollo@iot.bzh>
Sun, 17 Apr 2016 16:33:41 +0000 (18:33 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Sun, 17 Apr 2016 16:33:41 +0000 (18:33 +0200)
Change-Id: Ib42157297a868056ab20338b806cc06e5322b274
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
src/afb-hreq.c
src/afb-hreq.h
src/main.c

index 8a0b280..93cce62 100644 (file)
@@ -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;
 
index aa2cf11..f717cc8 100644 (file)
@@ -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);
index d8065e4..e899739 100644 (file)
@@ -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");