mirror of
https://github.com/wolfcw/libfaketime.git
synced 2026-05-17 00:26:16 +03:00
POSIX named semaphores (sem_t) have architecture-dependent internal layout in glibc: 32 bytes on 64-bit, 16 bytes on 32-bit. When a 64-bit faketime wrapper creates a semaphore and spawns a 32-bit child, the child misinterprets the counter and hangs on sem_wait forever. Extract ft_sem_* abstraction into shared ft_sem.h/ft_sem.c with three backends: FT_POSIX (existing), FT_SYSV (existing), FT_FLOCK (new default). The flock backend uses kernel-mediated file locking on /dev/shm/faketime_lock_<pid>, which is architecture-independent and auto-releases on process death. Both libfaketime.so and the faketime wrapper now use the same shared abstraction, ensuring protocol agreement regardless of backend.
63 lines
1.7 KiB
C
63 lines
1.7 KiB
C
/*
|
|
* This file is part of libfaketime, version 0.9.12
|
|
*
|
|
* libfaketime is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License v2 as published by the
|
|
* Free Software Foundation.
|
|
*
|
|
* libfaketime is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License v2 along
|
|
* with the libfaketime; if not, write to the Free Software Foundation,
|
|
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#ifndef FT_SEM_H
|
|
#define FT_SEM_H
|
|
|
|
/* semaphore backend options */
|
|
#define FT_POSIX 1
|
|
#define FT_SYSV 2
|
|
#define FT_FLOCK 3
|
|
|
|
/* set default backend */
|
|
#ifndef FT_SEMAPHORE_BACKEND
|
|
#define FT_SEMAPHORE_BACKEND FT_FLOCK
|
|
#endif
|
|
|
|
/* validate selected backend */
|
|
#if FT_SEMAPHORE_BACKEND == FT_POSIX
|
|
#elif FT_SEMAPHORE_BACKEND == FT_SYSV
|
|
#elif FT_SEMAPHORE_BACKEND == FT_FLOCK
|
|
#else
|
|
#error "Unknown FT_SEMAPHORE_BACKEND; select between FT_POSIX, FT_SYSV, and FT_FLOCK"
|
|
#endif
|
|
|
|
#if FT_SEMAPHORE_BACKEND == FT_POSIX
|
|
#include <semaphore.h>
|
|
#endif
|
|
|
|
typedef struct
|
|
{
|
|
char name[256];
|
|
#if FT_SEMAPHORE_BACKEND == FT_POSIX
|
|
sem_t *sem;
|
|
#elif FT_SEMAPHORE_BACKEND == FT_SYSV
|
|
int semid;
|
|
#elif FT_SEMAPHORE_BACKEND == FT_FLOCK
|
|
int fd;
|
|
#endif
|
|
} ft_sem_t;
|
|
|
|
int ft_sem_create(char *name, ft_sem_t *ft_sem);
|
|
int ft_sem_open(char *name, ft_sem_t *ft_sem);
|
|
int ft_sem_lock(ft_sem_t *ft_sem);
|
|
int ft_sem_unlock(ft_sem_t *ft_sem);
|
|
int ft_sem_close(ft_sem_t *ft_sem);
|
|
int ft_sem_unlink(ft_sem_t *ft_sem);
|
|
|
|
#endif /* FT_SEM_H */
|