Index: ossp-pkg/xds/Makefile RCS File: /v/ossp/cvs/ossp-pkg/xds/Attic/Makefile,v rcsdiff -q -kk '-r1.17' '-r1.18' -u '/v/ossp/cvs/ossp-pkg/xds/Attic/Makefile,v' 2>/dev/null --- Makefile 2001/07/19 12:28:57 1.17 +++ Makefile 2001/07/19 14:58:27 1.18 @@ -18,7 +18,8 @@ setbuffer.o unregister.o vdecode.o vencode.o find-engine.o \ set-capacity.o xdr-encode-int32.o xdr-encode-int64.o \ xdr-encode-uint32.o xdr-encode-uint64.o xdr-decode-int32.o \ - xdr-decode-int64.o xdr-decode-uint32.o xdr-decode-uint64.o + xdr-decode-int64.o xdr-decode-uint32.o xdr-decode-uint64.o \ + xdr-encode-octedstream.o xdr-decode-octedstream.o .c.o: $(CC) $(CPPFLAGS) $(WARNFLAGS) $(OPTFLAGS) $(CFLAGS) -c $< Index: ossp-pkg/xds/regression-tests/Makefile RCS File: /v/ossp/cvs/ossp-pkg/xds/regression-tests/Attic/Makefile,v rcsdiff -q -kk '-r1.14' '-r1.15' -u '/v/ossp/cvs/ossp-pkg/xds/regression-tests/Attic/Makefile,v' 2>/dev/null --- Makefile 2001/07/18 19:03:17 1.14 +++ Makefile 2001/07/19 14:58:28 1.15 @@ -12,8 +12,8 @@ TESTS = xds-core.exe xds-find-engine.exe xds-register.exe xds-encode.exe \ xds-getbuffer.exe xds-decode.exe xds-setbuffer.exe xds-engine-restart.exe \ - xdr-uint32.exe xdr-int32.exe xdr-uint64.exe xdr-int64.exe \ - xds-mystruct.exe + xdr-uint32.exe xdr-int32.exe xdr-uint64.exe xdr-int64.exe \ + xdr-octedstream.exe xds-mystruct.exe .SUFFIXES: .SUFFIXES: .c .exe Index: ossp-pkg/xds/regression-tests/xdr-octedstream.c RCS File: /v/ossp/cvs/ossp-pkg/xds/regression-tests/Attic/xdr-octedstream.c,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/xds/regression-tests/Attic/xdr-octedstream.c,v' | diff -u /dev/null - -L'ossp-pkg/xds/regression-tests/xdr-octedstream.c' 2>/dev/null --- ossp-pkg/xds/regression-tests/xdr-octedstream.c +++ - 2024-05-12 14:02:41.321190415 +0200 @@ -0,0 +1,110 @@ +/* + XDS - OSSP Extensible Data Serialization Library + Copyright (c) 2001 The OSSP Project (http://www.ossp.org/) + Copyright (c) 2001 Cable & Wireless Deutschland (http://www.cw.com/de/) + + This file is part of OSSP XDS, an extensible data serialization + library which can be found at http://www.ossp.com/pkg/xds/. + + Permission to use, copy, modify, and distribute this software for + any purpose with or without fee is hereby granted, provided that + the above copyright notice and this permission notice appear in all + copies. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include +#include +#include "../internal.h" + +int main() + { + xds_t* xds; + char* buffer; + size_t buffer_size; + + char msg[] = "Hello World"; + char* new_msg; + size_t new_msg_size; + + /* Encode the string as octed stream. Then erase the buffer and + decode the string back, verifying that it hasn't changed. */ + + xds = xds_init(XDS_ENCODE); + if (xds == NULL) + { + printf("Failed to initialize XDS context.\n"); + return 1; + } + if (xds_register(xds, "os", &xdr_encode_octedstream, NULL) != XDS_OK) + { + printf("Failed to register my encoding engines.\n"); + return 1; + } + if (xds_encode(xds, "os", msg, strlen(msg)) != XDS_OK) + { + printf("xds_encode() failed.\n"); + return 1; + } + if (xds_getbuffer(xds, XDS_GIFT, (void**)&buffer, &buffer_size) != XDS_OK) + { + printf("xds_getbuffer() failed.\n"); + return 1; + } + xds_destroy(xds); + if (buffer_size % 4 != 0) + { + printf("The encoded octed stream's buffer size is not a multiple of 4.\n"); + return 1; + } + + xds = xds_init(XDS_DECODE); + if (xds == NULL) + { + printf("Failed to initialize XDS context.\n"); + return 1; + } + if (xds_register(xds, "os", &xdr_decode_octedstream, NULL) != XDS_OK) + { + printf("Failed to register my decoding engines.\n"); + return 1; + } + if (xds_setbuffer(xds, XDS_GIFT, buffer, buffer_size) != XDS_OK) + { + printf("xds_setbuffer() failed.\n"); + return 1; + } + if (xds_decode(xds, "os", &new_msg, &new_msg_size) != XDS_OK) + { + printf("xds_decode() failed.\n"); + return 1; + } + if (new_msg_size != strlen(msg)) + { + printf("The size of the decoded message is wrong.\n"); + return 1; + } + if (strncmp(msg, new_msg, new_msg_size) != 0) + { + printf("The decoded octed stream is not correct.\n"); + return 1; + } + xds_destroy(xds); + free(new_msg); + + /* Everything went fine. */ + + return 0; + } Index: ossp-pkg/xds/xdr-decode-octedstream.c RCS File: /v/ossp/cvs/ossp-pkg/xds/Attic/xdr-decode-octedstream.c,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/xds/Attic/xdr-decode-octedstream.c,v' | diff -u /dev/null - -L'ossp-pkg/xds/xdr-decode-octedstream.c' 2>/dev/null --- ossp-pkg/xds/xdr-decode-octedstream.c +++ - 2024-05-12 14:02:41.354459030 +0200 @@ -0,0 +1,89 @@ +/* + XDS - OSSP Extensible Data Serialization Library + Copyright (c) 2001 The OSSP Project (http://www.ossp.org/) + Copyright (c) 2001 Cable & Wireless Deutschland (http://www.cw.com/de/) + + This file is part of OSSP XDS, an extensible data serialization + library which can be found at http://www.ossp.com/pkg/xds/. + + Permission to use, copy, modify, and distribute this software for + any purpose with or without fee is hereby granted, provided that + the above copyright notice and this permission notice appear in all + copies. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include +#include +#include +#include "internal.h" + +int xdr_decode_octedstream(xds_t* xds, void* engine_context, void* buffer, size_t buffer_size, va_list* args) + { + void** p; + size_t* p_len; + size_t padding; + + /* Consistency checks. */ + + assert(xds != NULL); + assert(buffer != NULL); + assert(buffer_size != 0); + assert(args != NULL); + if (xds == NULL || buffer == NULL || buffer_size == 0 || args == NULL) + return XDS_ERR_INVALID_ARG; + + /* Get pointers from the stack. */ + + p = va_arg(*args, void**); + p_len = va_arg(*args, size_t*); + assert(p != NULL); + assert(p_len != NULL); + + /* Read the size of the message. */ + + if (buffer_size >= 4) + { + *p_len = ((u_int8_t*)buffer)[0]; *p_len = *p_len << 8; + *p_len += ((u_int8_t*)buffer)[1]; *p_len = *p_len << 8; + *p_len += ((u_int8_t*)buffer)[2]; *p_len = *p_len << 8; + *p_len += ((u_int8_t*)buffer)[3]; + } + else + return XDS_ERR_UNDERFLOW; + + /* Calculate padding. */ + + padding = (4 - (*p_len & 0x03)) & 0x03; + + /* Do we have enough data?. */ + + if (buffer_size < 4 + *p_len + padding) + return XDS_ERR_UNDERFLOW; + + /* Allocate buffer for the data. */ + + *p = malloc(*p_len); + if (*p == NULL) + return XDS_ERR_NO_MEM; + + /* Copy data into the buffer. */ + + memmove(*p, (u_int8_t*)buffer+4, *p_len); + + /* Done. */ + + return 4 + *p_len + padding; + } Index: ossp-pkg/xds/xdr-encode-octedstream.c RCS File: /v/ossp/cvs/ossp-pkg/xds/Attic/xdr-encode-octedstream.c,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/xds/Attic/xdr-encode-octedstream.c,v' | diff -u /dev/null - -L'ossp-pkg/xds/xdr-encode-octedstream.c' 2>/dev/null --- ossp-pkg/xds/xdr-encode-octedstream.c +++ - 2024-05-12 14:02:41.357118239 +0200 @@ -0,0 +1,71 @@ +/* + XDS - OSSP Extensible Data Serialization Library + Copyright (c) 2001 The OSSP Project (http://www.ossp.org/) + Copyright (c) 2001 Cable & Wireless Deutschland (http://www.cw.com/de/) + + This file is part of OSSP XDS, an extensible data serialization + library which can be found at http://www.ossp.com/pkg/xds/. + + Permission to use, copy, modify, and distribute this software for + any purpose with or without fee is hereby granted, provided that + the above copyright notice and this permission notice appear in all + copies. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include +#include +#include +#include "internal.h" + +int xdr_encode_octedstream(xds_t* xds, void* engine_context, void* buffer, size_t buffer_size, va_list* args) + { + u_int8_t* p; + size_t p_len; + size_t padding; + + /* Consistency checks. */ + + assert(xds != NULL); + assert(buffer != NULL); + assert(buffer_size != 0); + assert(args != NULL); + if (xds == NULL || buffer == NULL || buffer_size == 0 || args == NULL) + return XDS_ERR_INVALID_ARG; + + /* Get value from stack and calculate the correct amount of + padding. */ + + p = (u_int8_t*)va_arg(*args, void*); + p_len = va_arg(*args, size_t); + padding = (4 - (p_len & 0x03)) & 0x03; + assert((p_len + padding) % 4 == 0); + + /* Format the values into the buffer. */ + + if (buffer_size >= 4 + p_len + padding) + { + ((u_int8_t*)buffer)[0] = (p_len >> 24) & 0x000000ff; + ((u_int8_t*)buffer)[1] = (p_len >> 16) & 0x000000ff; + ((u_int8_t*)buffer)[2] = (p_len >> 8) & 0x000000ff; + ((u_int8_t*)buffer)[3] = (p_len >> 0) & 0x000000ff; + memmove((u_int8_t*)buffer+4, p, p_len); + memset(buffer+4+p_len, 0, padding); + } + + /* Done. */ + + return 4 + p_len + padding; + } Index: ossp-pkg/xds/xds.h RCS File: /v/ossp/cvs/ossp-pkg/xds/Attic/xds.h,v rcsdiff -q -kk '-r1.19' '-r1.20' -u '/v/ossp/cvs/ossp-pkg/xds/Attic/xds.h,v' 2>/dev/null --- xds.h 2001/07/18 18:26:32 1.19 +++ xds.h 2001/07/19 14:58:27 1.20 @@ -80,4 +80,7 @@ int xdr_decode_uint64(xds_t* xds, void* engine_context, void* buffer, size_t buffer_size, va_list* args); int xdr_decode_int64(xds_t* xds, void* engine_context, void* buffer, size_t buffer_size, va_list* args); +int xdr_encode_octedstream(xds_t* xds, void* engine_context, void* buffer, size_t buffer_size, va_list* args); +int xdr_decode_octedstream(xds_t* xds, void* engine_context, void* buffer, size_t buffer_size, va_list* args); + #endif /* !defined(__LIBXDS_H__) */