diff options
Diffstat (limited to 'perl')
-rw-r--r-- | perl/lib/Nix/Store.xs | 120 |
1 files changed, 51 insertions, 69 deletions
diff --git a/perl/lib/Nix/Store.xs b/perl/lib/Nix/Store.xs index 07d81aa3ab05..44c88a87bfc6 100644 --- a/perl/lib/Nix/Store.xs +++ b/perl/lib/Nix/Store.xs @@ -6,10 +6,11 @@ #undef do_open #undef do_close -#include <store-api.hh> -#include <globals.hh> -#include <misc.hh> -#include <util.hh> +#include "derivations.hh" +#include "globals.hh" +#include "store-api.hh" +#include "util.hh" +#include "crypto.hh" #if HAVE_SODIUM #include <sodium.h> @@ -19,19 +20,21 @@ using namespace nix; -void doInit() +static ref<Store> store() { - if (!store) { + static std::shared_ptr<Store> _store; + if (!_store) { try { settings.processEnvironment(); settings.loadConfFile(); settings.update(); settings.lockCPU = false; - store = openStore(); + _store = openStore(); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } } + return ref<Store>(_store); } @@ -45,7 +48,7 @@ PROTOTYPES: ENABLE void init() CODE: - doInit(); + store(); void setVerbosity(int level) @@ -56,10 +59,9 @@ void setVerbosity(int level) int isValidPath(char * path) CODE: try { - doInit(); - RETVAL = store->isValidPath(path); + RETVAL = store()->isValidPath(path); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } OUTPUT: RETVAL @@ -68,50 +70,46 @@ int isValidPath(char * path) SV * queryReferences(char * path) PPCODE: try { - doInit(); PathSet paths; - store->queryReferences(path, paths); + store()->queryReferences(path, paths); for (PathSet::iterator i = paths.begin(); i != paths.end(); ++i) XPUSHs(sv_2mortal(newSVpv(i->c_str(), 0))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } SV * queryPathHash(char * path) PPCODE: try { - doInit(); - Hash hash = store->queryPathHash(path); + Hash hash = store()->queryPathHash(path); string s = "sha256:" + printHash32(hash); XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } SV * queryDeriver(char * path) PPCODE: try { - doInit(); - Path deriver = store->queryDeriver(path); + Path deriver = store()->queryDeriver(path); if (deriver == "") XSRETURN_UNDEF; XPUSHs(sv_2mortal(newSVpv(deriver.c_str(), 0))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } SV * queryPathInfo(char * path, int base32) PPCODE: try { - doInit(); - ValidPathInfo info = store->queryPathInfo(path); + ValidPathInfo info = store()->queryPathInfo(path); if (info.deriver == "") XPUSHs(&PL_sv_undef); else XPUSHs(sv_2mortal(newSVpv(info.deriver.c_str(), 0))); - string s = "sha256:" + (base32 ? printHash32(info.hash) : printHash(info.hash)); + string s = "sha256:" + (base32 ? printHash32(info.narHash) : printHash(info.narHash)); XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); mXPUSHi(info.registrationTime); mXPUSHi(info.narSize); @@ -120,56 +118,53 @@ SV * queryPathInfo(char * path, int base32) av_push(arr, newSVpv(i->c_str(), 0)); XPUSHs(sv_2mortal(newRV((SV *) arr))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } SV * queryPathFromHashPart(char * hashPart) PPCODE: try { - doInit(); - Path path = store->queryPathFromHashPart(hashPart); + Path path = store()->queryPathFromHashPart(hashPart); XPUSHs(sv_2mortal(newSVpv(path.c_str(), 0))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } SV * computeFSClosure(int flipDirection, int includeOutputs, ...) PPCODE: try { - doInit(); PathSet paths; for (int n = 2; n < items; ++n) - computeFSClosure(*store, SvPV_nolen(ST(n)), paths, flipDirection, includeOutputs); + store()->computeFSClosure(SvPV_nolen(ST(n)), paths, flipDirection, includeOutputs); for (PathSet::iterator i = paths.begin(); i != paths.end(); ++i) XPUSHs(sv_2mortal(newSVpv(i->c_str(), 0))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } SV * topoSortPaths(...) PPCODE: try { - doInit(); PathSet paths; for (int n = 0; n < items; ++n) paths.insert(SvPV_nolen(ST(n))); - Paths sorted = topoSortPaths(*store, paths); + Paths sorted = store()->topoSortPaths(paths); for (Paths::iterator i = sorted.begin(); i != sorted.end(); ++i) XPUSHs(sv_2mortal(newSVpv(i->c_str(), 0))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } SV * followLinksToStorePath(char * path) CODE: try { - doInit(); + store(); RETVAL = newSVpv(followLinksToStorePath(path).c_str(), 0); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } OUTPUT: RETVAL @@ -178,24 +173,22 @@ SV * followLinksToStorePath(char * path) void exportPaths(int fd, int sign, ...) PPCODE: try { - doInit(); Paths paths; for (int n = 2; n < items; ++n) paths.push_back(SvPV_nolen(ST(n))); FdSink sink(fd); - exportPaths(*store, paths, sign, sink); + store()->exportPaths(paths, sign, sink); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } void importPaths(int fd) PPCODE: try { - doInit(); FdSource source(fd); - store->importPaths(false, source); + store()->importPaths(false, source); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } @@ -206,7 +199,7 @@ SV * hashPath(char * algo, int base32, char * path) string s = base32 ? printHash32(h) : printHash(h); XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } @@ -217,7 +210,7 @@ SV * hashFile(char * algo, int base32, char * path) string s = base32 ? printHash32(h) : printHash(h); XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } @@ -228,7 +221,7 @@ SV * hashString(char * algo, int base32, char * s) string s = base32 ? printHash32(h) : printHash(h); XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } @@ -239,28 +232,21 @@ SV * convertHash(char * algo, char * s, int toBase32) string s = toBase32 ? printHash32(h) : printHash(h); XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } -SV * signString(SV * secretKey_, char * msg) +SV * signString(char * secretKey_, char * msg) PPCODE: try { #if HAVE_SODIUM - STRLEN secretKeyLen; - unsigned char * secretKey = (unsigned char *) SvPV(secretKey_, secretKeyLen); - if (secretKeyLen != crypto_sign_SECRETKEYBYTES) - throw Error("secret key is not valid"); - - unsigned char sig[crypto_sign_BYTES]; - unsigned long long sigLen; - crypto_sign_detached(sig, &sigLen, (unsigned char *) msg, strlen(msg), secretKey); - XPUSHs(sv_2mortal(newSVpv((char *) sig, sigLen))); + auto sig = SecretKey(secretKey_).signDetached(msg); + XPUSHs(sv_2mortal(newSVpv(sig.c_str(), sig.size()))); #else throw Error("Nix was not compiled with libsodium, required for signed binary cache support"); #endif } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } @@ -283,7 +269,7 @@ int checkSignature(SV * publicKey_, SV * sig_, char * msg) throw Error("Nix was not compiled with libsodium, required for signed binary cache support"); #endif } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } OUTPUT: RETVAL @@ -292,24 +278,22 @@ int checkSignature(SV * publicKey_, SV * sig_, char * msg) SV * addToStore(char * srcPath, int recursive, char * algo) PPCODE: try { - doInit(); - Path path = store->addToStore(baseNameOf(srcPath), srcPath, recursive, parseHashType(algo)); + Path path = store()->addToStore(baseNameOf(srcPath), srcPath, recursive, parseHashType(algo)); XPUSHs(sv_2mortal(newSVpv(path.c_str(), 0))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } SV * makeFixedOutputPath(int recursive, char * algo, char * hash, char * name) PPCODE: try { - doInit(); HashType ht = parseHashType(algo); Path path = makeFixedOutputPath(recursive, ht, parseHash16or32(ht, hash), name); XPUSHs(sv_2mortal(newSVpv(path.c_str(), 0))); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } @@ -318,8 +302,7 @@ SV * derivationFromPath(char * drvPath) HV *hash; CODE: try { - doInit(); - Derivation drv = derivationFromPath(*store, drvPath); + Derivation drv = store()->derivationFromPath(drvPath); hash = newHV(); HV * outputs = newHV(); @@ -352,7 +335,7 @@ SV * derivationFromPath(char * drvPath) RETVAL = newRV_noinc((SV *)hash); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } OUTPUT: RETVAL @@ -361,8 +344,7 @@ SV * derivationFromPath(char * drvPath) void addTempRoot(char * storePath) PPCODE: try { - doInit(); - store->addTempRoot(storePath); + store()->addTempRoot(storePath); } catch (Error & e) { - croak(e.what()); + croak("%s", e.what()); } |