@@ -4,6 +4,7 @@ Future
* c++-lib: File Descriptor streambuffer
* c++-lib: streambuf monitor
* c++-lib: IOManipulator based encoding/decoding
+* c++-lib: ROSE support infrastructure
* documentation: Developer's guides
* esnacc-logo: A mascot (and CC-BY license) was added for esnacc
* py-lib: Introduce a first cut at a python back-end
new file mode 100644
@@ -0,0 +1,136 @@
+-- snaccrose: The eSNACC ROSE implementation
+-- Dual Licensed under both the esnacc public license and the Lesser GNU
+-- Public License v3 or greater.
+-- Copyright (C) 2017, Aaron Conole
+-- Portions Copright (C), estos GmbH and estos/stm
+
+SNACC-ROSE { joint-iso-itu-t remote-operations(4)
+ generic-PDUs(6)
+ version1(0) } DEFINITIONS IMPLICIT TAGS ::= BEGIN
+
+-- Default ROSE message sent
+ROSEMessage ::= CHOICE {
+ invoke [1] IMPLICIT ROSEInvoke,
+ result [2] IMPLICIT ROSEResult,
+ error [3] IMPLICIT ROSEError,
+ reject [4] IMPLICIT ROSEReject
+}
+
+-- Authentication
+
+ROSEAuth ::= SEQUENCE {
+ method UTF8String, -- Authentication Type ("Basic" is only supported)
+ authdata OCTET STRING -- Authentication Data
+}
+
+ROSEAuthList ::= SEQUENCE OF ROSEAuth
+
+ROSEAuthRequest ::= SEQUENCE {
+ auth ROSEAuth,
+ context UTF8String OPTIONAL
+}
+
+ROSEAuthResult ::= SEQUENCE {
+ authList ROSEAuthList,
+ context UTF8String OPTIONAL
+}
+
+
+-- ROSE Basic types
+
+InvokeId ::= CHOICE {
+ present INTEGER,
+ absent NULL
+}
+
+-- ROSE messages
+
+ROSEInvoke ::= SEQUENCE {
+ sessionID [0] UTF8String OPTIONAL,
+ invokeId InvokeId,
+ linkedId CHOICE {
+ present [0] IMPLICIT INTEGER,
+ absent [1] IMPLICIT NULL
+ },
+ authentication [1] ROSEAuthRequest OPTIONAL,
+ operationID CHOICE {
+ local INTEGER,
+ global OBJECT IDENTIFIER,
+ -- esnacc specific extension
+ name UTF8String
+ },
+ argument ANY OPTIONAL
+}
+
+ROSEResult ::= SEQUENCE {
+ sessionID [1] UTF8String OPTIONAL,
+ invokeID INTEGER,
+ result SEQUENCE {
+ resultValue INTEGER,
+ result ANY
+ } OPTIONAL
+}
+
+ROSEError ::= SEQUENCE {
+ sessionID [1] UTF8String OPTIONAL,
+ invokedID INTEGER,
+ error-value INTEGER,
+ error ANY OPTIONAL
+}
+
+ROSEReject ::= SEQUENCE {
+ sessionID [1] UTF8String OPTIONAL,
+ invokedID CHOICE {
+ invokedID INTEGER,
+ invokednull NULL
+ },
+ reject RejectProblem OPTIONAL,
+
+ -- the following are an etsos extension to reject for transmitting
+ -- additional cause information
+ details UTF8String OPTIONAL,
+ authentication [4] ROSEAuthResult OPTIONAL
+}
+
+RejectProblem ::= CHOICE {
+ generalProblem [0] IMPLICIT GeneralProblem,
+ invokeProblem [1] IMPLICIT InvokeProblem,
+ returnResultProblem [2] IMPLICIT ReturnResultProblem,
+ returnErrorProblem [3] IMPLICIT ReturnErrorProblem
+}
+
+GeneralProblem ::= INTEGER { -- ROSE-provider detected
+ unrecognisedAPDU(0),
+ mistypedAPDU(1),
+ badlyStructuredAPDU(2)
+}
+
+InvokeProblem ::= INTEGER { -- ROSE-user detected
+ duplicateInvocation(0),
+ unrecognisedOperation(1),
+ mistypedArgument(2),
+ resourceLimitation(3),
+ initiatorReleasing(4),
+ unrecognisedLinkedID(5),
+ linkedResponseUnexpected(6),
+ unexpectedChildOperation(7),
+ invalidSessionID(8), -- sessionID in Invoke is not valid
+ authenticationIncomplete(9), -- Invoke Authentication failed
+ authenticationFailed(10) -- Invoke Authentication failed
+}
+
+ReturnResultProblem ::= INTEGER { -- ROSE-user detected
+ unrecognisedInvocation(0),
+ resultResponseUnexpected(1),
+ mistypedResult(2)
+}
+
+ReturnErrorProblem ::= INTEGER { -- ROSE-user detected
+ unrecognisedInvocation(0),
+ errorResponseUnexpected(1),
+ unrecognisedError(2),
+ unexpectedError(3),
+ mistypedParameter(4)
+}
+
+END
@@ -1,6 +1,9 @@
.dirstamp
.libs
.deps
-libesnaccxx.pc
+*.pc
inc/snacc.h
+inc/snaccrose.h
inc/snacc.h.in
+src/snaccrose.cpp
+src/snaccrose.h
@@ -1,4 +1,5 @@
-lib_LTLIBRARIES += cxx-lib/libcxxasn1.la
+lib_LTLIBRARIES += cxx-lib/libcxxasn1.la \
+ cxx-lib/libcxxasn1rose.la
BUILT_SOURCES += cxx-lib/inc/snacc.h
@@ -9,12 +10,14 @@ nobase_include_HEADERS += cxx-lib/inc/asn-buf.h \
cxx-lib/inc/asn-iomanip.h \
cxx-lib/inc/asn-list.h \
cxx-lib/inc/asn-listset.h \
+ cxx-lib/inc/asn-rose.h \
cxx-lib/inc/asn-usefultypes.h \
cxx-lib/inc/init.h \
cxx-lib/inc/meta.h \
cxx-lib/inc/snacc.h \
cxx-lib/inc/snaccdll.h \
cxx-lib/inc/snaccexcept.h \
+ cxx-lib/inc/snaccrose.h \
cxx-lib/inc/tcl-if.h
cxx_lib_libcxxasn1_la_SOURCES = \
@@ -47,13 +50,24 @@ cxx_lib_libcxxasn1_la_SOURCES = \
cxx-lib/src/asn-bits.cpp \
cxx-lib/src/asn-len.cpp \
cxx-lib/src/asn-fileseg.cpp \
- cxx-lib/src/asn-rvsbuf.cpp
+ cxx-lib/src/asn-rvsbuf.cpp
+
+cxx_lib_libcxxasn1rose_la_SOURCES = \
+ asn1specs/snaccrose.asn \
+ cxx-lib/src/snaccrose.cpp \
+ cxx-lib/src/asn-rose.cpp
cxx_lib_libcxxasn1_la_WIN32_FLAGS=
cxx_lib_libcxxasn1_la_WIN32_LIBADD=
cxx_lib_libcxxasn1_la_WIN32_LDFLAGS=
+
+cxx_lib_libcxxasn1rose_la_WIN32_FLAGS=
+cxx_lib_libcxxasn1rose_la_WIN32_LIBADD=
+cxx_lib_libcxxasn1rose_la_WIN32_LDFLAGS=
+
if WIN32
cxx_lib_libcxxasn1_la_WIN32_FLAGS += -DSNACCDLL_EXPORTS=1
+cxx_lib_libcxxasn1rose_la_WIN32_FLAGS += -DSNACCDLL_EXPORTS=1
endif
cxx_lib_libcxxasn1_la_CXXFLAGS = \
@@ -78,12 +92,44 @@ cxx_lib_libcxxasn1_la_LDFLAGS = \
$(all_lib_LDFLAGS) \
$(cxx_lib_libcxxasn1_la_WIN32_LDFLAGS)
+cxx_lib_libcxxasn1rose_la_CXXFLAGS = \
+ $(cxx_lib_libcxxasn1rose_la_WIN32_FLAGS) \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/cxx-lib \
+ -I$(top_srcdir)/cxx-lib/src \
+ -I$(top_srcdir)/cxx-lib/inc
+
+cxx_lib_libcxxasn1rose_la_CFLAGS = \
+ $(cxx_lib_libcxxasn1rose_la_WIN32_FLAGS) \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/cxx-lib \
+ -I$(top_srcdir)/cxx-lib/src \
+ -I$(top_srcdir)/cxx-lib/inc
+
+cxx_lib_libcxxasn1rose_la_LIBADD = \
+ $(cxx_lib_libcxxasn1rose_la_WIN32_LIBADD)
+
+cxx_lib_libcxxasn1rose_la_LDFLAGS = \
+ $(LDFLAGS) \
+ $(all_lib_LDFLAGS) \
+ $(cxx_lib_libcxxasn1rose_la_WIN32_LDFLAGS)
+
EXTRA_DIST += \
cxx-lib/libesnaccxx.pc.in \
+ cxx-lib/libesnaccxxrose.pc.in \
cxx-lib/inc/snacc.h.in
-pkgconfig_DATA += cxx-lib/libesnaccxx.pc
-DISTCLEANFILES += cxx-lib/libesnaccxx.pc cxx-lib/inc/snacc.h
+pkgconfig_DATA += cxx-lib/libesnaccxx.pc cxx-lib/libesnaccxxrose.pc
+DISTCLEANFILES += cxx-lib/libesnaccxx.pc \
+ cxx-lib/libesnaccxxrose.pc \
+ cxx-lib/inc/snacc.h \
+ cxx-lib/src/snaccrose.cpp \
+ cxx-lib/src/snaccrose.h
cxx-lib/inc/snacc.h.in: snacc.h.in
- cp $< $@
+ $(AM_V_GEN)cp $< $@
+
+cxx-lib/inc/snaccrose.h:
+cxx-lib/src/snaccrose.cpp: asn1specs/snaccrose.asn compiler/esnacc$(EXEEXT)
+ $(AM_V_GEN)compiler/esnacc$(EXEEXT) -C -mo `dirname $@` $<
+ -$(AM_V_GEN)cp $(srcdir)/cxx-lib/src/snaccrose.h cxx-lib/inc/
new file mode 100644
@@ -0,0 +1,162 @@
+/* asn-rose.h: Remote Operations Service Element support
+ *
+ * Copyright (C) 2017, Aaron Conole
+ *
+ * Dual licensed under both the esnacc public license, and the
+ * Lesser GNU Public License version 3 (lgpl v3).
+ *
+ * Portions of this file were contributed by estos GmbH, www.estos.com
+ */
+
+#include <stdint.h>
+#include <string>
+#include <map>
+#include <memory>
+#include <streambuf>
+#include <stdexcept>
+
+#include "asn-incl.h"
+#include "asn-buf.h"
+#include "asn-iomanip.h"
+
+#ifndef ESNACC_ASN_ROSE_H__
+#define ESNACC_ASN_ROSE_H__
+
+#define ROSE_TRANSPORT_ERROR(code) (code & 0x000F)
+#define ROSE_RE(code) (code & 0x00F0)
+#define ROSE_REJECT(code) (code & 0x0F00)
+#define ROSE_ERROR(code) (code & 0xF000)
+
+/* fwd decl. for this - implementation detail. */
+class InitialMonitoredStreamCB;
+
+namespace SNACC {
+
+class AsnType;
+class ROSEMessage;
+class ROSEInvoke;
+class ROSEResult;
+class ROSEError;
+class ROSEReject;
+class InvokeProblem;
+class ROSEAuthRequest;
+class ROSEAuthResult;
+
+static const uint32_t ROSE_TRANSPORT_FAILED = 0x1;
+static const uint32_t ROSE_TRANSPORT_SHUTDOWN = 0x2;
+static const uint32_t ROSE_TRANSPORT_TIMEOUT = 0x3;
+
+static const uint32_t ROSE_RE_INVALID_ANSWER = 0x10;
+static const uint32_t ROSE_RE_DECODE_ERROR = 0x20;
+
+static const uint32_t ROSE_REJECT_UNKNOWN_OPERATION = 0x100;
+static const uint32_t ROSE_REJECT_MISTYPED_ARGUMENT = 0x200;
+static const uint32_t ROSE_REJECT_FUNCTIONS_MISSING = 0x300;
+static const uint32_t ROSE_REJECT_INVALID_CODE = 0x400;
+static const uint32_t ROSE_REJECT_INVALID_SESSION = 0x500;
+static const uint32_t ROSE_REJECT_START_SSL_REQUIRED = 0x600;
+static const uint32_t ROSE_REJECT_AUTHENTICATION_INCOMPLETE = 0x700;
+static const uint32_t ROSE_REJECT_AUTHENTICATION_FAILED = 0x800;
+
+static const uint32_t ROSE_GENERIC_ERROR = 0x1000;
+
+static const uint64_t ROSE_TIMEOUT_INF = ~0ULL;
+
+enum SnaccInvokeResult {
+ returnResult,
+ returnError,
+ returnReject
+};
+
+struct AsnInvokeCtx
+{
+ AsnInvokeCtx() : rejectResult(0), invokeAuthReq(0),
+ invokeAuthRes(0)
+ {
+ }
+
+ ~AsnInvokeCtx();
+
+ long rejectResult;
+ ROSEAuthRequest *invokeAuthReq;
+ ROSEAuthResult *invokeAuthRes;
+};
+
+typedef long (*InvokeCB)(const ROSEInvoke *, AsnInvokeCtx *);
+
+class OperationCoordinator
+{
+public:
+ typedef std::map<std::string, InvokeCB> ByNameMap;
+ typedef std::map<InvokeCB, std::string> ByOperationMap;
+ typedef std::map<uint64_t, InvokeCB> ByOpIdMap;
+
+ OperationCoordinator();
+ ~OperationCoordinator() { }
+
+ void SetInvokeCallback(const std::string &s, InvokeCB i, uint64_t o = 0);
+
+ InvokeCB FindInvoke(const std::string &s, bool &b) const
+ {
+ ByNameMap::const_iterator cit = nameMap.find(s);
+ b = false;
+ if (cit != nameMap.end()) {
+ b = true;
+ return cit->second;
+ }
+ return (InvokeCB)0;
+ }
+
+ InvokeCB FindInvoke(const uint64_t i, bool &b) const
+ {
+ ByOpIdMap::const_iterator cit = operationIdMap.find(i);
+ b = false;
+ if (cit != operationIdMap.end()) {
+ b = true;
+ return cit->second;
+ }
+ return (InvokeCB)0;
+ }
+
+ InvokeCB operator[](const std::string &s) const
+ {
+ InvokeCB i;
+ bool b;
+
+ i = FindInvoke(s, b);
+ if (!b || !i) {
+ throw std::range_error(std::string() +
+ "Invalid operation requested from directory");
+ }
+ return i;
+ }
+
+ void MonitorStreambuf(std::streambuf *b, SNACCEncodeDecodeRules r);
+ void RemoveStreambuf(std::streambuf *b);
+ SNACCEncodeDecodeRules StreambufEncodingType(std::streambuf *b);
+
+ void monitor()
+ {
+ monbufs();
+ }
+
+ bool ReceiveMsg(const ROSEMessage &m);
+ bool SendMsg(std::streambuf *b, ROSEMessage &r);
+
+protected:
+
+ bool ReceiveInvoke(const ROSEInvoke *i);
+ bool ReceiveResult(const ROSEResult *r);
+ bool ReceiveReject(const ROSEReject *r);
+ bool ReceiveError(const ROSEError *e);
+
+ ByNameMap nameMap;
+ ByOperationMap operationMap;
+ ByOpIdMap operationIdMap;
+ InitialMonitoredStreamCB *cb;
+ StreambufMonitor monbufs;
+ std::map<std::streambuf *, SNACCEncodeDecodeRules> bufEncodeMap;
+};
+
+}
+#endif
new file mode 100644
@@ -0,0 +1,14 @@
+# Enhanced SNACC pkg-config source file
+
+PREFIX=@prefix@
+EXEC_PREFIX=@exec_prefix@
+LIBDIR=@libdir@
+INCLUDEDIR=@includedir@
+
+Name: libesnaccxxrose
+Description: Enhanced SNACC ROSE support and libs for C++
+Version: @VERSION@
+Requires:
+Conflicts:
+Libs: -L${LIBDIR} -lcxxasn1 -lcxxasn1rose
+Cflags: -I${INCLUDEDIR}/cxx-lib/inc
new file mode 100644
@@ -0,0 +1,249 @@
+/* asn-rose.cxx: Remote Operations Service Element support
+ *
+ * Copyright (C) 2017, Aaron Conole
+ *
+ * Dual licensed under both the esnacc public license, and the
+ * Lesser GNU Public License version 3 (lgpl v3).
+ *
+ * Portions of this file were contributed by estos GmbH, www.estos.com
+ */
+
+#include "asn-rose.h"
+#include "snaccrose.h"
+
+using namespace SNACC;
+
+static uint64_t mhash64(const void *k, size_t l, uint64_t s)
+{
+ const uint64_t m = ESNACC_CONST_ULL(0xc6a4a7935bd1e995);
+ const int r = 47;
+ uint64_t h = s ^ (l * m);
+ uint64_t dval = *(const uint64_t *)k;
+ uint64_t *data;
+ for (data = (uint64_t *)k;
+ data != ((uint64_t *)k + (l / 8)); dval = *data++) {
+ dval *= m;
+ dval ^= dval >> r;
+ dval *= m;
+
+ h ^= dval;
+ h *= m;
+ }
+
+ const unsigned char * data2 = (const unsigned char*)data;
+
+ switch(l & 7) {
+ case 7: h ^= uint64_t(data2[6]) << 48;
+ case 6: h ^= uint64_t(data2[5]) << 40;
+ case 5: h ^= uint64_t(data2[4]) << 32;
+ case 4: h ^= uint64_t(data2[3]) << 24;
+ case 3: h ^= uint64_t(data2[2]) << 16;
+ case 2: h ^= uint64_t(data2[1]) << 8;
+ case 1: h ^= uint64_t(data2[0]);
+ h *= m;
+ }
+
+ h ^= h >> r;
+ h *= m;
+ h ^= h >> r;
+
+ return h;
+}
+
+class InitialMonitoredStreamCB : public StreambufCallback
+{
+ OperationCoordinator &m_parent;
+
+ static inline AsnLen DecodeMsg(std::streambuf *stream,
+ SNACCEncodeDecodeRules r, ROSEMessage &rm)
+ {
+ AsnBuf buf(stream); AsnLen l;
+ switch (r) {
+ case BER: {
+ rm.BDec(buf, l);
+ }
+ break;
+
+ case PER:
+ default:
+ throw SnaccException(__FILE__, __LINE__, "DecodeMsg",
+ "Unsupported encoding type");
+ break;
+ }
+ return l;
+ }
+
+ StreambufCallback::Streambuf_CB_RESULT callback(Streambuf_CB_STATUS status,
+ std::streambuf *stream)
+ {
+ switch (status) {
+ case StreambufCallback::CB_READ_OK: {
+ try {
+ ROSEMessage rm;
+ DecodeMsg(stream, m_parent.StreambufEncodingType(stream),
+ rm);
+ m_parent.ReceiveMsg(rm);
+ } catch (SnaccException &e) {
+ ROSEReject rejectMsg;
+ rejectMsg.invokedID.choiceId =
+ ROSERejectChoice::invokednullCid;
+ rejectMsg.invokedID.invokednull = new AsnNull;
+ ROSEMessage m;
+ m.reject = new ROSEReject(rejectMsg);
+ m_parent.SendMsg(stream, m);
+ }
+ }
+ break;
+ case StreambufCallback::CB_WRITE_OK:
+ case StreambufCallback::CB_OPENED:
+ return StreambufCallback::CB_NONE;
+
+ case StreambufCallback::CB_CLOSED:
+ default:
+ return StreambufCallback::CB_DROP_STREAM;
+ }
+ return StreambufCallback::CB_NONE;
+ }
+
+public:
+ InitialMonitoredStreamCB(OperationCoordinator &p) :
+ m_parent(p) {}
+
+};
+
+OperationCoordinator::OperationCoordinator() :
+ nameMap(), operationMap(), operationIdMap(),
+ cb(new InitialMonitoredStreamCB(*this))
+{
+
+}
+
+#define OPERATION_SEED 0x5bd1e995
+
+void OperationCoordinator::SetInvokeCallback(const std::string &s, InvokeCB i,
+ uint64_t o)
+{
+ uint64_t hash = o;
+ if (!hash) hash = mhash64(s.c_str(), s.length(), OPERATION_SEED);
+ nameMap[s] = i;
+ operationMap[i] = s;
+ operationIdMap[hash] = i;
+}
+
+void OperationCoordinator::MonitorStreambuf(std::streambuf *b,
+ SNACCEncodeDecodeRules r)
+{
+ monbufs.push(b, *cb, false);
+ bufEncodeMap[b] = r;
+}
+
+void OperationCoordinator::RemoveStreambuf(std::streambuf *b)
+{
+ monbufs.pop(b);
+ bufEncodeMap.erase(b);
+}
+
+bool OperationCoordinator::ReceiveInvoke(const ROSEInvoke *i)
+{
+ InvokeCB operationId;
+ bool found = false;
+
+ switch (i->operationID.choiceId) {
+ case ROSEInvokeChoice1::localCid:
+ operationId = FindInvoke(*i->operationID.local, found);
+ break;
+ case ROSEInvokeChoice1::nameCid:
+ operationId = FindInvoke(std::string((*i->operationID.name).getAsUTF8()),
+ found);
+ break;
+ default:
+ return false;
+ }
+
+ if (!found || !operationId) {
+ return false;
+ }
+
+ AsnInvokeCtx ctx;
+
+ /* For the first cut, just invoke the operation inline, and return a
+ * result */
+ long result = operationId(i, &ctx);
+ if (result) {
+ return false;
+ }
+
+ return true;
+}
+
+bool OperationCoordinator::ReceiveResult(const ROSEResult *r)
+{
+ return false;
+}
+
+bool OperationCoordinator::ReceiveReject(const ROSEReject *r)
+{
+ return false;
+}
+
+bool OperationCoordinator::ReceiveError(const ROSEError *e)
+{
+ return false;
+}
+
+bool OperationCoordinator::ReceiveMsg(const ROSEMessage &m)
+{
+ bool result = false;
+ switch(m.choiceId) {
+ case ROSEMessage::invokeCid:
+ if (!m.invoke) {
+ throw SnaccException(__FILE__, __LINE__, "ReceiveMsg",
+ "Empty invoke requested");
+ }
+ result = ReceiveInvoke(m.invoke);
+ break;
+ case ROSEMessage::resultCid:
+ if (!m.result) {
+ throw SnaccException(__FILE__, __LINE__, "ReceiveMsg",
+ "Empty result returned");
+ }
+ result = ReceiveResult(m.result);
+ break;
+ case ROSEMessage::rejectCid:
+ if (!m.reject) {
+ throw SnaccException(__FILE__, __LINE__, "ReceiveMsg",
+ "Empty reject returned");
+ }
+ result = ReceiveReject(m.reject);
+ break;
+ case ROSEMessage::errorCid:
+ if (!m.error) {
+ throw SnaccException(__FILE__, __LINE__, "ReceiveMsg",
+ "Empty reject returned");
+ }
+ result = ReceiveError(m.error);
+ break;
+ }
+ return result;
+}
+
+bool OperationCoordinator::SendMsg(std::streambuf *b, ROSEMessage &r)
+{
+ AsnBuf buf(b); AsnLen l;
+ switch (StreambufEncodingType(b)) {
+ case BER:
+ l = r.BEnc(buf);
+ break;
+ case PER:
+ default:
+ throw SnaccException(__FILE__, __LINE__, "SendMsg",
+ "Unsupported encoding type");
+ break;
+ }
+ return l;
+}
+
+SNACCEncodeDecodeRules OperationCoordinator::StreambufEncodingType(std::streambuf *b)
+{
+ return bufEncodeMap[b];
+}
@@ -4,5 +4,8 @@ debian/tmp/usr/lib/libcasn1.a
debian/tmp/usr/lib/libcasn1.la
debian/tmp/usr/lib/libcxxasn1.a
debian/tmp/usr/lib/libcxxasn1.la
+debian/tmp/usr/lib/libcxxasn1rose.a
+debian/tmp/usr/lib/libcxxasn1rose.la
debian/tmp/usr/lib/pkgconfig/libesnacc.pc
debian/tmp/usr/lib/pkgconfig/libesnaccxx.pc
+debian/tmp/usr/lib/pkgconfig/libesnaccxxrose.pc
@@ -4,3 +4,6 @@ debian/tmp/usr/lib/libcasn1.so.0.0.0
debian/tmp/usr/lib/libcxxasn1.so
debian/tmp/usr/lib/libcxxasn1.so.0
debian/tmp/usr/lib/libcxxasn1.so.0.0.0
+debian/tmp/usr/lib/libcxxasn1rose.so
+debian/tmp/usr/lib/libcxxasn1rose.so.0
+debian/tmp/usr/lib/libcxxasn1rose.so.0.0.0
@@ -88,8 +88,12 @@ make DESTDIR=%{buildroot} install
%_libdir/lib*.la
%_libdir/pkgconfig/libesnacc.pc
%_libdir/pkgconfig/libesnaccxx.pc
+%_libdir/pkgconfig/libesnaccxxrose.pc
%changelog
+* Wed May 31 2017 Aaron Conole <aconole@bytheb.org> - 1.9.0-1
+- Add the esnacc ROSE support packages.
+
* Fri Mar 17 2017 Aaron Conole <aconole@bytheb.org> - 1.8.0-2
- Fix up the esnacc package for fedpkg compliance.
@@ -165,4 +165,11 @@
#else
# define ESNACC_UNUSED
#endif
+
+#if defined(_MSC_VER)
+# define ESNACC_CONST_ULL(x) (x)
+#else
+# define ESNACC_CONST_ULL(x) (x##ULL)
+#endif
+
#endif