Added path pointer used to return value in Resolve and ResolveN.

This commit is contained in:
Jose Marcial Vieira Bisneto 2016-11-24 07:52:15 -03:00
parent 7ddba70ada
commit 05c45666e5
3 changed files with 43 additions and 15 deletions

View file

@ -11,7 +11,8 @@
"Could not resolve name.", "Could not resolve name.",
"Could not resolve name (recursion limit exceeded).", "Could not resolve name (recursion limit exceeded).",
"expired record", "expired record",
"unrecognized validity type" "unrecognized validity type",
"not a valid proquint string"
}; };
enum { enum {
@ -21,7 +22,8 @@
ErrResolveFailed, ErrResolveFailed,
ErrResolveRecursion, ErrResolveRecursion,
ErrExpiredRecord, ErrExpiredRecord,
ErrUnrecognizedValidity ErrUnrecognizedValidity,
ErrInvalidProquint
} NamesysErrs; } NamesysErrs;
typedef struct s_resolvers { typedef struct s_resolvers {
@ -29,6 +31,11 @@
int (*func)(char**, char*); int (*func)(char**, char*);
} resolvers; } resolvers;
typedef struct s_resolver {
// resolveOnce looks up a name once (without recursion).
int (*resolveOnce) (char **, char *);
} resolver;
//TODO ciPrivKey from c-libp2p-crypto //TODO ciPrivKey from c-libp2p-crypto
typedef void* ciPrivKey; typedef void* ciPrivKey;
@ -42,4 +49,11 @@
resolvers *resolver; resolvers *resolver;
publishers *Publisher; publishers *Publisher;
} mpns; } mpns;
int resolve (resolver *r, char **p, char *str, int depth, char **prefixes);
int Resolve(char **path, char *name);
int ResolveN(char **path, char *name, int depth);
int resolveOnce (char **path, char *name);
int Publish (char *proto, ciPrivKey name, char *value);
int PublishWithEOL (char *proto, ciPrivKey name, char *value, time_t eol);
#endif //NAMESYS_H #endif //NAMESYS_H

View file

@ -4,11 +4,6 @@
#include "ipfs/path/path.h" #include "ipfs/path/path.h"
#include "ipfs/namesys/namesys.h" #include "ipfs/namesys/namesys.h"
typedef struct s_resolver {
// resolveOnce looks up a name once (without recursion).
int (*resolveOnce) (char **, char *);
} resolver;
int resolve (resolver *r, char **p, char *str, int depth, char **prefixes) int resolve (resolver *r, char **p, char *str, int depth, char **prefixes)
{ {
int err, i; int err, i;

View file

@ -34,18 +34,31 @@ func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSys
const DefaultResolverCacheTTL = time.Minute; const DefaultResolverCacheTTL = time.Minute;
// Resolve implements Resolver. // Resolve implements Resolver.
int Resolve(char *name) int Resolve(char **path, char *name)
{ {
return ResolveN(name, DefaultDepthLimit); return ResolveN(path, name, DefaultDepthLimit);
} }
// ResolveN implements Resolver. // ResolveN implements Resolver.
int ResolveN(char *name, int depth) int ResolveN(char **path, char *name, int depth)
{ {
char ipfs_prefix[] = "/ipfs/"; char ipfs_prefix[] = "/ipfs/";
char p[500];
char *ps[] = {"/ipns/", NULL};
int err;
resolver r;
r.resolveOnce = resolveOnce;
if (memcmp(name, ipfs_prefix, strlen(ipfs_prefix)) == 0) { if (memcmp(name, ipfs_prefix, strlen(ipfs_prefix)) == 0) {
return ParsePath(name); ParsePath(p, name);
*path = malloc(strlen(p) + 1);
if (*p) {
strcpy(*path, p);
} else {
err = ErrAllocFailed;
}
return err;
} }
if (*name == '/') { if (*name == '/') {
@ -55,13 +68,19 @@ int ResolveN(char *name, int depth)
return ErrAllocFailed; return ErrAllocFailed;
} }
strcpy(str, ipfs_prefix); strcpy(str, ipfs_prefix);
strcat(str, name+1); // ignore inital / from name, because ipfs_prefix already has it. strcat(str, name+1); // ignore inital / from name, because ipfs_prefix already has it.
err = ParsePath(str); // save return value. err = ParsePath(p, str); // save return value.
free (str); // so we can free allocated memory before return. free (str); // so we can free allocated memory before return.
*path = malloc(strlen(p) + 1);
if (*p) {
strcpy(*path, p);
} else {
err = ErrAllocFailed;
}
return err; return err;
} }
return resolve(ns, name, depth, "/ipns/"); return resolve(&r, path, name, depth, ps);
} }
// resolveOnce implements resolver. // resolveOnce implements resolver.