]> granicus.if.org Git - strace/blob - mknod.c
tests: workaround old gawk versions that do not provide @include support
[strace] / mknod.c
1 #include "defs.h"
2
3 #include <fcntl.h>
4 #include <sys/stat.h>
5
6 #ifdef MAJOR_IN_SYSMACROS
7 # include <sys/sysmacros.h>
8 #endif
9
10 #ifdef MAJOR_IN_MKDEV
11 # include <sys/mkdev.h>
12 #endif
13
14 static int
15 decode_mknod(struct tcb *tcp, int offset)
16 {
17         int mode = tcp->u_arg[offset + 1];
18
19         if (entering(tcp)) {
20                 printpath(tcp, tcp->u_arg[offset]);
21                 tprintf(", %s", sprintmode(mode));
22                 switch (mode & S_IFMT) {
23                 case S_IFCHR:
24                 case S_IFBLK:
25 #if defined(SPARC) || defined(SPARC64)
26                         if (current_personality == 1)
27                                 tprintf(", makedev(%lu, %lu)",
28                                 (unsigned long) ((tcp->u_arg[offset + 2] >> 18) & 0x3fff),
29                                 (unsigned long) (tcp->u_arg[offset + 2] & 0x3ffff));
30                         else
31 #endif /* SPARC || SPARC64 */
32                                 tprintf(", makedev(%lu, %lu)",
33                                 (unsigned long) major(tcp->u_arg[offset + 2]),
34                                 (unsigned long) minor(tcp->u_arg[offset + 2]));
35                         break;
36                 default:
37                         break;
38                 }
39         }
40         return 0;
41 }
42
43 int
44 sys_mknod(struct tcb *tcp)
45 {
46         return decode_mknod(tcp, 0);
47 }
48
49 int
50 sys_mknodat(struct tcb *tcp)
51 {
52         if (entering(tcp))
53                 print_dirfd(tcp, tcp->u_arg[0]);
54         return decode_mknod(tcp, 1);
55 }
56
57 #if defined(SPARC) || defined(SPARC64)
58 int
59 sys_xmknod(struct tcb *tcp)
60 {
61         int mode = tcp->u_arg[2];
62
63         if (entering(tcp)) {
64                 tprintf("%ld, ", tcp->u_arg[0]);
65                 printpath(tcp, tcp->u_arg[1]);
66                 tprintf(", %s", sprintmode(mode));
67                 switch (mode & S_IFMT) {
68                 case S_IFCHR:
69                 case S_IFBLK:
70                         tprintf(", makedev(%lu, %lu)",
71                                 (unsigned long) ((tcp->u_arg[3] >> 18) & 0x3fff),
72                                 (unsigned long) (tcp->u_arg[3] & 0x3ffff));
73                         break;
74                 default:
75                         break;
76                 }
77         }
78         return 0;
79 }
80 #endif /* SPARC || SPARC64 */