ruby-libstorj 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.gitmodules +3 -0
- data/.rspec +1 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +111 -0
- data/Guardfile +21 -0
- data/LICENSE +502 -0
- data/README.md +262 -0
- data/Rakefile +76 -0
- data/ext/libstorj/.gitignore +47 -0
- data/ext/libstorj/.travis.yml +27 -0
- data/ext/libstorj/Doxyfile +2427 -0
- data/ext/libstorj/LICENSE +502 -0
- data/ext/libstorj/Makefile.am +6 -0
- data/ext/libstorj/README.md +198 -0
- data/ext/libstorj/autogen.sh +3 -0
- data/ext/libstorj/configure.ac +64 -0
- data/ext/libstorj/depends/Makefile +153 -0
- data/ext/libstorj/depends/config.guess +1462 -0
- data/ext/libstorj/depends/config.sub +1823 -0
- data/ext/libstorj/depends/extract-osx-sdk.sh +33 -0
- data/ext/libstorj/depends/packages/cctools.mk +7 -0
- data/ext/libstorj/depends/packages/clang.mk +7 -0
- data/ext/libstorj/depends/packages/gmp.mk +23 -0
- data/ext/libstorj/depends/packages/gnutls.mk +25 -0
- data/ext/libstorj/depends/packages/json-c.mk +7 -0
- data/ext/libstorj/depends/packages/libcurl.mk +39 -0
- data/ext/libstorj/depends/packages/libmicrohttpd.mk +7 -0
- data/ext/libstorj/depends/packages/libuv.mk +7 -0
- data/ext/libstorj/depends/packages/nettle.mk +30 -0
- data/ext/libstorj/libstorj.pc.in +11 -0
- data/ext/libstorj/src/Makefile.am +23 -0
- data/ext/libstorj/src/bip39.c +233 -0
- data/ext/libstorj/src/bip39.h +64 -0
- data/ext/libstorj/src/bip39_english.h +2074 -0
- data/ext/libstorj/src/cli.c +1494 -0
- data/ext/libstorj/src/crypto.c +525 -0
- data/ext/libstorj/src/crypto.h +178 -0
- data/ext/libstorj/src/downloader.c +1923 -0
- data/ext/libstorj/src/downloader.h +163 -0
- data/ext/libstorj/src/http.c +688 -0
- data/ext/libstorj/src/http.h +175 -0
- data/ext/libstorj/src/rs.c +962 -0
- data/ext/libstorj/src/rs.h +99 -0
- data/ext/libstorj/src/storj.c +1523 -0
- data/ext/libstorj/src/storj.h +1014 -0
- data/ext/libstorj/src/uploader.c +2736 -0
- data/ext/libstorj/src/uploader.h +181 -0
- data/ext/libstorj/src/utils.c +336 -0
- data/ext/libstorj/src/utils.h +65 -0
- data/ext/libstorj/test/Makefile.am +27 -0
- data/ext/libstorj/test/mockbridge.c +260 -0
- data/ext/libstorj/test/mockbridge.json +687 -0
- data/ext/libstorj/test/mockbridgeinfo.json +1836 -0
- data/ext/libstorj/test/mockfarmer.c +358 -0
- data/ext/libstorj/test/storjtests.h +41 -0
- data/ext/libstorj/test/tests.c +1617 -0
- data/ext/libstorj/test/tests_rs.c +869 -0
- data/ext/ruby-libstorj/extconf.rb +8 -0
- data/ext/ruby-libstorj/ruby-libstorj.cc +17 -0
- data/lib/ruby-libstorj.rb +1 -0
- data/lib/ruby-libstorj/arg_forwarding_task.rb +58 -0
- data/lib/ruby-libstorj/env.rb +178 -0
- data/lib/ruby-libstorj/ext/bucket.rb +71 -0
- data/lib/ruby-libstorj/ext/create_bucket_request.rb +53 -0
- data/lib/ruby-libstorj/ext/curl_code.rb +139 -0
- data/lib/ruby-libstorj/ext/ext.rb +71 -0
- data/lib/ruby-libstorj/ext/file.rb +84 -0
- data/lib/ruby-libstorj/ext/get_bucket_request.rb +45 -0
- data/lib/ruby-libstorj/ext/json_request.rb +51 -0
- data/lib/ruby-libstorj/ext/list_files_request.rb +63 -0
- data/lib/ruby-libstorj/ext/types.rb +226 -0
- data/lib/ruby-libstorj/ext/upload_options.rb +38 -0
- data/lib/ruby-libstorj/libstorj.rb +22 -0
- data/lib/ruby-libstorj/mixins/storj.rb +27 -0
- data/lib/ruby-libstorj/struct.rb +42 -0
- data/ruby-libstorj.gemspec +57 -0
- data/spec/helpers/options.yml.example +22 -0
- data/spec/helpers/shared_rake_examples.rb +132 -0
- data/spec/helpers/storj_options.rb +96 -0
- data/spec/helpers/upload.data +3 -0
- data/spec/helpers/upload.data.sha256 +1 -0
- data/spec/libstorj_spec.rb +0 -0
- data/spec/ruby-libstorj/arg_forwarding_task_spec.rb +311 -0
- data/spec/ruby-libstorj/env_spec.rb +353 -0
- data/spec/ruby-libstorj/ext_spec.rb +75 -0
- data/spec/ruby-libstorj/json_request_spec.rb +13 -0
- data/spec/ruby-libstorj/libstorj_spec.rb +81 -0
- data/spec/ruby-libstorj/struct_spec.rb +64 -0
- data/spec/spec_helper.rb +113 -0
- metadata +136 -0
@@ -0,0 +1,1014 @@
|
|
1
|
+
/**
|
2
|
+
* @file storj.h
|
3
|
+
* @brief Storj library.
|
4
|
+
*
|
5
|
+
* Implements functionality to upload and download files from the Storj
|
6
|
+
* distributed network.
|
7
|
+
*/
|
8
|
+
|
9
|
+
#ifndef STORJ_H
|
10
|
+
#define STORJ_H
|
11
|
+
|
12
|
+
#ifdef __cplusplus
|
13
|
+
extern "C" {
|
14
|
+
#endif
|
15
|
+
|
16
|
+
#if defined(_WIN32) && defined(STORJDLL)
|
17
|
+
#if defined(DLL_EXPORT)
|
18
|
+
#define STORJ_API __declspec(dllexport)
|
19
|
+
#else
|
20
|
+
#define STORJ_API __declspec(dllimport)
|
21
|
+
#endif
|
22
|
+
#else
|
23
|
+
#define STORJ_API
|
24
|
+
#endif
|
25
|
+
|
26
|
+
#include <assert.h>
|
27
|
+
#include <json-c/json.h>
|
28
|
+
#include <stdlib.h>
|
29
|
+
#include <stdio.h>
|
30
|
+
#include <stdbool.h>
|
31
|
+
#include <stdarg.h>
|
32
|
+
#include <string.h>
|
33
|
+
#include <uv.h>
|
34
|
+
#include <curl/curl.h>
|
35
|
+
|
36
|
+
#include <inttypes.h>
|
37
|
+
|
38
|
+
#ifdef _WIN32
|
39
|
+
#include <time.h>
|
40
|
+
#endif
|
41
|
+
|
42
|
+
#ifndef _WIN32
|
43
|
+
#include <sys/mman.h>
|
44
|
+
#include <unistd.h>
|
45
|
+
#endif
|
46
|
+
|
47
|
+
// File transfer success
|
48
|
+
#define STORJ_TRANSFER_OK 0
|
49
|
+
#define STORJ_TRANSFER_CANCELED 1
|
50
|
+
|
51
|
+
// Bridge related errors 1000 to 1999
|
52
|
+
#define STORJ_BRIDGE_REQUEST_ERROR 1000
|
53
|
+
#define STORJ_BRIDGE_AUTH_ERROR 1001
|
54
|
+
#define STORJ_BRIDGE_TOKEN_ERROR 1002
|
55
|
+
#define STORJ_BRIDGE_TIMEOUT_ERROR 1003
|
56
|
+
#define STORJ_BRIDGE_INTERNAL_ERROR 1004
|
57
|
+
#define STORJ_BRIDGE_RATE_ERROR 1005
|
58
|
+
#define STORJ_BRIDGE_BUCKET_NOTFOUND_ERROR 1006
|
59
|
+
#define STORJ_BRIDGE_FILE_NOTFOUND_ERROR 1007
|
60
|
+
#define STORJ_BRIDGE_JSON_ERROR 1008
|
61
|
+
#define STORJ_BRIDGE_FRAME_ERROR 1009
|
62
|
+
#define STORJ_BRIDGE_POINTER_ERROR 1010
|
63
|
+
#define STORJ_BRIDGE_REPOINTER_ERROR 1011
|
64
|
+
#define STORJ_BRIDGE_FILEINFO_ERROR 1012
|
65
|
+
#define STORJ_BRIDGE_BUCKET_FILE_EXISTS 1013
|
66
|
+
#define STORJ_BRIDGE_OFFER_ERROR 1014
|
67
|
+
|
68
|
+
// Farmer related errors 2000 to 2999
|
69
|
+
#define STORJ_FARMER_REQUEST_ERROR 2000
|
70
|
+
#define STORJ_FARMER_TIMEOUT_ERROR 2001
|
71
|
+
#define STORJ_FARMER_AUTH_ERROR 2002
|
72
|
+
#define STORJ_FARMER_EXHAUSTED_ERROR 2003
|
73
|
+
#define STORJ_FARMER_INTEGRITY_ERROR 2004
|
74
|
+
|
75
|
+
// File related errors 3000 to 3999
|
76
|
+
#define STORJ_FILE_INTEGRITY_ERROR 3000
|
77
|
+
#define STORJ_FILE_WRITE_ERROR 3001
|
78
|
+
#define STORJ_FILE_ENCRYPTION_ERROR 3002
|
79
|
+
#define STORJ_FILE_SIZE_ERROR 3003
|
80
|
+
#define STORJ_FILE_DECRYPTION_ERROR 3004
|
81
|
+
#define STORJ_FILE_GENERATE_HMAC_ERROR 3005
|
82
|
+
#define STORJ_FILE_READ_ERROR 3006
|
83
|
+
#define STORJ_FILE_SHARD_MISSING_ERROR 3007
|
84
|
+
#define STORJ_FILE_RECOVER_ERROR 3008
|
85
|
+
#define STORJ_FILE_RESIZE_ERROR 3009
|
86
|
+
#define STORJ_FILE_UNSUPPORTED_ERASURE 3010
|
87
|
+
#define STORJ_FILE_PARITY_ERROR 3011
|
88
|
+
|
89
|
+
// Memory related errors
|
90
|
+
#define STORJ_MEMORY_ERROR 4000
|
91
|
+
#define STORJ_MAPPING_ERROR 4001
|
92
|
+
#define STORJ_UNMAPPING_ERROR 4002
|
93
|
+
|
94
|
+
// Queue related errors
|
95
|
+
#define STORJ_QUEUE_ERROR 5000
|
96
|
+
|
97
|
+
// Meta related errors 6000 to 6999
|
98
|
+
#define STORJ_META_ENCRYPTION_ERROR 6000
|
99
|
+
#define STORJ_META_DECRYPTION_ERROR 6001
|
100
|
+
|
101
|
+
// Miscellaneous errors
|
102
|
+
#define STORJ_HEX_DECODE_ERROR 7000
|
103
|
+
|
104
|
+
// Exchange report codes
|
105
|
+
#define STORJ_REPORT_SUCCESS 1000
|
106
|
+
#define STORJ_REPORT_FAILURE 1100
|
107
|
+
|
108
|
+
// Exchange report messages
|
109
|
+
#define STORJ_REPORT_FAILED_INTEGRITY "FAILED_INTEGRITY"
|
110
|
+
#define STORJ_REPORT_SHARD_DOWNLOADED "SHARD_DOWNLOADED"
|
111
|
+
#define STORJ_REPORT_SHARD_UPLOADED "SHARD_UPLOADED"
|
112
|
+
#define STORJ_REPORT_DOWNLOAD_ERROR "DOWNLOAD_ERROR"
|
113
|
+
#define STORJ_REPORT_UPLOAD_ERROR "TRANSFER_FAILED"
|
114
|
+
|
115
|
+
#define STORJ_SHARD_CHALLENGES 4
|
116
|
+
#define STORJ_LOW_SPEED_LIMIT 30720L
|
117
|
+
#define STORJ_LOW_SPEED_TIME 20L
|
118
|
+
#define STORJ_HTTP_TIMEOUT 60L
|
119
|
+
|
120
|
+
typedef struct {
|
121
|
+
uint8_t *encryption_ctr;
|
122
|
+
uint8_t *encryption_key;
|
123
|
+
struct aes256_ctx *ctx;
|
124
|
+
} storj_encryption_ctx_t ;
|
125
|
+
|
126
|
+
typedef enum {
|
127
|
+
STORJ_REPORT_NOT_PREPARED = 0,
|
128
|
+
STORJ_REPORT_AWAITING_SEND = 1,
|
129
|
+
STORJ_REPORT_SENDING = 2,
|
130
|
+
STORJ_REPORT_SENT = 3
|
131
|
+
} exchange_report_status_t;
|
132
|
+
|
133
|
+
/** @brief Bridge configuration options
|
134
|
+
*
|
135
|
+
* Proto can be "http" or "https", and the user/pass are used for
|
136
|
+
* basic authentication to a Storj bridge.
|
137
|
+
*/
|
138
|
+
typedef struct {
|
139
|
+
const char *proto;
|
140
|
+
const char *host;
|
141
|
+
int port;
|
142
|
+
const char *user;
|
143
|
+
const char *pass;
|
144
|
+
} storj_bridge_options_t;
|
145
|
+
|
146
|
+
/** @brief File encryption options
|
147
|
+
*
|
148
|
+
* The mnemonic is a BIP39 secret code used for generating keys for file
|
149
|
+
* encryption and decryption.
|
150
|
+
*/
|
151
|
+
typedef struct storj_encrypt_options {
|
152
|
+
const char *mnemonic;
|
153
|
+
} storj_encrypt_options_t;
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
/** @brief HTTP configuration options
|
158
|
+
*
|
159
|
+
* Settings for making HTTP requests
|
160
|
+
*/
|
161
|
+
typedef struct storj_http_options {
|
162
|
+
const char *user_agent;
|
163
|
+
const char *proxy_url;
|
164
|
+
const char *cainfo_path;
|
165
|
+
uint64_t low_speed_limit;
|
166
|
+
uint64_t low_speed_time;
|
167
|
+
uint64_t timeout;
|
168
|
+
} storj_http_options_t;
|
169
|
+
|
170
|
+
/** @brief A function signature for logging
|
171
|
+
*/
|
172
|
+
typedef void (*storj_logger_fn)(const char *message, int level, void *handle);
|
173
|
+
|
174
|
+
/** @brief Logging configuration options
|
175
|
+
*
|
176
|
+
* Settings for logging
|
177
|
+
*/
|
178
|
+
typedef struct storj_log_options {
|
179
|
+
storj_logger_fn logger;
|
180
|
+
int level;
|
181
|
+
} storj_log_options_t;
|
182
|
+
|
183
|
+
/** @brief A function signature for logging
|
184
|
+
*/
|
185
|
+
typedef void (*storj_logger_format_fn)(storj_log_options_t *options,
|
186
|
+
void *handle,
|
187
|
+
const char *format, ...);
|
188
|
+
|
189
|
+
/** @brief Functions for all logging levels
|
190
|
+
*/
|
191
|
+
typedef struct storj_log_levels {
|
192
|
+
storj_logger_format_fn debug;
|
193
|
+
storj_logger_format_fn info;
|
194
|
+
storj_logger_format_fn warn;
|
195
|
+
storj_logger_format_fn error;
|
196
|
+
} storj_log_levels_t;
|
197
|
+
|
198
|
+
/** @brief A structure for a Storj user environment.
|
199
|
+
*
|
200
|
+
* This is the highest level structure and holds many commonly used options
|
201
|
+
* and the event loop for queuing work.
|
202
|
+
*/
|
203
|
+
typedef struct storj_env {
|
204
|
+
storj_bridge_options_t *bridge_options;
|
205
|
+
storj_encrypt_options_t *encrypt_options;
|
206
|
+
storj_http_options_t *http_options;
|
207
|
+
storj_log_options_t *log_options;
|
208
|
+
const char *tmp_path;
|
209
|
+
uv_loop_t *loop;
|
210
|
+
storj_log_levels_t *log;
|
211
|
+
} storj_env_t;
|
212
|
+
|
213
|
+
/** @brief A structure for queueing json request work
|
214
|
+
*/
|
215
|
+
typedef struct {
|
216
|
+
storj_http_options_t *http_options;
|
217
|
+
storj_bridge_options_t *options;
|
218
|
+
char *method;
|
219
|
+
char *path;
|
220
|
+
bool auth;
|
221
|
+
struct json_object *body;
|
222
|
+
struct json_object *response;
|
223
|
+
int error_code;
|
224
|
+
int status_code;
|
225
|
+
void *handle;
|
226
|
+
} json_request_t;
|
227
|
+
|
228
|
+
/** @brief A structure for that describes a bucket
|
229
|
+
*/
|
230
|
+
typedef struct {
|
231
|
+
const char *created;
|
232
|
+
const char *name;
|
233
|
+
const char *id;
|
234
|
+
bool decrypted;
|
235
|
+
} storj_bucket_meta_t;
|
236
|
+
|
237
|
+
/** @brief A structure for queueing create bucket request work
|
238
|
+
*/
|
239
|
+
typedef struct {
|
240
|
+
storj_http_options_t *http_options;
|
241
|
+
storj_encrypt_options_t *encrypt_options;
|
242
|
+
storj_bridge_options_t *bridge_options;
|
243
|
+
const char *bucket_name;
|
244
|
+
const char *encrypted_bucket_name;
|
245
|
+
struct json_object *response;
|
246
|
+
storj_bucket_meta_t *bucket;
|
247
|
+
int error_code;
|
248
|
+
int status_code;
|
249
|
+
void *handle;
|
250
|
+
} create_bucket_request_t;
|
251
|
+
|
252
|
+
/** @brief A structure for queueing list buckets request work
|
253
|
+
*/
|
254
|
+
typedef struct {
|
255
|
+
storj_http_options_t *http_options;
|
256
|
+
storj_encrypt_options_t *encrypt_options;
|
257
|
+
storj_bridge_options_t *options;
|
258
|
+
char *method;
|
259
|
+
char *path;
|
260
|
+
bool auth;
|
261
|
+
struct json_object *body;
|
262
|
+
struct json_object *response;
|
263
|
+
storj_bucket_meta_t *buckets;
|
264
|
+
uint32_t total_buckets;
|
265
|
+
int error_code;
|
266
|
+
int status_code;
|
267
|
+
void *handle;
|
268
|
+
} get_buckets_request_t;
|
269
|
+
|
270
|
+
/** @brief A structure for queueing get bucket request work
|
271
|
+
*/
|
272
|
+
typedef struct {
|
273
|
+
storj_http_options_t *http_options;
|
274
|
+
storj_encrypt_options_t *encrypt_options;
|
275
|
+
storj_bridge_options_t *options;
|
276
|
+
char *method;
|
277
|
+
char *path;
|
278
|
+
bool auth;
|
279
|
+
struct json_object *body;
|
280
|
+
struct json_object *response;
|
281
|
+
storj_bucket_meta_t *bucket;
|
282
|
+
int error_code;
|
283
|
+
int status_code;
|
284
|
+
void *handle;
|
285
|
+
} get_bucket_request_t;
|
286
|
+
|
287
|
+
/** @brief A structure for that describes a bucket entry/file
|
288
|
+
*/
|
289
|
+
typedef struct {
|
290
|
+
const char *created;
|
291
|
+
const char *filename;
|
292
|
+
const char *mimetype;
|
293
|
+
const char *erasure;
|
294
|
+
uint64_t size;
|
295
|
+
const char *hmac;
|
296
|
+
const char *id;
|
297
|
+
bool decrypted;
|
298
|
+
const char *index;
|
299
|
+
} storj_file_meta_t;
|
300
|
+
|
301
|
+
/** @brief A structure for queueing list files request work
|
302
|
+
*/
|
303
|
+
typedef struct {
|
304
|
+
storj_http_options_t *http_options;
|
305
|
+
storj_encrypt_options_t *encrypt_options;
|
306
|
+
storj_bridge_options_t *options;
|
307
|
+
const char *bucket_id;
|
308
|
+
char *method;
|
309
|
+
char *path;
|
310
|
+
bool auth;
|
311
|
+
struct json_object *body;
|
312
|
+
struct json_object *response;
|
313
|
+
storj_file_meta_t *files;
|
314
|
+
uint32_t total_files;
|
315
|
+
int error_code;
|
316
|
+
int status_code;
|
317
|
+
void *handle;
|
318
|
+
} list_files_request_t;
|
319
|
+
|
320
|
+
typedef enum {
|
321
|
+
BUCKET_PUSH,
|
322
|
+
BUCKET_PULL
|
323
|
+
} storj_bucket_op_t;
|
324
|
+
|
325
|
+
static const char *BUCKET_OP[] = { "PUSH", "PULL" };
|
326
|
+
|
327
|
+
/** @brief A data structure that represents an exchange report
|
328
|
+
*
|
329
|
+
* These are sent at the end of an exchange with a farmer to report the
|
330
|
+
* performance and reliability of farmers.
|
331
|
+
*/
|
332
|
+
typedef struct {
|
333
|
+
char *data_hash;
|
334
|
+
char *reporter_id;
|
335
|
+
char *farmer_id;
|
336
|
+
char *client_id;
|
337
|
+
uint64_t start;
|
338
|
+
uint64_t end;
|
339
|
+
unsigned int code;
|
340
|
+
char *message;
|
341
|
+
unsigned int send_status;
|
342
|
+
unsigned int send_count;
|
343
|
+
uint32_t pointer_index;
|
344
|
+
} storj_exchange_report_t;
|
345
|
+
|
346
|
+
/** @brief A function signature for download/upload progress callback
|
347
|
+
*/
|
348
|
+
typedef void (*storj_progress_cb)(double progress,
|
349
|
+
uint64_t bytes,
|
350
|
+
uint64_t total_bytes,
|
351
|
+
void *handle);
|
352
|
+
|
353
|
+
/** @brief A function signature for a download complete callback
|
354
|
+
*/
|
355
|
+
typedef void (*storj_finished_download_cb)(int status, FILE *fd, void *handle);
|
356
|
+
|
357
|
+
/** @brief A function signature for an upload complete callback
|
358
|
+
*/
|
359
|
+
typedef void (*storj_finished_upload_cb)(int error_status, char *file_id, void *handle);
|
360
|
+
|
361
|
+
/** @brief A structure that represents a pointer to a shard
|
362
|
+
*
|
363
|
+
* A shard is an encrypted piece of a file, a pointer holds all necessary
|
364
|
+
* information to retrieve a shard from a farmer, including the IP address
|
365
|
+
* and port of the farmer, as well as a token indicating a transfer has been
|
366
|
+
* authorized. Other necessary information such as the expected hash of the
|
367
|
+
* data, and the index position in the file is also included.
|
368
|
+
*
|
369
|
+
* The data can be replaced with new farmer contact, in case of failure, and the
|
370
|
+
* total number of replacements can be tracked.
|
371
|
+
*/
|
372
|
+
typedef struct {
|
373
|
+
unsigned int replace_count;
|
374
|
+
char *token;
|
375
|
+
char *shard_hash;
|
376
|
+
uint32_t index;
|
377
|
+
int status;
|
378
|
+
uint64_t size;
|
379
|
+
bool parity;
|
380
|
+
uint64_t downloaded_size;
|
381
|
+
char *farmer_id;
|
382
|
+
char *farmer_address;
|
383
|
+
int farmer_port;
|
384
|
+
storj_exchange_report_t *report;
|
385
|
+
uv_work_t *work;
|
386
|
+
} storj_pointer_t;
|
387
|
+
|
388
|
+
/** @brief A structure for file upload options
|
389
|
+
*/
|
390
|
+
typedef struct {
|
391
|
+
int prepare_frame_limit;
|
392
|
+
int push_frame_limit;
|
393
|
+
int push_shard_limit;
|
394
|
+
bool rs;
|
395
|
+
const char *index;
|
396
|
+
const char *bucket_id;
|
397
|
+
const char *file_name;
|
398
|
+
FILE *fd;
|
399
|
+
} storj_upload_opts_t;
|
400
|
+
|
401
|
+
/** @brief A structure that keeps state between multiple worker threads,
|
402
|
+
* and for referencing a download to apply actions to an in-progress download.
|
403
|
+
*
|
404
|
+
* After work has been completed in a thread, its after work callback will
|
405
|
+
* update and modify the state and then queue the next set of work based on the
|
406
|
+
* changes, and added to the event loop. The state is all managed within one
|
407
|
+
* thread, the event loop thread, and any work that is performed in another
|
408
|
+
* thread should not modify this structure directly, but should pass a
|
409
|
+
* reference to it, so that once the work is complete the state can be updated.
|
410
|
+
*/
|
411
|
+
typedef struct {
|
412
|
+
uint64_t total_bytes;
|
413
|
+
storj_file_meta_t *info;
|
414
|
+
bool requesting_info;
|
415
|
+
uint32_t info_fail_count;
|
416
|
+
storj_env_t *env;
|
417
|
+
const char *file_id;
|
418
|
+
const char *bucket_id;
|
419
|
+
FILE *destination;
|
420
|
+
storj_progress_cb progress_cb;
|
421
|
+
storj_finished_download_cb finished_cb;
|
422
|
+
bool finished;
|
423
|
+
bool canceled;
|
424
|
+
uint64_t shard_size;
|
425
|
+
uint32_t total_shards;
|
426
|
+
int download_max_concurrency;
|
427
|
+
uint32_t completed_shards;
|
428
|
+
uint32_t resolving_shards;
|
429
|
+
storj_pointer_t *pointers;
|
430
|
+
char *excluded_farmer_ids;
|
431
|
+
uint32_t total_pointers;
|
432
|
+
uint32_t total_parity_pointers;
|
433
|
+
bool rs;
|
434
|
+
bool recovering_shards;
|
435
|
+
bool truncated;
|
436
|
+
bool pointers_completed;
|
437
|
+
uint32_t pointer_fail_count;
|
438
|
+
bool requesting_pointers;
|
439
|
+
int error_status;
|
440
|
+
bool writing;
|
441
|
+
uint8_t *decrypt_key;
|
442
|
+
uint8_t *decrypt_ctr;
|
443
|
+
const char *hmac;
|
444
|
+
uint32_t pending_work_count;
|
445
|
+
storj_log_levels_t *log;
|
446
|
+
void *handle;
|
447
|
+
} storj_download_state_t;
|
448
|
+
|
449
|
+
|
450
|
+
typedef struct {
|
451
|
+
char *hash;
|
452
|
+
uint8_t *challenges[STORJ_SHARD_CHALLENGES][32];
|
453
|
+
char *challenges_as_str[STORJ_SHARD_CHALLENGES][64 + 1];
|
454
|
+
// Merkle Tree leaves. Each leaf is size of RIPEMD160 hash
|
455
|
+
char *tree[2 * STORJ_SHARD_CHALLENGES - 1][20 * 2 + 1];
|
456
|
+
int index;
|
457
|
+
bool is_parity;
|
458
|
+
uint64_t size;
|
459
|
+
} shard_meta_t;
|
460
|
+
|
461
|
+
typedef struct {
|
462
|
+
char *token;
|
463
|
+
char *farmer_user_agent;
|
464
|
+
char *farmer_protocol;
|
465
|
+
char *farmer_address;
|
466
|
+
char *farmer_port;
|
467
|
+
char *farmer_node_id;
|
468
|
+
} farmer_pointer_t;
|
469
|
+
|
470
|
+
typedef struct {
|
471
|
+
int progress;
|
472
|
+
int push_frame_request_count;
|
473
|
+
int push_shard_request_count;
|
474
|
+
int index;
|
475
|
+
farmer_pointer_t *pointer;
|
476
|
+
shard_meta_t *meta;
|
477
|
+
storj_exchange_report_t *report;
|
478
|
+
uint64_t uploaded_size;
|
479
|
+
uv_work_t *work;
|
480
|
+
} shard_tracker_t;
|
481
|
+
|
482
|
+
typedef struct {
|
483
|
+
storj_env_t *env;
|
484
|
+
uint32_t shard_concurrency;
|
485
|
+
const char *index;
|
486
|
+
const char *file_name;
|
487
|
+
char *file_id;
|
488
|
+
const char *encrypted_file_name;
|
489
|
+
FILE *original_file;
|
490
|
+
uint64_t file_size;
|
491
|
+
const char *bucket_id;
|
492
|
+
char *bucket_key;
|
493
|
+
uint32_t completed_shards;
|
494
|
+
uint32_t total_shards;
|
495
|
+
uint32_t total_data_shards;
|
496
|
+
uint32_t total_parity_shards;
|
497
|
+
uint64_t shard_size;
|
498
|
+
uint64_t total_bytes;
|
499
|
+
uint64_t uploaded_bytes;
|
500
|
+
char *exclude;
|
501
|
+
char *frame_id;
|
502
|
+
char *hmac_id;
|
503
|
+
uint8_t *encryption_key;
|
504
|
+
uint8_t *encryption_ctr;
|
505
|
+
|
506
|
+
// TODO: change this to opts or env
|
507
|
+
bool rs;
|
508
|
+
bool awaiting_parity_shards;
|
509
|
+
char *parity_file_path;
|
510
|
+
FILE *parity_file;
|
511
|
+
char *encrypted_file_path;
|
512
|
+
FILE *encrypted_file;
|
513
|
+
bool creating_encrypted_file;
|
514
|
+
|
515
|
+
bool requesting_frame;
|
516
|
+
bool completed_upload;
|
517
|
+
bool creating_bucket_entry;
|
518
|
+
bool received_all_pointers;
|
519
|
+
bool final_callback_called;
|
520
|
+
bool canceled;
|
521
|
+
bool bucket_verified;
|
522
|
+
bool file_verified;
|
523
|
+
|
524
|
+
bool progress_finished;
|
525
|
+
|
526
|
+
int push_shard_limit;
|
527
|
+
int push_frame_limit;
|
528
|
+
int prepare_frame_limit;
|
529
|
+
|
530
|
+
int frame_request_count;
|
531
|
+
int add_bucket_entry_count;
|
532
|
+
int bucket_verify_count;
|
533
|
+
int file_verify_count;
|
534
|
+
int create_encrypted_file_count;
|
535
|
+
|
536
|
+
storj_progress_cb progress_cb;
|
537
|
+
storj_finished_upload_cb finished_cb;
|
538
|
+
int error_status;
|
539
|
+
storj_log_levels_t *log;
|
540
|
+
void *handle;
|
541
|
+
shard_tracker_t *shard;
|
542
|
+
int pending_work_count;
|
543
|
+
} storj_upload_state_t;
|
544
|
+
|
545
|
+
/**
|
546
|
+
* @brief Initialize a Storj environment
|
547
|
+
*
|
548
|
+
* This will setup an event loop for queueing further actions, as well
|
549
|
+
* as define necessary configuration options for communicating with Storj
|
550
|
+
* bridge, and for encrypting/decrypting files.
|
551
|
+
*
|
552
|
+
* @param[in] options - Storj Bridge API options
|
553
|
+
* @param[in] encrypt_options - File encryption options
|
554
|
+
* @param[in] http_options - HTTP settings
|
555
|
+
* @param[in] log_options - Logging settings
|
556
|
+
* @return A null value on error, otherwise a storj_env pointer.
|
557
|
+
*/
|
558
|
+
STORJ_API storj_env_t *storj_init_env(storj_bridge_options_t *options,
|
559
|
+
storj_encrypt_options_t *encrypt_options,
|
560
|
+
storj_http_options_t *http_options,
|
561
|
+
storj_log_options_t *log_options);
|
562
|
+
|
563
|
+
|
564
|
+
/**
|
565
|
+
* @brief Destroy a Storj environment
|
566
|
+
*
|
567
|
+
* This will free all memory for the Storj environment and zero out any memory
|
568
|
+
* with sensitive information, such as passwords and encryption keys.
|
569
|
+
*
|
570
|
+
* The event loop must be closed before this method should be used.
|
571
|
+
*
|
572
|
+
* @param [in] env
|
573
|
+
*/
|
574
|
+
STORJ_API int storj_destroy_env(storj_env_t *env);
|
575
|
+
|
576
|
+
/**
|
577
|
+
* @brief Will encrypt and write options to disk
|
578
|
+
*
|
579
|
+
* This will encrypt bridge and encryption options to disk using a key
|
580
|
+
* derivation function on a passphrase.
|
581
|
+
*
|
582
|
+
* @param[in] filepath - The file path to save the options
|
583
|
+
* @param[in] passphrase - Used to encrypt options to disk
|
584
|
+
* @param[in] bridge_user - The bridge username
|
585
|
+
* @param[in] bridge_pass - The bridge password
|
586
|
+
* @param[in] mnemonic - The file encryption mnemonic
|
587
|
+
* @return A non-zero value on error, zero on success.
|
588
|
+
*/
|
589
|
+
STORJ_API int storj_encrypt_write_auth(const char *filepath,
|
590
|
+
const char *passhrase,
|
591
|
+
const char *bridge_user,
|
592
|
+
const char *bridge_pass,
|
593
|
+
const char *mnemonic);
|
594
|
+
|
595
|
+
|
596
|
+
/**
|
597
|
+
* @brief Will encrypt options to disk
|
598
|
+
*
|
599
|
+
* This will encrypt bridge and encryption using a key
|
600
|
+
* derivation function on a passphrase.
|
601
|
+
*
|
602
|
+
* @param[in] passphrase - Used to encrypt options to disk
|
603
|
+
* @param[in] bridge_user - The bridge username
|
604
|
+
* @param[in] bridge_pass - The bridge password
|
605
|
+
* @param[in] mnemonic - The file encryption mnemonic
|
606
|
+
* @param[out] buffer - The destination buffer
|
607
|
+
* @return A non-zero value on error, zero on success.
|
608
|
+
*/
|
609
|
+
STORJ_API int storj_encrypt_auth(const char *passhrase,
|
610
|
+
const char *bridge_user,
|
611
|
+
const char *bridge_pass,
|
612
|
+
const char *mnemonic,
|
613
|
+
char **buffer);
|
614
|
+
|
615
|
+
/**
|
616
|
+
* @brief Will read and decrypt options from disk
|
617
|
+
*
|
618
|
+
* This will decrypt bridge and encryption options from disk from
|
619
|
+
* the passphrase.
|
620
|
+
*
|
621
|
+
* @param[in] filepath - The file path to read the options
|
622
|
+
* @param[in] passphrase - Used to encrypt options to disk
|
623
|
+
* @param[out] bridge_user - The bridge username
|
624
|
+
* @param[out] bridge_pass - The bridge password
|
625
|
+
* @param[out] mnemonic - The file encryption mnemonic
|
626
|
+
* @return A non-zero value on error, zero on success.
|
627
|
+
*/
|
628
|
+
STORJ_API int storj_decrypt_read_auth(const char *filepath,
|
629
|
+
const char *passphrase,
|
630
|
+
char **bridge_user,
|
631
|
+
char **bridge_pass,
|
632
|
+
char **mnemonic);
|
633
|
+
|
634
|
+
/**
|
635
|
+
* @brief Will decrypt options
|
636
|
+
*
|
637
|
+
* This will decrypt bridge and encryption options using key derived
|
638
|
+
* from a passphrase.
|
639
|
+
*
|
640
|
+
* @param[in] buffer - The encrypted buffer
|
641
|
+
* @param[in] passphrase - Used to encrypt options to disk
|
642
|
+
* @param[out] bridge_user - The bridge username
|
643
|
+
* @param[out] bridge_pass - The bridge password
|
644
|
+
* @param[out] mnemonic - The file encryption mnemonic
|
645
|
+
* @return A non-zero value on error, zero on success.
|
646
|
+
*/
|
647
|
+
STORJ_API int storj_decrypt_auth(const char *buffer,
|
648
|
+
const char *passphrase,
|
649
|
+
char **bridge_user,
|
650
|
+
char **bridge_pass,
|
651
|
+
char **mnemonic);
|
652
|
+
|
653
|
+
/**
|
654
|
+
* @brief Will get the current unix timestamp in milliseconds
|
655
|
+
*
|
656
|
+
* @return A unix timestamp
|
657
|
+
*/
|
658
|
+
STORJ_API uint64_t storj_util_timestamp();
|
659
|
+
|
660
|
+
/**
|
661
|
+
* @brief Will generate a new random mnemonic
|
662
|
+
*
|
663
|
+
* This will generate a new random mnemonic with 128 to 256 bits
|
664
|
+
* of entropy.
|
665
|
+
*
|
666
|
+
* @param[in] strength - The bits of entropy
|
667
|
+
* @param[out] buffer - The destination of the mnemonic
|
668
|
+
* @return A non-zero value on error, zero on success.
|
669
|
+
*/
|
670
|
+
STORJ_API int storj_mnemonic_generate(int strength, char **buffer);
|
671
|
+
|
672
|
+
/**
|
673
|
+
* @brief Will check that a mnemonic is valid
|
674
|
+
*
|
675
|
+
* This will check that a mnemonic has been entered correctly by verifying
|
676
|
+
* the checksum, and that words are a part of the list.
|
677
|
+
*
|
678
|
+
* @param[in] strength - The bits of entropy
|
679
|
+
* @return Will return true on success and false failure
|
680
|
+
*/
|
681
|
+
STORJ_API bool storj_mnemonic_check(const char *mnemonic);
|
682
|
+
|
683
|
+
/**
|
684
|
+
* @brief Get the error message for an error code
|
685
|
+
*
|
686
|
+
* This function will return a error message associated with a storj
|
687
|
+
* error code.
|
688
|
+
*
|
689
|
+
* @param[in] error_code The storj error code integer
|
690
|
+
* @return A char pointer with error message
|
691
|
+
*/
|
692
|
+
STORJ_API char *storj_strerror(int error_code);
|
693
|
+
|
694
|
+
/**
|
695
|
+
* @brief Get Storj bridge API information.
|
696
|
+
*
|
697
|
+
* This function will get general information about the storj bridge api.
|
698
|
+
* The network i/o is performed in a thread pool with a libuv loop, and the
|
699
|
+
* response is available in the first argument to the callback function.
|
700
|
+
*
|
701
|
+
* @param[in] env The storj environment struct
|
702
|
+
* @param[in] handle A pointer that will be available in the callback
|
703
|
+
* @param[in] cb A function called with response when complete
|
704
|
+
* @return A non-zero error value on failure and 0 on success.
|
705
|
+
*/
|
706
|
+
STORJ_API int storj_bridge_get_info(storj_env_t *env,
|
707
|
+
void *handle,
|
708
|
+
uv_after_work_cb cb);
|
709
|
+
|
710
|
+
/**
|
711
|
+
* @brief List available buckets for a user.
|
712
|
+
*
|
713
|
+
* @param[in] env The storj environment struct
|
714
|
+
* @param[in] handle A pointer that will be available in the callback
|
715
|
+
* @param[in] cb A function called with response when complete
|
716
|
+
* @return A non-zero error value on failure and 0 on success.
|
717
|
+
*/
|
718
|
+
STORJ_API int storj_bridge_get_buckets(storj_env_t *env,
|
719
|
+
void *handle,
|
720
|
+
uv_after_work_cb cb);
|
721
|
+
|
722
|
+
/**
|
723
|
+
* @brief Will free all structs for get buckets request
|
724
|
+
*
|
725
|
+
* @param[in] req - The work request from storj_bridge_get_buckets callback
|
726
|
+
*/
|
727
|
+
STORJ_API void storj_free_get_buckets_request(get_buckets_request_t *req);
|
728
|
+
|
729
|
+
/**
|
730
|
+
* @brief Create a bucket.
|
731
|
+
*
|
732
|
+
* @param[in] env The storj environment struct
|
733
|
+
* @param[in] name The name of the bucket
|
734
|
+
* @param[in] handle A pointer that will be available in the callback
|
735
|
+
* @param[in] cb A function called with response when complete
|
736
|
+
* @return A non-zero error value on failure and 0 on success.
|
737
|
+
*/
|
738
|
+
STORJ_API int storj_bridge_create_bucket(storj_env_t *env,
|
739
|
+
const char *name,
|
740
|
+
void *handle,
|
741
|
+
uv_after_work_cb cb);
|
742
|
+
|
743
|
+
/**
|
744
|
+
* @brief Delete a bucket.
|
745
|
+
*
|
746
|
+
* @param[in] env The storj environment struct
|
747
|
+
* @param[in] id The bucket id
|
748
|
+
* @param[in] handle A pointer that will be available in the callback
|
749
|
+
* @param[in] cb A function called with response when complete
|
750
|
+
* @return A non-zero error value on failure and 0 on success.
|
751
|
+
*/
|
752
|
+
STORJ_API int storj_bridge_delete_bucket(storj_env_t *env,
|
753
|
+
const char *id,
|
754
|
+
void *handle,
|
755
|
+
uv_after_work_cb cb);
|
756
|
+
|
757
|
+
/**
|
758
|
+
* @brief Get a info of specific bucket.
|
759
|
+
*
|
760
|
+
* @param[in] env The storj environment struct
|
761
|
+
* @param[in] bucket_id The bucket id
|
762
|
+
* @param[in] handle A pointer that will be available in the callback
|
763
|
+
* @param[in] cb A function called with response when complete
|
764
|
+
* @return A non-zero error value on failure and 0 on success.
|
765
|
+
*/
|
766
|
+
STORJ_API int storj_bridge_get_bucket(storj_env_t *env,
|
767
|
+
const char *id,
|
768
|
+
void *handle,
|
769
|
+
uv_after_work_cb cb);
|
770
|
+
|
771
|
+
/**
|
772
|
+
* @brief Will free all structs for get bucket request
|
773
|
+
*
|
774
|
+
* @param[in] req - The work request from storj_bridge_get_bucket callback
|
775
|
+
*/
|
776
|
+
STORJ_API void storj_free_get_bucket_request(get_bucket_request_t *req);
|
777
|
+
|
778
|
+
/**
|
779
|
+
* @brief Get a list of all files in a bucket.
|
780
|
+
*
|
781
|
+
* @param[in] env The storj environment struct
|
782
|
+
* @param[in] id The bucket id
|
783
|
+
* @param[in] handle A pointer that will be available in the callback
|
784
|
+
* @param[in] cb A function called with response when complete
|
785
|
+
* @return A non-zero error value on failure and 0 on success.
|
786
|
+
*/
|
787
|
+
STORJ_API int storj_bridge_list_files(storj_env_t *env,
|
788
|
+
const char *id,
|
789
|
+
void *handle,
|
790
|
+
uv_after_work_cb cb);
|
791
|
+
|
792
|
+
/**
|
793
|
+
* @brief Will free all structs for list files request
|
794
|
+
*
|
795
|
+
* @param[in] req - The work request from storj_bridge_list_files callback
|
796
|
+
*/
|
797
|
+
STORJ_API void storj_free_list_files_request(list_files_request_t *req);
|
798
|
+
|
799
|
+
/**
|
800
|
+
* @brief Create a PUSH or PULL bucket token.
|
801
|
+
*
|
802
|
+
* @param[in] env The storj environment struct
|
803
|
+
* @param[in] bucket_id The bucket id
|
804
|
+
* @param[in] operation The type of operation PUSH or PULL
|
805
|
+
* @param[in] handle A pointer that will be available in the callback
|
806
|
+
* @param[in] cb A function called with response when complete
|
807
|
+
* @return A non-zero error value on failure and 0 on success.
|
808
|
+
*/
|
809
|
+
STORJ_API int storj_bridge_create_bucket_token(storj_env_t *env,
|
810
|
+
const char *bucket_id,
|
811
|
+
storj_bucket_op_t operation,
|
812
|
+
void *handle,
|
813
|
+
uv_after_work_cb cb);
|
814
|
+
|
815
|
+
/**
|
816
|
+
* @brief Get pointers with locations to file shards.
|
817
|
+
*
|
818
|
+
* @param[in] env The storj environment struct
|
819
|
+
* @param[in] bucket_id The bucket id
|
820
|
+
* @param[in] file_id The bucket id
|
821
|
+
* @param[in] handle A pointer that will be available in the callback
|
822
|
+
* @param[in] cb A function called with response when complete
|
823
|
+
* @return A non-zero error value on failure and 0 on success.
|
824
|
+
*/
|
825
|
+
STORJ_API int storj_bridge_get_file_pointers(storj_env_t *env,
|
826
|
+
const char *bucket_id,
|
827
|
+
const char *file_id,
|
828
|
+
void *handle,
|
829
|
+
uv_after_work_cb cb);
|
830
|
+
|
831
|
+
/**
|
832
|
+
* @brief Delete a file in a bucket.
|
833
|
+
*
|
834
|
+
* @param[in] env The storj environment struct
|
835
|
+
* @param[in] bucket_id The bucket id
|
836
|
+
* @param[in] file_id The bucket id
|
837
|
+
* @param[in] handle A pointer that will be available in the callback
|
838
|
+
* @param[in] cb A function called with response when complete
|
839
|
+
* @return A non-zero error value on failure and 0 on success.
|
840
|
+
*/
|
841
|
+
STORJ_API int storj_bridge_delete_file(storj_env_t *env,
|
842
|
+
const char *bucket_id,
|
843
|
+
const char *file_id,
|
844
|
+
void *handle,
|
845
|
+
uv_after_work_cb cb);
|
846
|
+
|
847
|
+
/**
|
848
|
+
* @brief Create a file frame
|
849
|
+
*
|
850
|
+
* @param[in] env The storj environment struct
|
851
|
+
* @param[in] handle A pointer that will be available in the callback
|
852
|
+
* @param[in] cb A function called with response when complete
|
853
|
+
* @return A non-zero error value on failure and 0 on success.
|
854
|
+
*/
|
855
|
+
STORJ_API int storj_bridge_create_frame(storj_env_t *env,
|
856
|
+
void *handle,
|
857
|
+
uv_after_work_cb cb);
|
858
|
+
|
859
|
+
/**
|
860
|
+
* @brief List available file frames
|
861
|
+
*
|
862
|
+
* @param[in] env The storj environment struct
|
863
|
+
* @param[in] handle A pointer that will be available in the callback
|
864
|
+
* @param[in] cb A function called with response when complete
|
865
|
+
* @return A non-zero error value on failure and 0 on success.
|
866
|
+
*/
|
867
|
+
STORJ_API int storj_bridge_get_frames(storj_env_t *env,
|
868
|
+
void *handle,
|
869
|
+
uv_after_work_cb cb);
|
870
|
+
|
871
|
+
/**
|
872
|
+
* @brief Get information for a file frame
|
873
|
+
*
|
874
|
+
* @param[in] env The storj environment struct
|
875
|
+
* @param[in] frame_id The frame id
|
876
|
+
* @param[in] handle A pointer that will be available in the callback
|
877
|
+
* @param[in] cb A function called with response when complete
|
878
|
+
* @return A non-zero error value on failure and 0 on success.
|
879
|
+
*/
|
880
|
+
STORJ_API int storj_bridge_get_frame(storj_env_t *env,
|
881
|
+
const char *frame_id,
|
882
|
+
void *handle,
|
883
|
+
uv_after_work_cb cb);
|
884
|
+
|
885
|
+
/**
|
886
|
+
* @brief Delete a file frame
|
887
|
+
*
|
888
|
+
* @param[in] env The storj environment struct
|
889
|
+
* @param[in] frame_id The frame id
|
890
|
+
* @param[in] handle A pointer that will be available in the callback
|
891
|
+
* @param[in] cb A function called with response when complete
|
892
|
+
* @return A non-zero error value on failure and 0 on success.
|
893
|
+
*/
|
894
|
+
STORJ_API int storj_bridge_delete_frame(storj_env_t *env,
|
895
|
+
const char *frame_id,
|
896
|
+
void *handle,
|
897
|
+
uv_after_work_cb cb);
|
898
|
+
|
899
|
+
/**
|
900
|
+
* @brief Get metadata for a file
|
901
|
+
*
|
902
|
+
* @param[in] env The storj environment struct
|
903
|
+
* @param[in] bucket_id The bucket id
|
904
|
+
* @param[in] file_id The bucket id
|
905
|
+
* @param[in] handle A pointer that will be available in the callback
|
906
|
+
* @param[in] cb A function called with response when complete
|
907
|
+
* @return A non-zero error value on failure and 0 on success.
|
908
|
+
*/
|
909
|
+
STORJ_API int storj_bridge_get_file_info(storj_env_t *env,
|
910
|
+
const char *bucket_id,
|
911
|
+
const char *file_id,
|
912
|
+
void *handle,
|
913
|
+
uv_after_work_cb cb);
|
914
|
+
|
915
|
+
/**
|
916
|
+
* @brief Get mirror data for a file
|
917
|
+
*
|
918
|
+
* @param[in] env The storj environment struct
|
919
|
+
* @param[in] bucket_id The bucket id
|
920
|
+
* @param[in] file_id The bucket id
|
921
|
+
* @param[in] handle A pointer that will be available in the callback
|
922
|
+
* @param[in] cb A function called with response when complete
|
923
|
+
* @return A non-zero error value on failure and 0 on success.
|
924
|
+
*/
|
925
|
+
STORJ_API int storj_bridge_list_mirrors(storj_env_t *env,
|
926
|
+
const char *bucket_id,
|
927
|
+
const char *file_id,
|
928
|
+
void *handle,
|
929
|
+
uv_after_work_cb cb);
|
930
|
+
|
931
|
+
/**
|
932
|
+
* @brief Will cancel an upload
|
933
|
+
*
|
934
|
+
* @param[in] state A pointer to the the upload state
|
935
|
+
* @return A non-zero error value on failure and 0 on success.
|
936
|
+
*/
|
937
|
+
STORJ_API int storj_bridge_store_file_cancel(storj_upload_state_t *state);
|
938
|
+
|
939
|
+
/**
|
940
|
+
* @brief Upload a file
|
941
|
+
*
|
942
|
+
* @param[in] env A pointer to environment
|
943
|
+
* @param[in] state A pointer to the the upload state
|
944
|
+
* @param[in] opts The options for the upload
|
945
|
+
* @param[in] handle A pointer that will be available in the callback
|
946
|
+
* @param[in] progress_cb Function called with progress updates
|
947
|
+
* @param[in] finished_cb Function called when download finished
|
948
|
+
* @return A non-zero error value on failure and 0 on success.
|
949
|
+
*/
|
950
|
+
STORJ_API storj_upload_state_t *storj_bridge_store_file(storj_env_t *env,
|
951
|
+
storj_upload_opts_t *opts,
|
952
|
+
void *handle,
|
953
|
+
storj_progress_cb progress_cb,
|
954
|
+
storj_finished_upload_cb finished_cb);
|
955
|
+
|
956
|
+
/**
|
957
|
+
* @brief Will cancel a download
|
958
|
+
*
|
959
|
+
* @param[in] state A pointer to the the download state
|
960
|
+
* @return A non-zero error value on failure and 0 on success.
|
961
|
+
*/
|
962
|
+
STORJ_API int storj_bridge_resolve_file_cancel(storj_download_state_t *state);
|
963
|
+
|
964
|
+
/**
|
965
|
+
* @brief Download a file
|
966
|
+
*
|
967
|
+
* @param[in] env A pointer to environment
|
968
|
+
* @param[in] state A pointer to the the download state
|
969
|
+
* @param[in] bucket_id Character array of bucket id
|
970
|
+
* @param[in] file_id Character array of file id
|
971
|
+
* @param[in] destination File descriptor of the destination
|
972
|
+
* @param[in] handle A pointer that will be available in the callback
|
973
|
+
* @param[in] progress_cb Function called with progress updates
|
974
|
+
* @param[in] finished_cb Function called when download finished
|
975
|
+
* @return A non-zero error value on failure and 0 on success.
|
976
|
+
*/
|
977
|
+
STORJ_API storj_download_state_t *storj_bridge_resolve_file(storj_env_t *env,
|
978
|
+
const char *bucket_id,
|
979
|
+
const char *file_id,
|
980
|
+
FILE *destination,
|
981
|
+
void *handle,
|
982
|
+
storj_progress_cb progress_cb,
|
983
|
+
storj_finished_download_cb finished_cb);
|
984
|
+
|
985
|
+
/**
|
986
|
+
* @brief Register a user
|
987
|
+
*
|
988
|
+
* @param[in] env The storj environment struct
|
989
|
+
* @param[in] email the user's email
|
990
|
+
* @param[in] password the user's password
|
991
|
+
* @param[in] handle A pointer that will be available in the callback
|
992
|
+
* @param[in] cb A function called with response when complete
|
993
|
+
* @return A non-zero error value on failure and 0 on success.
|
994
|
+
*/
|
995
|
+
STORJ_API int storj_bridge_register(storj_env_t *env,
|
996
|
+
const char *email,
|
997
|
+
const char *password,
|
998
|
+
void *handle,
|
999
|
+
uv_after_work_cb cb);
|
1000
|
+
|
1001
|
+
static inline char separator()
|
1002
|
+
{
|
1003
|
+
#ifdef _WIN32
|
1004
|
+
return '\\';
|
1005
|
+
#else
|
1006
|
+
return '/';
|
1007
|
+
#endif
|
1008
|
+
}
|
1009
|
+
|
1010
|
+
#ifdef __cplusplus
|
1011
|
+
}
|
1012
|
+
#endif
|
1013
|
+
|
1014
|
+
#endif /* STORJ_H */
|