$ git clone https://socialnetwork.ion.nu/socialnetwork.git
commit ee9e9c44c17ac6b97be7c38761fb8705c96fb1a0
Author: Alicia <...>
Date:   Sun Jan 22 00:16:07 2017 +0100

    Accept a path prefix to social_init() for where to load and store data.

diff --git a/social.c b/social.c
index a0d82b3..6e04115 100644
--- a/social.c
+++ b/social.c
@@ -28,6 +28,7 @@
 struct user** social_users=0;
 unsigned int social_usercount=0;
 struct user* social_self;
+static char* prefix=0;
 // Abstract away all the messagepassing and present information more or less statically
 // TODO: Think about privacy for all data updates
 // TODO: We must also sign all data updates to prevent forgeries
@@ -47,8 +48,8 @@ static void user_save(struct user* user)
   if(!user->pubkey){return;}
   // TODO: Absolute path, something like $HOME/.socialnetwork
   mkdir("users", 0700);
-  char path[strlen("users/0")+40];
-  sprintf(path, "users/"PEERFMT, PEERARG(user->id));
+  char path[strlen(prefix)+strlen("/users/0")+40];
+  sprintf(path, "%s/users/"PEERFMT, prefix, PEERARG(user->id));
   int f=open(path, O_WRONLY|O_CREAT|O_TRUNC, 0600);
   gnutls_datum_t key;
   gnutls_pubkey_export2(user->pubkey, GNUTLS_X509_FMT_PEM, &key);
@@ -65,8 +66,8 @@ static void user_load(struct user* user)
   // Load user data (only pubkey atm), but spare pubkey if it's already set
   if(!user->pubkey)
   {
-    char path[strlen("users/0")+40];
-    sprintf(path, "users/"PEERFMT, PEERARG(user->id));
+    char path[strlen(prefix)+strlen("/users/0")+40];
+    sprintf(path, "%s/users/"PEERFMT, prefix, PEERARG(user->id));
     int f=open(path, O_RDONLY);
     if(f>=0)
     {
@@ -81,8 +82,8 @@ static void user_load(struct user* user)
     }
   }
   // Load updates
-  char path[strlen("updates/0")+40];
-  sprintf(path, "updates/"PEERFMT, PEERARG(user->id));
+  char path[strlen(prefix)+strlen("/updates/0")+40];
+  sprintf(path, "%s/updates/"PEERFMT, prefix, PEERARG(user->id));
   int f=open(path, O_RDONLY);
   if(f<0){return;}
   uint64_t size;
@@ -176,8 +177,10 @@ static void sendupdates(struct peer* peer, void* data, unsigned int len)
   }
 }
 
-void social_init(const char* keypath)
+void social_init(const char* keypath, const char* pathprefix)
 {
+  free(prefix);
+  prefix=strdup(pathprefix);
   // Load key, friends, circles, etc. our own profile
   peer_init(keypath);
   social_self=user_new(peer_id);
@@ -193,7 +196,7 @@ void social_init(const char* keypath)
   peer_registercmd("updateinfo", updateinfo);
   peer_registercmd("getpeers", greetpeer);
   peer_registercmd("getupdates", sendupdates);
-// TODO: Set up socket and bootstrap here too? or accept an already set up socket?
+// TODO: Set up socket and bootstrap here too? or accept an already set up socket to bootstrap?
 }
 
 void social_findfriends(void) // Call a second or so after init (once we have some bootstrap peers)
diff --git a/social.h b/social.h
index 6bfce28..0153288 100644
--- a/social.h
+++ b/social.h
@@ -57,7 +57,7 @@ struct user
 extern struct user** social_users;
 extern unsigned int social_usercount;
 extern struct user* social_self; // Most things we need to keep track of for ourself are the same things we need to keep track of for others
-extern void social_init(const char* keypath);
+extern void social_init(const char* keypath, const char* pathprefix);
 extern struct friendslist* social_user_getcircle(struct user* user, uint32_t circle);
 extern void social_user_addtocircle(struct user* user, uint32_t circle, const unsigned char id[20]);
 extern void social_user_removefromcircle(struct user* user, uint32_t circle, const unsigned char id[20]);
diff --git a/socialtest.c b/socialtest.c
index 8269a7b..1a4c728 100644
--- a/socialtest.c
+++ b/socialtest.c
@@ -65,7 +65,7 @@ int main(int argc, char** argv)
     bind(sock, ai->ai_addr, ai->ai_addrlen);
     freeaddrinfo(ai);
   }
-  social_init("priv.pem");
+  social_init("priv.pem", ".");
   peer_bootstrap(sock, "127.0.0.1:4000");
 
   struct pollfd pfd[]={{.fd=0, .events=POLLIN, .revents=0}, {.fd=sock, .events=POLLIN, .revents=0}};