mirror of
https://github.com/xorgy/mediafire-fuse
synced 2026-01-13 13:14:29 -08:00
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:
47
utils/hash.c
47
utils/hash.c
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
126
utils/strings.c
126
utils/strings.c
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
200
utils/stringv.c
200
utils/stringv.c
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user