Index: i386/i386/elf_machdep.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/elf_machdep.c,v retrieving revision 1.17 diff -u -r1.17 elf_machdep.c --- i386/i386/elf_machdep.c 25 Sep 2003 01:10:23 -0000 1.17 +++ i386/i386/elf_machdep.c 4 Oct 2003 21:38:29 -0000 @@ -87,6 +87,64 @@ (sysinit_cfunc_t) elf32_insert_brand_entry, &freebsd_brand_info); +#define PERFORCE_HACK +#ifdef PERFORCE_HACK + +#include +#include + +long perforce_time = 0; + +SYSCTL_LONG(_kern, OID_AUTO, perforce_time, CTLFLAG_RW, + &perforce_time, 0, "Perforce Epoch"); + +static struct sysentvec elf32_perforce_sysvec; +static struct sysent perforce_sysent[SYS_MAXSYSCALL]; + +static Elf32_Brandinfo perforce_brand_info = { + 255, + EM_386, + "FreeBSD", + "", + "/usr/libexec/ld-elf.so.1", + &elf32_perforce_sysvec + }; +static int +perforce_gettimeofday(struct thread *td, struct gettimeofday_args *uap) +{ + struct timeval atv; + int error = 0; + + error = gettimeofday(td, uap); + + if (error == 0 && uap->tp && perforce_time != 0) { + atv.tv_sec = perforce_time; + atv.tv_usec = 0; + error = copyout(&atv, uap->tp, sizeof (atv)); + } + + return (error); +} + +static void +elf32_init_perforce_brand(void) +{ + bcopy(&elf32_freebsd_sysvec, &elf32_perforce_sysvec, + sizeof(elf32_perforce_sysvec)); + bcopy(&sysent, &perforce_sysent, sizeof(perforce_sysent)); + perforce_sysent[SYS_gettimeofday].sy_call = + (sy_call_t *)perforce_gettimeofday; + elf32_perforce_sysvec.sv_table = perforce_sysent; + elf32_insert_brand_entry(&perforce_brand_info); + printf("Perforce brand initalized.\n"); +} + +SYSINIT(p4d, SI_SUB_EXEC, SI_ORDER_ANY, + (sysinit_cfunc_t) elf32_init_perforce_brand, + NULL); + +#endif /* PERFORCE_HACK */ + /* Process one elf relocation with addend. */ static int elf_reloc_internal(linker_file_t lf, const void *data, int type, int local)