removed '/' from linktable, configured curl to follow redirection
This commit is contained in:
parent
8926119400
commit
06be26afd0
2
Makefile
2
Makefile
|
@ -1,6 +1,6 @@
|
||||||
CC=gcc
|
CC=gcc
|
||||||
CFLAGS= -Wall -Wextra -lgumbo -lcurl -g
|
CFLAGS= -Wall -Wextra -lgumbo -lcurl -g
|
||||||
OBJ = main.o network.o test.o
|
OBJ = main.o network.o
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CC) -c -o $@ $< $(CFLAGS)
|
$(CC) -c -o $@ $< $(CFLAGS)
|
||||||
|
|
3
TODO.md
3
TODO.md
|
@ -1,3 +0,0 @@
|
||||||
- implement fseek
|
|
||||||
- work on linklist again - append it so it includes curl data structure
|
|
||||||
- implement function which generates the initial file list.
|
|
24
data.h
24
data.h
|
@ -20,23 +20,31 @@ typedef enum {
|
||||||
LINK_INVALID = 'I'
|
LINK_INVALID = 'I'
|
||||||
} LinkType;
|
} LinkType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief link table type
|
||||||
|
* \details index 0 contains the Link for the base URL
|
||||||
|
*/
|
||||||
|
typedef struct LinkTable LinkTable;
|
||||||
|
|
||||||
/** \brief link data type */
|
/** \brief link data type */
|
||||||
typedef struct {
|
typedef struct Link Link;
|
||||||
|
|
||||||
|
struct Link {
|
||||||
char p_url[255];
|
char p_url[255];
|
||||||
LinkType type;
|
LinkType type;
|
||||||
CURL *curl;
|
CURL *curl;
|
||||||
char *body;
|
char *body;
|
||||||
size_t body_sz;
|
size_t body_sz;
|
||||||
size_t content_length;
|
size_t content_length;
|
||||||
} Link;
|
LinkTable *nextTable;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief link table type
|
struct LinkTable {
|
||||||
* \details index 0 contains the Link for the base URL
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
int num;
|
int num;
|
||||||
Link **links;
|
Link **links;
|
||||||
} LinkTable;
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
25
fuse_local.c
25
fuse_local.c
|
@ -1,19 +1,32 @@
|
||||||
#include <fuse_lowlevel.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "fuse_local.h"
|
#include "fuse_local.h"
|
||||||
|
|
||||||
static struct fuse_lowlevel_ops fs_ops = {
|
static struct fuse_operations fs_oper = {
|
||||||
.lookup = fs_lookup,
|
|
||||||
.getattr = fs_getattr,
|
.getattr = fs_getattr,
|
||||||
.readdir = fs_readdir,
|
.readdir = fs_readdir,
|
||||||
.open = fs_open,
|
.open = fs_open,
|
||||||
.read = fs_read,
|
.read = fs_read,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int fs_getattr(const char *path, struct stat *stbuf)
|
||||||
|
{
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
|
memset(stbuf, 0, sizeof(struct stat));
|
||||||
|
if (strcmp(path, "/") == 0) {
|
||||||
|
stbuf->st_mode = S_IFDIR | 0755;
|
||||||
|
stbuf->st_nlink = 2;
|
||||||
|
} else if (strcmp(path, hello_path) == 0) {
|
||||||
|
stbuf->st_mode = S_IFREG | 0444;
|
||||||
|
stbuf->st_nlink = 1;
|
||||||
|
stbuf->st_size = strlen(hello_str);
|
||||||
|
} else
|
||||||
|
res = -ENOENT;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
#ifndef FUSE_H
|
#ifndef FUSE_LOCAL_H
|
||||||
#define FUSE_H
|
#define FUSE_LOCAL_H
|
||||||
|
|
||||||
|
/* must be included before including <fuse.h> */
|
||||||
|
#define FUSE_USE_VERSION 26
|
||||||
|
|
||||||
|
#include <fuse.h>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
14
main.c
14
main.c
|
@ -4,7 +4,19 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
|
|
||||||
#include "test.h"
|
void link_test()
|
||||||
|
{
|
||||||
|
printf("--- start of link_test ---\n");
|
||||||
|
|
||||||
|
LinkTable *linktbl = LinkTable_new(
|
||||||
|
"http://127.0.0.1/~fangfufu/");
|
||||||
|
|
||||||
|
LinkTable_print(linktbl);
|
||||||
|
Link_download(linktbl->links[1], 1, 20);
|
||||||
|
printf(linktbl->links[1]->body);
|
||||||
|
LinkTable_free(linktbl);
|
||||||
|
printf("\n--- end of link_test ---\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
void init()
|
void init()
|
||||||
{
|
{
|
||||||
|
|
19
network.c
19
network.c
|
@ -110,6 +110,12 @@ Link *Link_new(const char *p_url)
|
||||||
|
|
||||||
strncpy(link->p_url, p_url, LINK_LEN_MAX);
|
strncpy(link->p_url, p_url, LINK_LEN_MAX);
|
||||||
|
|
||||||
|
/* remove the '/' */
|
||||||
|
char *c = &(link->p_url[strnlen(link->p_url, LINK_LEN_MAX) - 1]);
|
||||||
|
if ( *c == '/') {
|
||||||
|
*c = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
link->type = LINK_UNKNOWN;
|
link->type = LINK_UNKNOWN;
|
||||||
|
|
||||||
link->curl = curl_easy_init();
|
link->curl = curl_easy_init();
|
||||||
|
@ -119,6 +125,12 @@ Link *Link_new(const char *p_url)
|
||||||
curl_easy_setopt(link->curl, CURLOPT_WRITEDATA, (void *)link);
|
curl_easy_setopt(link->curl, CURLOPT_WRITEDATA, (void *)link);
|
||||||
curl_easy_setopt(link->curl, CURLOPT_USERAGENT, "mount-http-dir/libcurl");
|
curl_easy_setopt(link->curl, CURLOPT_USERAGENT, "mount-http-dir/libcurl");
|
||||||
curl_easy_setopt(link->curl, CURLOPT_VERBOSE, 0);
|
curl_easy_setopt(link->curl, CURLOPT_VERBOSE, 0);
|
||||||
|
curl_easy_setopt(link->curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||||
|
/*
|
||||||
|
* only 1 redirection is really needed
|
||||||
|
* - for following directories without the '/'
|
||||||
|
*/
|
||||||
|
curl_easy_setopt(link->curl, CURLOPT_MAXREDIRS, 3);
|
||||||
|
|
||||||
return link;
|
return link;
|
||||||
}
|
}
|
||||||
|
@ -151,7 +163,7 @@ LinkTable *LinkTable_new(const char *url)
|
||||||
LinkTable *linktbl = calloc(1, sizeof(LinkTable));
|
LinkTable *linktbl = calloc(1, sizeof(LinkTable));
|
||||||
|
|
||||||
/* populate the base URL */
|
/* populate the base URL */
|
||||||
LinkTable_add(linktbl, Link_new(url));
|
LinkTable_add(linktbl, Link_new("/"));
|
||||||
Link *head_link = linktbl->links[0];
|
Link *head_link = linktbl->links[0];
|
||||||
head_link->type = LINK_HEAD;
|
head_link->type = LINK_HEAD;
|
||||||
curl_easy_setopt(head_link->curl, CURLOPT_URL, url);
|
curl_easy_setopt(head_link->curl, CURLOPT_URL, url);
|
||||||
|
@ -200,13 +212,14 @@ void LinkTable_add(LinkTable *linktbl, Link *link)
|
||||||
|
|
||||||
void LinkTable_fill(LinkTable *linktbl)
|
void LinkTable_fill(LinkTable *linktbl)
|
||||||
{
|
{
|
||||||
|
Link *head_link = linktbl->links[0];
|
||||||
for (int i = 0; i < linktbl->num; i++) {
|
for (int i = 0; i < linktbl->num; i++) {
|
||||||
Link *this_link = linktbl->links[i];
|
Link *this_link = linktbl->links[i];
|
||||||
if (this_link->type == LINK_UNKNOWN) {
|
if (this_link->type == LINK_UNKNOWN) {
|
||||||
CURL *curl = this_link->curl;
|
CURL *curl = this_link->curl;
|
||||||
char *url;
|
char *url;
|
||||||
curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url);
|
curl_easy_getinfo(head_link->curl, CURLINFO_EFFECTIVE_URL, &url);
|
||||||
url = url_append(linktbl->links[0]->p_url, this_link->p_url);
|
url = url_append(url, this_link->p_url);
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||||
free(url);
|
free(url);
|
||||||
curl_easy_setopt(curl, CURLOPT_NOBODY, 1);
|
curl_easy_setopt(curl, CURLOPT_NOBODY, 1);
|
||||||
|
|
23
test.c
23
test.c
|
@ -1,23 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
#include "network.h"
|
|
||||||
#include "test.h"
|
|
||||||
|
|
||||||
|
|
||||||
void link_test()
|
|
||||||
{
|
|
||||||
printf("--- start of link_test ---\n");
|
|
||||||
|
|
||||||
LinkTable *linktbl = LinkTable_new(
|
|
||||||
"http://127.0.0.1/~fangfufu/");
|
|
||||||
|
|
||||||
LinkTable_print(linktbl);
|
|
||||||
Link_download(linktbl->links[1], 1, 20);
|
|
||||||
printf(linktbl->links[1]->body);
|
|
||||||
LinkTable_free(linktbl);
|
|
||||||
printf("\n--- end of link_test ---\n\n");
|
|
||||||
}
|
|
Loading…
Reference in New Issue