feat(amsd): meow_amsd 活动管理器一期 + am CLI (agent-212, 用户定案) — svcd托管(trigger=boot); 生命周期注册表(状态/时长/退出码/信号/崩溃计数+历史环形); launcher launch/exit/stdout管道捕获上报(logcat式,崩溃尾巴drain不丢); am status/list/history/start/kill(root门); crash双保险转发; S89预置conf
amsd f8d7f61b / am cfc4cbd4 / launcher 97c1b222(含字库扫描签名门控修CPU100%) 宿主+qemu全链路验证通过
This commit is contained in:
1 parent
b81e7438e4
commit
5fbf30755c
16 files changed
+1722
-4
No files matched your search
@@ -0,0 +1,70 @@
|
||||
/* 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;
|
||||
}
|
||||
Reference in new issue
Block a user