allow to change local files

- fuse/filecache:
     * add filecache_upload_patch
     * allow opening files in modes other than RDONLY
 - fuse/hashtbl:
     * add folder_tree_upload_patch
 - fuse/operations:
     * allow opening files in modes other than RDONLY
     * add members to private context which allow tracking of
       not-yet-uploaded files and files opened for writing and
       files opened in read-only mode
 - mfapi/apicalls/upload_patch:
     * supply x-filename and x-filesize headers
 - mfapi/apicalls/upload_simple:
     * do not supply the x-filehash header as it is not used by the
       server
 - utils/hash:
     * hex characters must be lower case for the server
 - utils/strings:
     * clean up unused functions strdup_join, strdup_substr,
       string_chomp
 - utils/stringv:
     * complete rewrite with different string vector implementation
This commit is contained in:
josch
2014-12-08 14:12:17 +01:00
parent 5bd9e418c4
commit 171fd815f2
16 changed files with 521 additions and 439 deletions

View File

@@ -51,30 +51,33 @@ static unsigned char base36_decoding_table[] = {
/*
* table to convert from a byte into the two hexadecimal digits representing
* it
*
* the hex chars have to be lower case until server-side is fixed to accept
* both cases
*/
static char base16_encoding_table[][2] = {
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B",
"0C", "0D", "0E", "0F", "10", "11", "12", "13", "14", "15", "16", "17",
"18", "19", "1A", "1B", "1C", "1D", "1E", "1F", "20", "21", "22", "23",
"24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F",
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B",
"3C", "3D", "3E", "3F", "40", "41", "42", "43", "44", "45", "46", "47",
"48", "49", "4A", "4B", "4C", "4D", "4E", "4F", "50", "51", "52", "53",
"54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F",
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B",
"6C", "6D", "6E", "6F", "70", "71", "72", "73", "74", "75", "76", "77",
"78", "79", "7A", "7B", "7C", "7D", "7E", "7F", "80", "81", "82", "83",
"84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F",
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B",
"9C", "9D", "9E", "9F", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7",
"A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF", "B0", "B1", "B2", "B3",
"B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF",
"C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB",
"CC", "CD", "CE", "CF", "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
"D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", "E0", "E1", "E2", "E3",
"E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF",
"F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB",
"FC", "FD", "FE", "FF"
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0a", "0b",
"0c", "0d", "0e", "0f", "10", "11", "12", "13", "14", "15", "16", "17",
"18", "19", "1a", "1b", "1c", "1d", "1e", "1f", "20", "21", "22", "23",
"24", "25", "26", "27", "28", "29", "2a", "2b", "2c", "2d", "2e", "2f",
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3a", "3b",
"3c", "3d", "3e", "3f", "40", "41", "42", "43", "44", "45", "46", "47",
"48", "49", "4a", "4b", "4c", "4d", "4e", "4f", "50", "51", "52", "53",
"54", "55", "56", "57", "58", "59", "5a", "5b", "5c", "5d", "5e", "5f",
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6a", "6b",
"6c", "6d", "6e", "6f", "70", "71", "72", "73", "74", "75", "76", "77",
"78", "79", "7a", "7b", "7c", "7d", "7e", "7f", "80", "81", "82", "83",
"84", "85", "86", "87", "88", "89", "8a", "8b", "8c", "8d", "8e", "8f",
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9a", "9b",
"9c", "9d", "9e", "9f", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7",
"a8", "a9", "aa", "ab", "ac", "ad", "ae", "af", "b0", "b1", "b2", "b3",
"b4", "b5", "b6", "b7", "b8", "b9", "ba", "bb", "bc", "bd", "be", "bf",
"c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "ca", "cb",
"cc", "cd", "ce", "cf", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
"d8", "d9", "da", "db", "dc", "dd", "de", "df", "e0", "e1", "e2", "e3",
"e4", "e5", "e6", "e7", "e8", "e9", "ea", "eb", "ec", "ed", "ee", "ef",
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "fa", "fb",
"fc", "fd", "fe", "ff"
};
int calc_md5(FILE * file, unsigned char *hash)

View File

@@ -289,6 +289,7 @@ http_post_file(mfhttp * conn, const char *url, FILE * fh,
if (custom_headers == NULL) {
custom_headers = &fallback_headers;
*custom_headers = NULL;
}
// when using POST, curl implicitly sets
// Content-Type: application/x-www-form-urlencoded

View File

@@ -59,132 +59,6 @@ char *strdup_printf(char *fmt, ...)
return ret_str;
}
char *strdup_join(char *string1, char *string2)
{
char *new_string;
size_t string1_len;
size_t string2_len;
if (string1 == NULL || string2 == NULL)
return NULL;
string1_len = strlen(string1);
string2_len = strlen(string2);
new_string = (char *)malloc(string1_len + string2_len + 1);
strncpy(new_string, string1, string1_len);
strncat(new_string, string2, string2_len);
new_string[string1_len + string2_len] = '\0';
return new_string;
}
char *strdup_subst(char *string, char *token, char *subst,
unsigned int max)
{
size_t string_len = 0;
size_t subst_len = 0;
size_t token_len = 0;
size_t total_len = 0;
size_t copy_len = 0;
size_t token_count;
char *str_new = NULL;
char **vectors;
char **rewind;
if (string == NULL)
return NULL;
if (token == NULL || subst == NULL)
return NULL;
string_len = strlen(string);
token_len = strlen(token);
// return on conditions that we could never handle.
if (token_len > string_len)
return NULL;
if (token[0] == '\0')
return NULL;
vectors = stringv_find(string, token, max);
if (vectors == NULL)
return NULL;
rewind = vectors;
// count the number of tokens found in the string
token_count = stringv_len(vectors);
if (token_count > max)
token_count = max;
// start with the original string size;
total_len = string_len;
// subtract the total number of token chars to be removed
total_len -= (token_len * token_count);
// add back the total number of subst chars to be inserted
total_len += (subst_len * token_count);
str_new = (char *)malloc((total_len + 1) * sizeof(char));
str_new[0] = '\0';
while (*vectors != NULL) {
// calculate distance to the next token from current position
copy_len = *vectors - string;
if (copy_len > 0) {
strncat(str_new, string, copy_len);
string += copy_len;
// when total_len == 0 the process is complete
total_len -= copy_len;
}
strncat(str_new, token, token_len);
// when total_len == 0 the process is complete
total_len -= token_len;
vectors++;
}
// might have one more copy operation to complete
if (total_len > 0) {
strcat(str_new, string);
}
// todo: can't free vectors directly cuz it was incremented
free(rewind);
return str_new;
}
void string_chomp(char *string)
{
size_t len;
char *pos;
if (string == NULL)
return;
len = strlen(string);
if (len == 0)
return;
pos = &string[len - 1];
while (isspace((int)*pos) != 0) {
*pos = '\0';
pos--;
}
return;
}
char *string_line_from_stdin(bool hide)
{
char *line = NULL;

View File

@@ -24,13 +24,6 @@
char *strdup_printf(char *fmt, ...);
char *strdup_join(char *string1, char *string2);
char *strdup_subst(char *string, char *str_old, char *str_new,
unsigned int max);
void string_chomp(char *string);
char *string_line_from_stdin(bool hide);
#endif

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2013 Bryan Christ <bryan.christ@mediafire.com>
* Copyright (C) 2014 Johannes Schauer <j.schauer@email.de>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2, as published by
@@ -18,166 +18,90 @@
#define _POSIX_C_SOURCE 200809L // for strdup
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <stddef.h>
#include "stringv.h"
size_t stringv_len(char **array)
struct stringv {
size_t len;
char **array;
};
stringv *stringv_alloc(void)
{
size_t count = 0;
char **pos;
stringv *sv;
if (array == NULL)
return 0;
pos = array;
while (pos[0] != NULL) {
pos++;
count++;
}
return count;
sv = (stringv *) calloc(1, sizeof(stringv));
sv->len = 0;
sv->array = NULL;
return sv;
}
void stringv_free(char **array, int b_free)
void stringv_free(stringv * sv)
{
char **pos;
size_t i;
if (array == NULL)
return;
pos = array;
while ((*pos) != NULL) {
free(*pos);
++pos;
for (i = 0; i < sv->len; i++) {
free(sv->array[i]);
}
if (b_free == STRINGV_FREE_ALL)
free(array);
return;
free(sv->array);
free(sv);
}
char **stringv_copy(char **array)
bool stringv_mem(stringv * sv, const char *e)
{
uint32_t array_len;
char **array_pos;
size_t i;
char **dup_array;
char **dup_pos;
if (array == NULL)
return (char **)NULL;
array_pos = array;
array_len = stringv_len(array);
if (array_len > UINT32_MAX - 1)
array_len = UINT32_MAX - 1;
dup_array = (char **)calloc(array_len, sizeof(char *));
dup_pos = dup_array;
while ((*array_pos) != NULL) {
*dup_pos = strdup((const char *)*array_pos);
array_pos++;
dup_pos++;
for (i = 0; i < sv->len; i++) {
if (strcmp(sv->array[i], e) == 0)
return true;
}
return dup_array;
return false;
}
char **stringv_find(char *string, char *token, int limit)
int stringv_add(stringv * sv, const char *e)
{
char **results = NULL;
char *pos = NULL;
int count = 0;
sv->len++;
sv->array = realloc(sv->array, sizeof(char *) * sv->len);
if (sv->array == NULL) {
fprintf(stderr, "failed to realloc\n");
return -1;
}
sv->array[sv->len - 1] = strdup(e);
if (sv->array[sv->len - 1] == NULL) {
fprintf(stderr, "failed to strdup\n");
return -1;
}
return 0;
}
if (string == NULL)
return (char **)NULL;
if (token == NULL)
return (char **)NULL;
if (limit == 0)
return (char **)NULL;
int stringv_del(stringv * sv, const char *e)
{
size_t i;
pos = string;
if (strlen(token) > strlen(string))
return (char **)NULL;
while (count != limit) {
pos = strstr(pos, token);
if (pos == NULL)
for (i = 0; i < sv->len; i++) {
if (strcmp(sv->array[i], e) == 0) {
free(sv->array[i]);
break;
count++;
results =
(char **)realloc((void *)results, sizeof(char *) * count + 1);
results[count - 1] = pos;
}
}
if (count == 0)
return (char **)NULL;
results[count] = (char *)NULL;
return results;
}
char **stringv_split(char *string, char *token, int limit)
{
char **results = NULL;
char *curr = NULL;
char *next = NULL;
int count = 0;
unsigned int len;
size_t copy_len = 0;
if (string == NULL)
return (char **)NULL;
if (token == NULL)
return (char **)NULL;
if (limit == 0)
return (char **)NULL;
len = strlen(string);
if (strlen(token) > len)
return (char **)NULL;
curr = string;
do {
// alloc space for current item plus NULL vector terminator
results = (char **)realloc(results, sizeof(char *) * (count + 2));
// find the next occurrence
next = strstr(curr, token);
if (next != NULL)
copy_len = next - curr;
else
copy_len = strlen(curr);
results[count] = (char *)calloc(copy_len + 1, sizeof(char));
memcpy(results[count], curr, copy_len);
count++;
if (next == NULL)
break;
curr = next;
curr++;
if (i == sv->len) {
fprintf(stderr, "not found\n");
return -1;
}
while (count < limit);
results[count] = NULL;
return results;
// shift the remaining entries one place to the left
memmove(sv->array + i, sv->array + i + 1,
sizeof(char *) * (sv->len - i - 1));
sv->len--;
if (sv->len == 0) {
free(sv->array);
sv->array = NULL;
} else {
sv->array = realloc(sv->array, sizeof(char *) * sv->len);
}
return 0;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2013 Bryan Christ <bryan.christ@mediafire.com>
* Copyright (C) 2014 Johannes Schauer <j.schauer@email.de>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2, as published by
@@ -19,23 +19,18 @@
#ifndef _STRING_V_H_
#define _STRING_V_H_
#include <stddef.h>
#include <stdbool.h>
#define STRINGV_FREE_ALL 1
typedef struct stringv stringv;
// count number of strings in a NULL in a string vector
size_t stringv_len(char **array);
stringv *stringv_alloc(void);
// free all of the strings in a vector and optionally the vector pointer
void stringv_free(char **array, int b_free);
void stringv_free(stringv * sv);
// deep copy of string vector. returns a new vector pointer
char **stringv_copy(char **array);
bool stringv_mem(stringv * sv, const char *e);
// returns a NULL terminated vector array to every location 'token' is found
char **stringv_find(char *string, char *token, int limit);
int stringv_add(stringv * sv, const char *e);
// returns a NULL terminated vector array of items delimited by 'token'
char **stringv_split(char *string, char *token, int limit);
int stringv_del(stringv * sv, const char *e);
#endif