blob: 1463232cbc677e2b4e92fb6080383322fe28ed1f [file] [log] [blame]
Dmitry V. Levindb23b342014-12-06 03:53:16 +00001#include "defs.h"
2
3#include <fcntl.h>
Felix Jandad34e00b2015-03-28 18:21:09 +01004#include <sys/stat.h>
Dmitry V. Levindb23b342014-12-06 03:53:16 +00005
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
14static int
15decode_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
43int
44sys_mknod(struct tcb *tcp)
45{
46 return decode_mknod(tcp, 0);
47}
48
49int
50sys_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)
58int
59sys_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 */