(root)/
strace-6.5/
tests-mx32/
semop-common.c
       1  /*
       2   * Copyright (c) 2016-2021 The strace developers.
       3   * All rights reserved.
       4   *
       5   * SPDX-License-Identifier: GPL-2.0-or-later
       6   */
       7  
       8  #include <sys/ipc.h>
       9  #include <sys/sem.h>
      10  #include <stdint.h>
      11  #include <stdio.h>
      12  #include <stdlib.h>
      13  #include <unistd.h>
      14  
      15  #define XLAT_MACROS_ONLY
      16  #include "xlat/semop_flags.h"
      17  #undef XLAT_MACROS_ONLY
      18  
      19  static const char *errstr;
      20  
      21  static long
      22  k_semop(const unsigned int semid,
      23  	const kernel_ulong_t sops,
      24  	const unsigned int nsops);
      25  
      26  union semun {
      27  	int val;
      28  	struct semid_ds *buf;
      29  	unsigned short *array;
      30  	struct seminfo *__buf;
      31  };
      32  
      33  static int id = -1;
      34  
      35  static void
      36  cleanup(void)
      37  {
      38  	semctl(id, 0, IPC_RMID, 0);
      39  	id = -1;
      40  }
      41  
      42  int
      43  main(void)
      44  {
      45  	static const int bogus_semid = 0xfdb97531;
      46  	static kernel_ulong_t bogus_sops = (kernel_ulong_t) -1ULL;
      47  	static const unsigned int bogus_nsops = 0xdeadbeefU;
      48  
      49  	id = semget(IPC_PRIVATE, 1, 0600);
      50  	if (id < 0)
      51  		perror_msg_and_skip("semget");
      52  	atexit(cleanup);
      53  
      54  	union semun sem_union = { .val = 0 };
      55  	if (semctl(id, 0, SETVAL, sem_union) == -1)
      56  		perror_msg_and_skip("semctl");
      57  
      58  	k_semop(bogus_semid, 0, bogus_nsops);
      59  	printf("semop(%d, NULL, %u) = %s\n",
      60  		bogus_semid, bogus_nsops, errstr);
      61  
      62  	k_semop(bogus_semid, bogus_sops, 1);
      63  	printf("semop(%d, %#llx, %u) = %s\n",
      64  		bogus_semid, (unsigned long long) bogus_sops, 1, errstr);
      65  
      66  	TAIL_ALLOC_OBJECT_CONST_PTR(struct sembuf, sem_b2);
      67  	sem_b2->sem_num = 0xface;
      68  	sem_b2->sem_op = 0xf00d;
      69  	sem_b2->sem_flg = 0xbeef;
      70  
      71  	k_semop(bogus_semid, (uintptr_t) sem_b2, 2);
      72  	printf("semop(%d, [{sem_num=%hu, sem_op=%hd, sem_flg=%s%s%#hx}"
      73  	       ", ... /* %p */], %u) = %s\n",
      74  	       bogus_semid, sem_b2->sem_num, sem_b2->sem_op,
      75  	       sem_b2->sem_flg & SEM_UNDO ? "SEM_UNDO|" : "",
      76  	       sem_b2->sem_flg & IPC_NOWAIT ? "IPC_NOWAIT|" : "",
      77  	       (short) (sem_b2->sem_flg & ~(SEM_UNDO | IPC_NOWAIT)),
      78  	       sem_b2 + 1, 2, errstr);
      79  
      80  	TAIL_ALLOC_OBJECT_CONST_PTR(struct sembuf, sem_b);
      81  	sem_b->sem_num = 0;
      82  	sem_b->sem_op = 1;
      83  	sem_b->sem_flg = SEM_UNDO;
      84  
      85  	k_semop(id, (uintptr_t) sem_b, 1);
      86  	printf("semop(%d, [{sem_num=0, sem_op=1, sem_flg=SEM_UNDO}], 1) = %s\n",
      87  	       id, errstr);
      88  
      89  	sem_b->sem_op = -1;
      90  	k_semop(id, (uintptr_t) sem_b, 1);
      91  	printf("semop(%d, [{sem_num=0, sem_op=-1, sem_flg=SEM_UNDO}], 1) = %s\n",
      92  	       id, errstr);
      93  
      94  	puts("+++ exited with 0 +++");
      95  	return 0;
      96  }