Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Commit 63a99ca

Browse files
committed
syscall logging example - print mode_t
1 parent 44260d0 commit 63a99ca

File tree

3 files changed

+50
-20
lines changed

3 files changed

+50
-20
lines changed

examples/syscall_desc.c

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
#include <stddef.h>
3636
#include <syscall.h>
37+
#include <fcntl.h>
3738

3839
#define SARGS(name, r, ...) \
3940
[SYS_##name] = {#name, r, {__VA_ARGS__, }}
@@ -42,7 +43,7 @@
4243
static const struct syscall_desc table[] = {
4344
SARGS(read, rdec, arg_fd, arg_, arg_),
4445
SARGS(write, rdec, arg_fd, arg_, arg_),
45-
SARGS(open, rdec, arg_cstr, arg_open_flags, arg_),
46+
SARGS(open, rdec, arg_cstr, arg_open_flags, arg_mode),
4647
SARGS(close, rdec, arg_fd),
4748
SARGS(stat, rdec, arg_cstr, arg_),
4849
SARGS(fstat, rdec, arg_fd, arg_),
@@ -61,7 +62,7 @@ static const struct syscall_desc table[] = {
6162
SARGS(pwrite64, rdec, arg_fd, arg_, arg_, arg_),
6263
SARGS(readv, rdec, arg_fd, arg_, arg_),
6364
SARGS(writev, rdec, arg_fd, arg_, arg_),
64-
SARGS(access, rdec, arg_cstr, arg_),
65+
SARGS(access, rdec, arg_cstr, arg_mode),
6566
SARGS(pipe, rdec, arg_),
6667
SARGS(select, rdec, arg_, arg_, arg_, arg_, arg_),
6768
SARGS(sched_yield, rdec, arg_none),
@@ -123,19 +124,19 @@ static const struct syscall_desc table[] = {
123124
SARGS(chdir, rdec, arg_cstr),
124125
SARGS(fchdir, rdec, arg_fd),
125126
SARGS(rename, rdec, arg_cstr, arg_cstr),
126-
SARGS(mkdir, rdec, arg_cstr, arg_),
127+
SARGS(mkdir, rdec, arg_cstr, arg_mode),
127128
SARGS(rmdir, rdec, arg_cstr),
128-
SARGS(creat, rdec, arg_cstr, arg_),
129+
SARGS(creat, rdec, arg_cstr, arg_mode),
129130
SARGS(link, rdec, arg_cstr, arg_cstr),
130131
SARGS(unlink, rdec, arg_cstr),
131132
SARGS(symlink, rdec, arg_cstr, arg_cstr),
132133
SARGS(readlink, rdec, arg_cstr, arg_, arg_),
133-
SARGS(chmod, rdec, arg_cstr, arg_),
134-
SARGS(fchmod, rdec, arg_fd, arg_),
134+
SARGS(chmod, rdec, arg_cstr, arg_mode),
135+
SARGS(fchmod, rdec, arg_fd, arg_mode),
135136
SARGS(chown, rdec, arg_cstr, arg_, arg_),
136137
SARGS(fchown, rdec, arg_fd, arg_, arg_),
137138
SARGS(lchown, rdec, arg_cstr, arg_, arg_),
138-
SARGS(umask, roct, arg_),
139+
SARGS(umask, rmode, arg_mode),
139140
SARGS(gettimeofday, rdec, arg_, arg_),
140141
SARGS(getrlimit, rdec, arg_, arg_),
141142
SARGS(getrusage, rdec, arg_, arg_),
@@ -279,9 +280,9 @@ static const struct syscall_desc table[] = {
279280
SARGS(inotify_add_watch, rdec, arg_fd, arg_cstr, arg_),
280281
SARGS(inotify_rm_watch, rdec, arg_fd, arg_),
281282
SARGS(migrate_pages, rdec, arg_, arg_, arg_, arg_),
282-
SARGS(openat, rdec, arg_atfd, arg_cstr, arg_open_flags, arg_),
283-
SARGS(mkdirat, rdec, arg_atfd, arg_cstr, arg_),
284-
SARGS(mknodat, rdec, arg_atfd, arg_cstr, arg_, arg_),
283+
SARGS(openat, rdec, arg_atfd, arg_cstr, arg_open_flags, arg_mode),
284+
SARGS(mkdirat, rdec, arg_atfd, arg_cstr, arg_mode),
285+
SARGS(mknodat, rdec, arg_atfd, arg_cstr, arg_mode, arg_),
285286
SARGS(fchownat, rdec, arg_atfd, arg_cstr, arg_, arg_, arg_),
286287
SARGS(futimesat, rdec, arg_atfd, arg_cstr, arg_),
287288
SARGS(newfstatat, rdec, arg_atfd, arg_cstr, arg_, arg_),
@@ -290,8 +291,8 @@ static const struct syscall_desc table[] = {
290291
SARGS(linkat, rdec, arg_atfd, arg_cstr, arg_atfd, arg_cstr, arg_),
291292
SARGS(symlinkat, rdec, arg_atfd, arg_cstr, arg_cstr),
292293
SARGS(readlinkat, rdec, arg_atfd, arg_cstr, arg_, arg_),
293-
SARGS(fchmodat, rdec, arg_atfd, arg_cstr, arg_),
294-
SARGS(faccessat, rdec, arg_atfd, arg_cstr, arg_),
294+
SARGS(fchmodat, rdec, arg_atfd, arg_cstr, arg_mode),
295+
SARGS(faccessat, rdec, arg_atfd, arg_cstr, arg_mode),
295296
SARGS(pselect6, rdec, arg_, arg_, arg_, arg_, arg_, arg_),
296297
SARGS(ppoll, rdec, arg_, arg_, arg_, arg_, arg_),
297298
SARGS(unshare, rdec, arg_),
@@ -394,14 +395,32 @@ static const struct syscall_desc table[] = {
394395

395396
#undef SARGS
396397

398+
static const struct syscall_desc open_without_mode = {
399+
.name = "open",
400+
.return_type = rdec,
401+
.args = {arg_cstr, arg_open_flags, }
402+
};
403+
404+
static const struct syscall_desc openat_without_mode = {
405+
.name = "openat",
406+
.return_type = rdec,
407+
.args = {arg_atfd, arg_cstr, arg_open_flags, }
408+
};
409+
397410
const struct syscall_desc *
398-
get_syscall_desc(long syscall_number)
411+
get_syscall_desc(long syscall_number, const long args[6])
399412
{
400413
if (syscall_number < 0)
401414
return NULL;
402415

403416
if ((size_t)syscall_number >= (sizeof(table) / sizeof(table[0])))
404417
return NULL;
405418

419+
if (syscall_number == SYS_open && (args[1] & O_CREAT) == 0)
420+
return &open_without_mode;
421+
422+
if (syscall_number == SYS_openat && (args[2] & O_CREAT) == 0)
423+
return &openat_without_mode;
424+
406425
return table + syscall_number;
407426
}

examples/syscall_desc.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,15 @@ enum arg_type {
3939
arg_atfd,
4040
arg_cstr,
4141
arg_open_flags,
42+
arg_mode,
4243
arg_ /* no special formatting implemented yet, print as hex number */
4344
};
4445

4546
enum return_type {
4647
rhex,
4748
rdec,
4849
runsigned,
49-
roct
50+
rmode
5051
};
5152

5253
struct syscall_desc {
@@ -55,6 +56,7 @@ struct syscall_desc {
5556
enum arg_type args[6];
5657
};
5758

58-
const struct syscall_desc *get_syscall_desc(long syscall_number);
59+
const struct syscall_desc *get_syscall_desc(long syscall_number,
60+
const long args[static 6]);
5961

6062
#endif

examples/syscall_logger.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -714,9 +714,13 @@ print_runsigned(char *dst, long n)
714714
}
715715

716716
static char *
717-
print_roct(char *dst, long n)
717+
print_mode_t(char *dst, long n)
718718
{
719719
*dst++ = '0';
720+
if (n < 0100)
721+
*dst++ = '0';
722+
if (n < 0010)
723+
*dst++ = '0';
720724
return print_number(dst, (unsigned long)n, 8);
721725
}
722726

@@ -762,6 +766,9 @@ print_known_syscall(char *dst, const struct syscall_desc *desc,
762766
case arg_open_flags:
763767
dst = print_open_flags(dst, args[i]);
764768
break;
769+
case arg_mode:
770+
dst = print_mode_t(dst, result);
771+
break;
765772
default:
766773
dst = print_hex(dst, args[i]);
767774
break;
@@ -779,18 +786,20 @@ print_known_syscall(char *dst, const struct syscall_desc *desc,
779786
case runsigned:
780787
dst = print_runsigned(dst, result);
781788
break;
782-
case roct:
783-
dst = print_roct(dst, result);
789+
case rmode:
790+
dst = print_mode_t(dst, result);
784791
break;
785792
}
786793

787794
return dst;
788795
}
789796

790797
static ssize_t
791-
print_syscall(char *dst, long syscall_number, const long args[6], long result)
798+
print_syscall(char *dst, long syscall_number, long args[6], long result)
792799
{
793-
const struct syscall_desc *desc = get_syscall_desc(syscall_number);
800+
const struct syscall_desc *desc =
801+
get_syscall_desc(syscall_number, args);
802+
794803
char *c;
795804

796805
if (desc != NULL)

0 commit comments

Comments
 (0)