]> granicus.if.org Git - strace/blob - personality.c
maint: update for linux v5.3-rc8
[strace] / personality.c
1 /*
2  * Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
3  * Copyright (c) 2014-2018 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                         tprints("0xffffffff");
22                 } else {
23                         printxval(personality_types, pers & PER_MASK, "PER_???");
24                         pers &= ~PER_MASK;
25                         if (pers) {
26                                 tprints("|");
27                                 printflags(personality_flags, pers, NULL);
28                         }
29                 }
30                 return 0;
31         }
32
33         if (syserror(tcp))
34                 return 0;
35
36         pers = tcp->u_rval;
37         static char outstr[1024];
38         char *p = outstr + sprintxval(outstr, sizeof(outstr), personality_types,
39                                       pers & PER_MASK, "PER_???");
40         pers &= ~PER_MASK;
41         if (pers)
42                 strcpy(p, sprintflags("|", personality_flags, pers));
43         tcp->auxstr = outstr;
44         return RVAL_HEX | RVAL_STR;
45 }