]> granicus.if.org Git - strace/blob - mknod.c
mknod.c: make use of RVAL_DECODED
[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 void
15 decode_mknod(struct tcb *tcp, int offset)
16 {
17         int mode = tcp->u_arg[offset + 1];
18
19         printpath(tcp, tcp->u_arg[offset]);
20         tprintf(", %s", sprintmode(mode));
21         switch (mode & S_IFMT) {
22         case S_IFCHR:
23         case S_IFBLK:
24 #if defined(SPARC) || defined(SPARC64)
25                 if (current_personality == 1)
26                         tprintf(", makedev(%lu, %lu)",
27                         (unsigned long) ((tcp->u_arg[offset + 2] >> 18) & 0x3fff),
28                         (unsigned long) (tcp->u_arg[offset + 2] & 0x3ffff));
29                 else
30 #endif /* SPARC || SPARC64 */
31                         tprintf(", makedev(%lu, %lu)",
32                         (unsigned long) major(tcp->u_arg[offset + 2]),
33                         (unsigned long) minor(tcp->u_arg[offset + 2]));
34                 break;
35         }
36 }
37
38 SYS_FUNC(mknod)
39 {
40         decode_mknod(tcp, 0);
41
42         return RVAL_DECODED;
43 }
44
45 SYS_FUNC(mknodat)
46 {
47         print_dirfd(tcp, tcp->u_arg[0]);
48         decode_mknod(tcp, 1);
49
50         return RVAL_DECODED;
51 }
52
53 #if defined(SPARC) || defined(SPARC64)
54 SYS_FUNC(xmknod)
55 {
56         int mode = tcp->u_arg[2];
57
58         tprintf("%ld, ", tcp->u_arg[0]);
59         printpath(tcp, tcp->u_arg[1]);
60         tprintf(", %s", sprintmode(mode));
61         switch (mode & S_IFMT) {
62         case S_IFCHR:
63         case S_IFBLK:
64                 tprintf(", makedev(%lu, %lu)",
65                         (unsigned long) ((tcp->u_arg[3] >> 18) & 0x3fff),
66                         (unsigned long) (tcp->u_arg[3] & 0x3ffff));
67                 break;
68         default:
69                 break;
70         }
71
72         return RVAL_DECODED;
73 }
74 #endif /* SPARC || SPARC64 */