1 /*
2 * Copyright (c) 2015 Dmitry V. Levin <ldv@strace.io>
3 * Copyright (c) 2014-2022 The strace developers.
4 * All rights reserved.
5 *
6 * SPDX-License-Identifier: LGPL-2.1-or-later
7 */
8
9 #include "defs.h"
10 #include "xlat/personality_flags.h"
11 #include "xlat/personality_types.h"
12
13
14 SYS_FUNC(personality)
15 {
16 unsigned int pers;
17
18 if (entering(tcp)) {
19 pers = tcp->u_arg[0];
20 if (0xffffffff == pers) {
21 PRINT_VAL_X(0xffffffff);
22 } else {
23 tprint_flags_begin();
24 printxval(personality_types, pers & PER_MASK, "PER_???");
25 pers &= ~PER_MASK;
26 if (pers) {
27 tprint_flags_or();
28 printflags_in(personality_flags, pers, NULL);
29 }
30 tprint_flags_end();
31 }
32 return 0;
33 }
34
35 if (syserror(tcp))
36 return 0;
37
38 pers = tcp->u_rval;
39 static char outstr[1024];
40 char *p = outstr + sprintxval(outstr, sizeof(outstr), personality_types,
41 pers & PER_MASK, "PER_???");
42 pers &= ~PER_MASK;
43 if (pers)
44 strcpy(p, sprintflags("|", personality_flags, pers));
45 tcp->auxstr = outstr;
46 return RVAL_HEX | RVAL_STR;
47 }