Hi,
With the cp(1) change to use chflagsat(), systrace needs to be
taught about chflagsat syscall. databases/db/v4 port fails with
USE_SYSTRACE=Yes due to a "$(CP) -pr" use during install_docs.
Could someone look over these changes and correct any mistakes.
I am not 100% sure it is correct; specifically, I'm not sure
about the print_atflags.
The extra white-space in register.c diff is to help you eyeball
any obvious (not to me) mistakes; otherwise, the two empty lines
should be removed to maintain uniformity.
Thanks,
--patrick
p.s., I'll send a patch for systrace.filter change to ports@.
Index: register.c
===================================================================
RCS file: /cvs/obsd/src/bin/systrace/register.c,v
retrieving revision 1.25
diff -u -p -u -p -r1.25 register.c
--- register.c 16 Jan 2015 00:19:12 -0000 1.25
+++ register.c 4 Jun 2015 07:43:26 -0000
@@ -126,6 +126,13 @@ systrace_initcb(void)
X(intercept_register_sccb("native", "chflags", trans_cb, NULL));
intercept_register_transfn("native", "chflags", 0);
intercept_register_translation("native", "chflags", 1, &ic_fileflags);
+
+ X(intercept_register_sccb("native", "chflagsat", trans_cb, NULL));
+ intercept_register_translation("native", "chflagsat", 0, &ic_fdt);
+ intercept_register_transfn("native", "chflagsat", 1);
+ intercept_register_translation("native", "chflagsat", 2, &ic_fileflags);
+ intercept_register_translation("native", "chflagsat", 3, &ic_atflags);
+
X(intercept_register_sccb("native", "readlink", trans_cb, NULL));
tl = intercept_register_translation("native", "readlink", 0,
&ic_translate_unlinkname);
Index: systrace-translate.c
===================================================================
RCS file: /cvs/obsd/src/bin/systrace/systrace-translate.c,v
retrieving revision 1.25
diff -u -p -u -p -r1.25 systrace-translate.c
--- systrace-translate.c 16 Jan 2015 00:19:12 -0000 1.25
+++ systrace-translate.c 4 Jun 2015 07:43:26 -0000
@@ -67,6 +67,7 @@ static int print_signame(char *, size_t,
static int print_fcntlcmd(char *, size_t, struct intercept_translate *);
static int print_memprot(char *, size_t, struct intercept_translate *);
static int print_fileflags(char *, size_t, struct intercept_translate *);
+static int print_atflags(char *, size_t, struct intercept_translate *);
static int get_argv(struct intercept_translate *, int, pid_t, void *);
static int print_argv(char *, size_t, struct intercept_translate *);
@@ -559,6 +560,35 @@ print_fileflags(char *buf, size_t buflen
}
static int
+print_atflags(char *buf, size_t buflen, struct intercept_translate *tl)
+{
+ int flags = (intptr_t)tl->trans_addr;
+ char lbuf[64];
+
+ *buf = '\0';
+
+ while (flags) {
+ if (*buf)
+ strlcat(buf, "|", buflen);
+
+ if (flags & AT_SYMLINK_NOFOLLOW) {
+ strlcat(buf, "AT_SYMLINK_NOFOLLOW", buflen);
+ flags &= ~AT_SYMLINK_NOFOLLOW;
+ continue;
+ }
+
+ if (flags) {
+ snprintf(lbuf, sizeof(lbuf), "<unknown:0x%x>", flags);
+ strlcat(buf, lbuf, buflen);
+ flags = 0;
+ continue;
+ }
+ }
+
+ return (0);
+}
+
+static int
get_argv(struct intercept_translate *trans, int fd, pid_t pid, void *addr)
{
char *arg;
@@ -688,4 +718,9 @@ struct intercept_translate ic_linux_memp
struct intercept_translate ic_fileflags = {
"flags",
NULL, print_fileflags,
+};
+
+struct intercept_translate ic_atflags = {
+ "atflags",
+ NULL, print_atflags,
};
Index: systrace.h
===================================================================
RCS file: /cvs/obsd/src/bin/systrace/systrace.h,v
retrieving revision 1.27
diff -u -p -u -p -r1.27 systrace.h
--- systrace.h 2 Jul 2006 12:34:15 -0000 1.27
+++ systrace.h 4 Jun 2015 07:43:26 -0000
@@ -245,6 +245,7 @@ extern struct intercept_translate ic_fcn
extern struct intercept_translate ic_memprot;
extern struct intercept_translate ic_linux_memprot;
extern struct intercept_translate ic_fileflags;
+extern struct intercept_translate ic_atflags;
extern struct intercept_translate ic_linux_oflags;