(root)/
strace-6.5/
src/
personality.c
       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  }