From c190586252e56d3375603f142432030e160d56ce Mon Sep 17 00:00:00 2001 From: ChatGPT Date: Tue, 16 Jun 2026 20:01:06 +0000 Subject: [PATCH] 0671 nwnss: add userspace virtual IO template boundary --- src/nwnss/CMakeLists.txt | 1 + src/nwnss/comn/common/virtualIOUserspace.c | 333 +++++++++++++++++++++ 2 files changed, 334 insertions(+) create mode 100644 src/nwnss/comn/common/virtualIOUserspace.c diff --git a/src/nwnss/CMakeLists.txt b/src/nwnss/CMakeLists.txt index e2d3008..a05b11d 100644 --- a/src/nwnss/CMakeLists.txt +++ b/src/nwnss/CMakeLists.txt @@ -157,6 +157,7 @@ add_library(nwnss SHARED comn/common/nameCache.c comn/common/objectIDStore.c comn/common/virtualIOShared.c + comn/common/virtualIOUserspace.c comn/compression/cmCompFile.c comn/compression/cmRuntime.c comn/sbs/sbsMFL.c diff --git a/src/nwnss/comn/common/virtualIOUserspace.c b/src/nwnss/comn/common/virtualIOUserspace.c new file mode 100644 index 0000000..e69aa5d --- /dev/null +++ b/src/nwnss/comn/common/virtualIOUserspace.c @@ -0,0 +1,333 @@ +/**************************************************************************** + | MARS-NWE libnwnss userspace virtual I/O boundary helpers. + +-------------------------------------------------------------------------*/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(MARS_NWE_NWNSS_USERSPACE) + +BOOL VIRT_PrintDebug = FALSE; +QUAD AdminVolWrites = 0; +QUAD AdminVolReads = 0; + +static STATUS virtWriteAll(Key_t key, NINT *filePos, const void *buffer, NINT len) +{ + NINT retLen = 0; + STATUS status; + + status = zWrite(key, zNILXID, *filePos, len, buffer, &retLen); + if (status != zOK) + { + return status; + } + + *filePos += retLen; + return zOK; +} + +STATUS VIRT_Write(struct zNSSMsg_s *msg) +{ + (void)msg; + return zERR_NOT_SUPPORTED; +} + +STATUS VIRT_ChunkyRead(struct zNSSMsg_s *msg) +{ + (void)msg; + return zERR_NOT_SUPPORTED; +} + +STATUS VIRT_Close(struct zNSSMsg_s *msg) +{ + (void)msg; + return zOK; +} + +STATUS VIRT_InitVirtualFile(Key_t key, NINT *filePos) +{ + const utf8_t initTemplate[] = + "\n" + "\n"; + + return virtWriteAll(key, filePos, initTemplate, strlen((const char *)initTemplate)); +} + +STATUS VIRT_FinishVirtualFile(Key_t key, NINT *filePos) +{ + const utf8_t endTemplate[] = ""; + + return virtWriteAll(key, filePos, endTemplate, strlen((const char *)endTemplate)); +} + +static STATUS VIRT_AddDataStream( + utf8_t *dataStreamName, + NINT bufLen, + utf8_t **buffer) +{ + const utf8_t templateStart[] = " = bufLen) + { + return zERR_XML_TOO_LONG; + } + } + + strcpy((char *)*buffer, (const char *)templateStart); + *buffer += startLen; + if (dataStreamName != NULL) + { + strcpy((char *)*buffer, (const char *)templateName); + *buffer += nameLen; + strcpy((char *)*buffer, (const char *)dataStreamName); + *buffer += dataStreamNameLen; + *((*buffer)++) = '"'; + } + strcpy((char *)*buffer, (const char *)templateEnd); + *buffer += endLen; + return zOK; +} + +static STATUS VIRT_FinishDataStream(NINT bufLen, utf8_t **buffer) +{ + const utf8_t template[] = " \n"; + NINT templateLen = strlen((const char *)template); + + if (templateLen >= bufLen) + { + return zERR_XML_TOO_LONG; + } + + strcpy((char *)*buffer, (const char *)template); + *buffer += templateLen; + return zOK; +} + +#define VIRT_BUILD_BUFFER_LEN 1024 + +#define VIRT_BUILD_BUFFER(_data) \ + do { \ + len = strlen((const char *)(_data)); \ + if ((curptr + len - buffer + 1) >= VIRT_BUILD_BUFFER_LEN) \ + { \ + status = zERR_XML_TOO_LONG; \ + goto errorExit; \ + } \ + strcpy((char *)curptr, (const char *)(_data)); \ + curptr += len; \ + } while (0) + +STATUS VIRT_MakeReadWriteFuncDataStream( + Key_t key, + utf8_t *dataStreamName, + utf8_t *readRoutine, + utf8_t *readParm, + utf8_t *writeRoutine, + utf8_t *writeParm, + BOOL useCookieRead, + NINT *filePos) +{ + utf8_t *curptr; + utf8_t buffer[VIRT_BUILD_BUFFER_LEN]; + STATUS status; + NINT len; + const utf8_t *ReadWriteTemplate1 = MSGNot("\n"); + const utf8_t *ReadWriteTemplate2 = MSGNot("\""); + const utf8_t *ReadWriteTemplate3 = MSGNot("\n"); + const utf8_t *ReadWriteTemplate4 = MSGNot("\n"); + const utf8_t *ReadWriteTemplate6 = MSGNot("\n"); + const utf8_t *ReadWriteTemplate7 = MSGNot(" cookie=\"yes\""); + const utf8_t *ReadWriteTemplate8 = MSGNot(">"); + const utf8_t *ReadWriteTemplate9 = MSGNot("\n"); + const utf8_t *ReadWriteTemplate2 = MSGNot("\""); + const utf8_t *ReadWriteTemplate3 = MSGNot("\n"); + const utf8_t *ReadWriteTemplate4 = MSGNot("\n"); + const utf8_t *ReadWriteTemplate6 = MSGNot("\n"); + const utf8_t *ReadWriteTemplate7 = MSGNot(" cookie=\"yes\""); + const utf8_t *ReadWriteTemplate8 = MSGNot(">"); + const utf8_t *ReadWriteTemplate9 = MSGNot(""); + const utf8_t *ReadWriteTemplate2 = MSGNot(""); + + curptr = buffer; + if ((status = VIRT_AddDataStream(dataStreamName, VIRT_BUILD_BUFFER_LEN, &curptr)) != zOK) + { + goto errorExit; + } + + VIRT_BUILD_BUFFER(ReadWriteTemplate1); + if (data != NULL) + { + VIRT_BUILD_BUFFER(data); + } + VIRT_BUILD_BUFFER(ReadWriteTemplate2); + + if ((status = VIRT_FinishDataStream(VIRT_BUILD_BUFFER_LEN, &curptr)) != zOK) + { + goto errorExit; + } + + return virtWriteAll(key, filePos, buffer, strlen((const char *)buffer)); + +errorExit: + return status; +} + +#undef VIRT_BUILD_BUFFER + +#endif /* MARS_NWE_NWNSS_USERSPACE */