First stab at ipfs init

This commit is contained in:
jmjatlanta 2016-10-26 20:14:07 -05:00
parent fcda3e83ce
commit 689408ffe9
20 changed files with 342 additions and 0 deletions

9
Makefile Normal file
View file

@ -0,0 +1,9 @@
all:
cd repo; make all;
cd cmd; make all;
cd test; make all;
clean:
cd repo; make clean;
cd cmd; make clean;
cd test; make clean;

5
cmd/Makefile Normal file
View file

@ -0,0 +1,5 @@
all:
cd ipfs; make all;
clean:
cd ipfs; make clean;

16
cmd/ipfs/Makefile Normal file
View file

@ -0,0 +1,16 @@
CC = gcc
CFLAGS = -O0
LFLAGS =
DEPS = init.h
OBJS = init.o main.o ../../commands/argument.o
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
ipfs: $(OBJS)
$(CC) -o $@ $^ $(LFLAGS)
all: ipfs
clean:
rm -f *.o

15
cmd/ipfs/init.c Normal file
View file

@ -0,0 +1,15 @@
#include "init.h"
int get_init_command(struct command* cmd) {
// help text
cmd->help_text.tagline = "Initializes IPFS config file.";
cmd->help_text.short_description = "\nInitializes IPFS configuration files and generates a new keypair.\n\nipfs uses a repository in the local file system. By default, the repo is\nlocated at ~/.ipfs. To change the repo location, set the $IPFS_PATH\nenvironment variable.:\n\n export IPFS_PATH=/path/to/ipfsrepo";
// arguments
// initialize an array of arguments with size of 1
struct argument argument;
init_string_argument(&argument, "default-config", 0, 0, "Initialize with the given configuration");
argument.enable_stdin = 1;
struct argument* array[1] = { &argument };
cmd->arguments = array;
return 0;
}

11
cmd/ipfs/init.h Normal file
View file

@ -0,0 +1,11 @@
/**
* Initialize an IPFS repository
*/
#ifndef __CMD_IPFS_INIT_H__
#define __CMD_IPFS_INIT_H__
#include "../../commands/command.h"
int get_init_command(struct command* command);
#endif

BIN
cmd/ipfs/ipfs Executable file

Binary file not shown.

32
cmd/ipfs/main.c Normal file
View file

@ -0,0 +1,32 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print_help(int longHelp, FILE* outStream) {
}
/**
* command line interface to IPFS.
* Steps:
* 1) parse the command line
* 2) if user requests help, display then exit
* 3) run the command
* 4) output the response
* 5) if anything fails, print the error, maybe with help
*/
int main(int argc, char** argv) {
if (argc == 2) {
if (strncmp(argv[1], "help", 4) == 0) {
print_help(1, stdout);
exit(0);
} else if (strncmp(argv[1], "--version", 9) == 0) {
argv[1] = "version";
}
} // end of help
// parse command line into an invocation
// exit
exit(0);
}

21
commands/argument.c Normal file
View file

@ -0,0 +1,21 @@
#include "argument.h"
int init_argument(struct argument* argument, char* name, int required, int variadic, char* description) {
argument->name = name;
argument->required = required;
argument->variadic = variadic;
argument->description = description;
return 0;
}
int init_string_argument(struct argument* argument, char* name, int required, int variadic, char* description) {
init_argument(argument, name, required, variadic, description);
argument->type = string;
return 0;
}
int init_file_argument(struct argument* argument, char* name, int required, int variadic, char* description) {
init_argument(argument, name, required, variadic, description);
argument->type = file;
return 0;
}

21
commands/argument.h Normal file
View file

@ -0,0 +1,21 @@
#ifndef __COMMANDS_ARGUMENT_H__
#define __COMMANDS_ARGUMENT_H__
enum argument_type { string, file };
struct argument {
char* name;
enum argument_type type;
int required;
int variadic;
int supports_stdin;
int recursive;
char* description;
int enable_stdin;
};
int init_argument(struct argument* argument, char* name, int required, int variadic, char* description);
int init_string_argument(struct argument* argument, char* name, int required, int variadic, char* description);
int init_file_argument(struct argument* argument, char* name, int required, int variadic, char* description);
#endif

40
commands/command.h Normal file
View file

@ -0,0 +1,40 @@
/***
* The structures to commands
*/
#ifndef __COMMANDS_COMMAND_H__
#define __COMMANDS_COMMAND_H__
#include "argument.h"
struct help_text {
char* tagline;
char* short_description;
char** synopsis_options_values;
// optional
char* usage;
char* long_description;
char* options;
char* subcommands;
char* synopsis;
};
struct command {
//struct option* options;
struct argument** arguments;
//int (*pre_run)(struct request*);
//int (*run)(struct request*);
//int (*post_run)(struct request*);
//struct marshaller** marshallers;
struct help_text help_text;
// a boolean to determine if this is an external
// binary.
int external;
//struct type return_type;
char** subcommands;
};
#endif // command.h

12
repo/Makefile Normal file
View file

@ -0,0 +1,12 @@
CC = gcc
CFLAGS = -O0
DEPS = repo.h
OBJS = repo.o
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
all: $(OBJS)
clean:
rm -f *.o

22
repo/config/config.h Normal file
View file

@ -0,0 +1,22 @@
#ifndef __CONFIG_H__
#define __CONFIG_H__
#include "datastore.h"
struct config {
//struct identity identity;
struct datastore datastore;
//struct address* addresses;
//struct mount* mounts;
//struct discovery discovery;
//struct ipns ipns;
//struct bootstrap* peer_addresses;
//struct tour tour;
//struct gateway gateway;
//struct supernode_routing supernode_client_config;
//struct api api;
//struct swarm swarm;
//struct reprovider reprovider;
};
#endif

21
repo/config/datastore.h Normal file
View file

@ -0,0 +1,21 @@
#ifndef __DATASTORE_H__
#define __DATASTORE_H__
#include <stdint.h>
const char* datastore_default_directory = "datastore";
struct datastore {
char* type;
char* path;
char* storage_max;
int64_t storage_gc_watermark;
char* gc_period;
char* params;
int no_sync;
int hash_on_read;
int bloom_filter_size;
};
#endif

6
repo/repo.c Normal file
View file

@ -0,0 +1,6 @@
#include "repo.h"
int repo_get_config(struct config* config) {
return 0;
}

26
repo/repo.h Normal file
View file

@ -0,0 +1,26 @@
#ifndef __REPO_H__
#define __REPO_H__
#include <stdint.h>
#include "config/config.h"
/**
* Get the config
* @param config a place to put the buffer (must have been pre-allocated)
* @returns 0 on error
*/
int repo_get_config(struct config* config);
/**
* Retrieves the config
* @param config a place to get the information
* @returns 0 on error
*/
int repo_set_config(struct config* config);
int repo_set_config_key(char* key, void* value);
int repo_get_config_key(char* key, void* value);
int repo_get_datastore(struct datastore* datastore);
int repo_get_storage_usage(uint64_t* usage);
#endif // __REPO_H__

16
test/Makefile Normal file
View file

@ -0,0 +1,16 @@
CC = gcc
CFLAGS = -O0
LFLAGS =
DEPS = testit.h repo/test_repo.h cmd/ipfs/test_init.h
OBJS = testit.o ../cmd/ipfs/init.o ../commands/argument.o
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
testit: $(OBJS)
$(CC) -o $@ $^ $(LFLAGS)
all: testit
clean:
rm -f *.o

36
test/cmd/ipfs/test_init.h Normal file
View file

@ -0,0 +1,36 @@
/**
* Testing of cmd/ipfs/init
*/
#ifndef __TEST_INIT_H__
#define __TEST_INIT_H__
#include "../../../cmd/ipfs/init.h"
#include <stdio.h>
#include <string.h>
int test_get_init_command() {
struct command cmd = { 0 };
// make sure its empty
if (cmd.help_text.tagline != NULL) {
fprintf(stderr, "short description should be null\n");
return 0;
}
// grab the stuff
get_init_command(&cmd);
// make sure its right
if (cmd.help_text.tagline == NULL) {
fprintf(stderr, "short description is null\n");
return 0;
}
if (strcmp(cmd.help_text.tagline, "Initializes IPFS config file.") != 0) {
fprintf(stderr, "short description is not null\n");
return 0;
}
return 1;
}
#endif

13
test/repo/test_repo.h Normal file
View file

@ -0,0 +1,13 @@
#ifndef __TEST_REPO_H__
#define __TEST_REPO_H__
#include "../../repo/repo.h"
#include <stdio.h>
int test_config_repo() {
return 0;
}
#endif

19
test/testit.c Normal file
View file

@ -0,0 +1,19 @@
#include "testit.h"
#include "repo/test_repo.h"
#include "cmd/ipfs/test_init.h"
int testit(const char* name, int (*func)(void)) {
printf("Testing %s...\n", name);
int retVal = func();
if (retVal)
printf("%s success!\n", name);
else
printf("** Uh oh! %s failed.**\n", name);
return retVal;
}
int main(int argc, char** argv) {
testit("config_repo", test_config_repo);
testit("get_init_command", test_get_init_command);
return 1;
}

1
test/testit.h Normal file
View file

@ -0,0 +1 @@
int testit(const char* name, int (*func)(void));