Files
MeowOS-For-R3P2/patch_v2/meow_amsd/ams_stub.c
T

71 lines
2.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ams_stub.c — meow_amsd 宿主测试桩(不入固件)。
*
* 用途:在宿主集成测试里,把 stdin 的每一行原样发到 amsd socket(command 与 EV 事件均可),
* 然后读取响应直到 EOF 并打印。既当「launcher 上报桩」(注入 EV LAUNCH/EV OUT/EV EXIT),
* 也当通用命令客户端(status/list/history/start/kill)。
*
* 用法:
* printf 'EV LAUNCH os.meow.hello home - 123 12345 100\n' | ./ams_stub_host --sock /tmp/sim_ams.sock
* echo status | ./ams_stub_host --sock /tmp/sim_ams.sock
*
* 编译(宿主):gcc -Os -Wall -Wextra ams_stub.c -o ams_stub_host
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/un.h>
#define AMS_SOCK_DEFAULT "/usr/data/meow_ams.sock"
#define AMS_SOCK_PATH_MAX 108
#define AMS_RESP_MAX 65536
static const char *g_sock = AMS_SOCK_DEFAULT;
int main(int argc, char **argv)
{
const char *env = getenv("MEOW_AMS_SOCK");
if (env && env[0]) g_sock = env;
for (int i = 1; i < argc; i++) {
if (!strcmp(argv[i], "--sock") && i + 1 < argc) g_sock = argv[++i];
else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {
fprintf(stderr, "usage: %s [--sock <path>] (reads lines from stdin -> amsd)\n", argv[0]);
return 0;
} else { fprintf(stderr, "bad arg %s\n", argv[i]); return 2; }
}
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
if (fd < 0) { perror("socket"); return 1; }
struct sockaddr_un a;
memset(&a, 0, sizeof a);
a.sun_family = AF_UNIX;
snprintf(a.sun_path, sizeof a.sun_path, "%s", g_sock);
if (connect(fd, (struct sockaddr *)&a, sizeof a) < 0) {
fprintf(stderr, "connect %s: %s\n", g_sock, strerror(errno));
return 1;
}
char line[2048];
while (fgets(line, sizeof line, stdin)) {
ssize_t w = write(fd, line, strlen(line));
(void)w;
}
/* half-close 写端:告知 amsd「无更多数据」(= launcher fire-and-forget 的 close 语义),
* 事件连接 amsd 即收尾关闭;命令连接 amsd 写回响应后才关闭。 */
shutdown(fd, SHUT_WR);
/* read response until EOF */
static char resp[AMS_RESP_MAX];
size_t n = 0;
char tmp[2048];
ssize_t r;
while ((r = read(fd, tmp, sizeof tmp)) > 0) {
if (n + (size_t)r < sizeof resp - 1) { memcpy(resp + n, tmp, (size_t)r); n += (size_t)r; }
}
close(fd);
resp[n] = '\0';
if (n > 0) fputs(resp, stdout);
return 0;
}