提示词:补齐 rtapi_vsnprintf WASM shim

结论:按 LinuxCNC src/rtapi/uspace_common.h 和 src/rtapi/rtapi.h,将 userspace rtapi_vsnprintf 适配为 vsnprintf 包装,并在 WASM runtime probe 覆盖 snprintf、va_list 和截断返回值。

检查:./test-native.sh 通过;./test-linuxcnc-source-link.sh 通过。
This commit is contained in:
cnc
2026-06-05 15:29:41 +08:00
parent 98755528e4
commit 9a4e0e3712
2 changed files with 40 additions and 1 deletions

View File

@@ -4,6 +4,7 @@
#include "libnml/nml/stat_msg.hh"
#include <cmath>
#include <cstdarg>
#include <cstdlib>
#include <cstring>
#include <string>
@@ -16,6 +17,8 @@ extern "C" {
extern PyObject *PyInit_interpreter(void);
extern PyObject *PyInit_emccanon(void);
extern struct _inittab builtin_modules[];
extern int rtapi_snprintf(char *buf, unsigned long size, const char *fmt, ...);
extern int rtapi_vsnprintf(char *buf, unsigned long size, const char *fmt, va_list ap);
}
// LinuxCNC source basis: src/emc/rs274ngc/rs274ngc_pre.cc provides read(),
@@ -155,6 +158,34 @@ bool builtin_modules_match_linuxcnc_preview_runtime() {
builtin_modules[2].initfunc == nullptr;
}
int call_rtapi_vsnprintf(char *buffer, unsigned long size, const char *format, ...) {
va_list args;
va_start(args, format);
const int result = rtapi_vsnprintf(buffer, size, format, args);
va_end(args);
return result;
}
bool rtapi_formatting_matches_linuxcnc_userspace() {
// LinuxCNC source basis: src/rtapi/uspace_common.h implements both
// rtapi_snprintf() and rtapi_vsnprintf() as userspace vsnprintf() wrappers.
char formatted[32]{};
if (rtapi_snprintf(formatted, sizeof(formatted), "HAL_%s_%d", "probe", 7) != 11 ||
std::strcmp(formatted, "HAL_probe_7") != 0) {
return false;
}
char via_va_list[32]{};
if (call_rtapi_vsnprintf(via_va_list, sizeof(via_va_list), "%s.%02d", "axis", 3) != 7 ||
std::strcmp(via_va_list, "axis.03") != 0) {
return false;
}
char truncated[5]{};
return rtapi_snprintf(truncated, sizeof(truncated), "abcdef") == 6 &&
std::strcmp(truncated, "abcd") == 0;
}
} // namespace
int main() {
@@ -176,6 +207,9 @@ int main() {
if (!builtin_modules_match_linuxcnc_preview_runtime()) {
return 10;
}
if (!rtapi_formatting_matches_linuxcnc_userspace()) {
return 11;
}
std::vector<CncSimEvent> events;
CncSimHandle *sim = cnc_sim_create();

View File

@@ -2,7 +2,8 @@
#include <cstdio>
// LinuxCNC source basis: src/rtapi/uspace_common.h provides rtapi_snprintf()
// for userspace RTAPI formatting; src/rtapi/rtapi.h declares the API.
// and rtapi_vsnprintf() for userspace RTAPI formatting; src/rtapi/rtapi.h
// declares both APIs.
extern "C" int rtapi_snprintf(char *buf, unsigned long size, const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
@@ -10,3 +11,7 @@ extern "C" int rtapi_snprintf(char *buf, unsigned long size, const char *fmt, ..
va_end(ap);
return rc;
}
extern "C" int rtapi_vsnprintf(char *buf, unsigned long size, const char *fmt, va_list ap) {
return std::vsnprintf(buf, static_cast<std::size_t>(size), fmt, ap);
}