aboutsummaryrefslogtreecommitdiff
path: root/src/backend/port/qnx
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/port/qnx')
-rw-r--r--src/backend/port/qnx/Makefile43
-rw-r--r--src/backend/port/qnx/ipc.h30
-rw-r--r--src/backend/port/qnx/isnan.c22
-rw-r--r--src/backend/port/qnx/rint.c31
-rw-r--r--src/backend/port/qnx/sem.c261
-rw-r--r--src/backend/port/qnx/sem.h54
-rw-r--r--src/backend/port/qnx/shm.c193
-rw-r--r--src/backend/port/qnx/shm.h40
-rw-r--r--src/backend/port/qnx/tstrint.c31
-rw-r--r--src/backend/port/qnx/tstsem.c135
-rw-r--r--src/backend/port/qnx/tstshm.c80
11 files changed, 920 insertions, 0 deletions
diff --git a/src/backend/port/qnx/Makefile b/src/backend/port/qnx/Makefile
new file mode 100644
index 00000000000..1f8eed95879
--- /dev/null
+++ b/src/backend/port/qnx/Makefile
@@ -0,0 +1,43 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+# Makefile for port/sparc
+#
+# IDENTIFICATION
+# $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/Makefile,v 1.1 1999/12/16 01:25:06 momjian Exp $
+#
+#-------------------------------------------------------------------------
+
+SRCDIR = ../../..
+include ../../../Makefile.global
+
+INCLUDE_OPT = -I../..
+
+CFLAGS+=$(INCLUDE_OPT)
+
+OBJS = isnan.o rint.o sem.o shm.o
+
+all: SUBSYS.o tstrint tstsem tstshm
+
+SUBSYS.o: $(OBJS)
+ $(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
+
+tstrint: tstrint.o rint.o
+ $(CC) -o tstrint rint.o tstrint.o
+
+tstsem: tstsem.o sem.o
+ $(CC) -o tstsem sem.o tstsem.o
+
+tstshm: tstshm.o shm.o
+ $(CC) -o tstshm shm.o tstshm.o
+
+depend dep:
+ $(CC) -MM $(INCLUDE_OPT) *.c >depend
+
+clean:
+ rm -f SUBSYS.o $(OBJS) tstrint tstrint.o tstsem tstsem.o tstshm tstshm.o
+
+ifeq (depend,$(wildcard depend))
+include depend
+endif
+
diff --git a/src/backend/port/qnx/ipc.h b/src/backend/port/qnx/ipc.h
new file mode 100644
index 00000000000..6bce68a0edd
--- /dev/null
+++ b/src/backend/port/qnx/ipc.h
@@ -0,0 +1,30 @@
+/*-------------------------------------------------------------------------
+ *
+ * ipc.h
+ * System V IPC Emulation
+ *
+ * Copyright (c) 1999, repas AEG Automation GmbH
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/ipc.h,v 1.1 1999/12/16 01:25:06 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _SYS_IPC_H
+#define _SYS_IPC_H
+
+/* Common IPC definitions. */
+/* Mode bits. */
+#define IPC_CREAT 0001000 /* create entry if key doesn't exist */
+#define IPC_EXCL 0002000 /* fail if key exists */
+#define IPC_NOWAIT 0004000 /* error if request must wait */
+
+/* Keys. */
+#define IPC_PRIVATE (key_t)0 /* private key */
+
+/* Control Commands. */
+#define IPC_RMID 0 /* remove identifier */
+
+#endif /* _SYS_IPC_H */
diff --git a/src/backend/port/qnx/isnan.c b/src/backend/port/qnx/isnan.c
new file mode 100644
index 00000000000..eb717d30483
--- /dev/null
+++ b/src/backend/port/qnx/isnan.c
@@ -0,0 +1,22 @@
+/*-------------------------------------------------------------------------
+ *
+ * isnan.c
+ * isnan() implementation
+ *
+ * Copyright (c) 1999, repas AEG Automation GmbH
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/isnan.c,v 1.1 1999/12/16 01:25:06 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "os.h"
+
+unsigned char __nan[8] = __nan_bytes;
+
+int isnan(double dsrc)
+{
+ return !memcmp( &dsrc, &NAN, sizeof( double ) );
+}
diff --git a/src/backend/port/qnx/rint.c b/src/backend/port/qnx/rint.c
new file mode 100644
index 00000000000..8d717425b2e
--- /dev/null
+++ b/src/backend/port/qnx/rint.c
@@ -0,0 +1,31 @@
+/*-------------------------------------------------------------------------
+ *
+ * rint.c
+ * rint() implementation
+ *
+ * Copyright (c) 1999, repas AEG Automation GmbH
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/rint.c,v 1.1 1999/12/16 01:25:06 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include <math.h>
+#include "os.h"
+
+double rint(double x)
+{
+ double f, n = 0.;
+
+ f = modf( x, &n );
+
+ if( x > 0. ) {
+ if( f > .5 ) n += 1.;
+ }
+ else if( x < 0. ) {
+ if( f < -.5 ) n -= 1.;
+ }
+ return n;
+}
diff --git a/src/backend/port/qnx/sem.c b/src/backend/port/qnx/sem.c
new file mode 100644
index 00000000000..c93bc4cf528
--- /dev/null
+++ b/src/backend/port/qnx/sem.c
@@ -0,0 +1,261 @@
+/*-------------------------------------------------------------------------
+ *
+ * sem.c
+ * System V Semaphore Emulation
+ *
+ * Copyright (c) 1999, repas AEG Automation GmbH
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/sem.c,v 1.1 1999/12/16 01:25:06 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include <errno.h>
+#include <semaphore.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include "postgres.h"
+#include "storage/ipc.h"
+#include <sys/sem.h>
+
+
+#define SETMAX 32
+#define SEMMAX 16
+
+#define MODE 0777
+#define SHM_INFO_NAME "SysV_Sem_Info"
+
+
+struct sem_info {
+ sem_t sem;
+ struct {
+ key_t key;
+ int nsems;
+ sem_t sem[SEMMAX]; /* array of semaphores */
+ pid_t pid[SEMMAX]; /* array of PIDs */
+ } set[SETMAX];
+};
+
+static struct sem_info *SemInfo = ( struct sem_info * )-1;
+
+
+int semctl( int semid, int semnum, int cmd, /*...*/union semun arg )
+{
+ int r;
+
+ sem_wait( &SemInfo->sem );
+
+ if( semid < 0 || semid >= SETMAX ||
+ semnum < 0 || semnum >= SemInfo->set[semid].nsems ) {
+ sem_post( &SemInfo->sem );
+ errno = EINVAL;
+ return -1;
+ }
+
+ switch( cmd ) {
+ case GETPID:
+ r = SemInfo->set[semid].pid[semnum];
+ break;
+
+ case GETVAL:
+ r = SemInfo->set[semid].sem[semnum].value;
+ break;
+
+ case GETALL:
+ for( semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++ ) {
+ arg.array[semnum] = SemInfo->set[semid].sem[semnum].value;
+ }
+ break;
+
+ case SETVAL:
+ SemInfo->set[semid].sem[semnum].value = arg.val;
+ break;
+
+ case SETALL:
+ for( semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++ ) {
+ SemInfo->set[semid].sem[semnum].value = arg.array[semnum];
+ }
+ break;
+
+ case IPC_RMID:
+ for( semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++ ) {
+ if( sem_destroy( &SemInfo->set[semid].sem[semnum] ) == -1 ) {
+ r = -1;
+ }
+ }
+ SemInfo->set[semid].key = -1;
+ SemInfo->set[semid].nsems = 0;
+ break;
+
+ default:
+ sem_post( &SemInfo->sem );
+ errno = EINVAL;
+ return -1;
+ }
+
+ sem_post( &SemInfo->sem );
+
+ return r;
+}
+
+int semget( key_t key, int nsems, int semflg )
+{
+ int fd, semid, semnum/*, semnum1*/;
+ int exist = 0;
+
+ if( nsems < 0 || nsems > SEMMAX ) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* open and map shared memory */
+ if( SemInfo == ( struct sem_info * )-1 ) {
+ /* test if the shared memory already exists */
+ fd = shm_open( SHM_INFO_NAME, O_RDWR | O_CREAT | O_EXCL, MODE );
+ if( fd == -1 && errno == EEXIST ) {
+ exist = 1;
+ fd = shm_open( SHM_INFO_NAME, O_RDWR | O_CREAT, MODE );
+ }
+ if( fd == -1 ) return fd;
+ /* The size may only be set once. Ignore errors. */
+ ltrunc( fd, sizeof( struct sem_info ), SEEK_SET );
+ SemInfo = mmap( NULL, sizeof( struct sem_info ),
+ PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 );
+ if( SemInfo == MAP_FAILED ) return -1;
+ if( !exist ) {
+ /* create semaphore for locking */
+ sem_init( &SemInfo->sem, 1, 1 );
+ sem_wait( &SemInfo->sem );
+ /* initilize shared memory */
+ memset( SemInfo->set, 0, sizeof( SemInfo->set ) );
+ for( semid = 0; semid < SETMAX; semid++ ) {
+ SemInfo->set[semid].key = -1;
+ }
+ sem_post( &SemInfo->sem );
+ }
+ }
+
+ sem_wait( &SemInfo->sem );
+
+ if( key != IPC_PRIVATE ) {
+ /* search existing element */
+ semid = 0;
+ while( semid < SETMAX && SemInfo->set[semid].key != key ) semid++;
+ if( !( semflg & IPC_CREAT ) && semid >= SETMAX ) {
+ sem_post( &SemInfo->sem );
+ errno = ENOENT;
+ return -1;
+ }
+ else if( semid < SETMAX ) {
+ if( semflg & IPC_CREAT && semflg & IPC_EXCL ) {
+ sem_post( &SemInfo->sem );
+ errno = EEXIST;
+ return -1;
+ }
+ else {
+ if( nsems != 0 && SemInfo->set[semid].nsems < nsems ) {
+ sem_post( &SemInfo->sem );
+ errno = EINVAL;
+ return -1;
+ }
+ sem_post( &SemInfo->sem );
+ return semid;
+ }
+ }
+ }
+
+ /* search first free element */
+ semid = 0;
+ while( semid < SETMAX && SemInfo->set[semid].key != -1 ) semid++;
+ if( semid >= SETMAX ) {
+ sem_post( &SemInfo->sem );
+ errno = ENOSPC;
+ return -1;
+ }
+
+ for( semnum = 0; semnum < nsems; semnum++ ) {
+ sem_init( &SemInfo->set[semid].sem[semnum], 1, 0 );
+/* Currently sem_init always returns -1.
+ if( sem_init( &SemInfo->set[semid].sem[semnum], 1, 0 ) == -1 ) {
+ for( semnum1 = 0; semnum1 < semnum; semnum1++ ) {
+ sem_destroy( &SemInfo->set[semid].sem[semnum1] );
+ }
+ sem_post( &SemInfo->sem );
+ return -1;
+ }
+*/
+ }
+
+ SemInfo->set[semid].key = key;
+ SemInfo->set[semid].nsems = nsems;
+
+ sem_post( &SemInfo->sem );
+
+ return 0;
+}
+
+int semop( int semid, struct sembuf *sops, size_t nsops )
+{
+ int i, j, r = 0, r1, errno1 = 0;
+
+ sem_wait( &SemInfo->sem );
+
+ if( semid < 0 || semid >= SETMAX ) {
+ sem_post( &SemInfo->sem );
+ errno = EINVAL;
+ return -1;
+ }
+ for( i = 0; i < nsops; i++ ) {
+ if( /*sops[i].sem_num < 0 ||*/ sops[i].sem_num >= SemInfo->set[semid].nsems ) {
+ sem_post( &SemInfo->sem );
+ errno = EFBIG;
+ return -1;
+ }
+ }
+
+ for( i = 0; i < nsops; i++ ) {
+ if( sops[i].sem_op < 0 ) {
+ if( sops[i].sem_flg & IPC_NOWAIT ) {
+ for( j = 0; j < -sops[i].sem_op; j++ ) {
+ if( sem_trywait( &SemInfo->set[semid].sem[sops[i].sem_num] ) ) {
+ errno1 = errno;
+ r = -1;
+ }
+ }
+ }
+ else {
+ for( j = 0; j < -sops[i].sem_op; j++ ) {
+ sem_post( &SemInfo->sem ); /* avoid deadlock */
+ r1 = sem_wait( &SemInfo->set[semid].sem[sops[i].sem_num] );
+ sem_wait( &SemInfo->sem );
+ if( r1 ) {
+ errno1 = errno;
+ r = r1;
+ }
+ }
+ }
+ }
+ else if( sops[i].sem_op > 0 ) {
+ for( j = 0; j < sops[i].sem_op; j++ ) {
+ if( sem_post( &SemInfo->set[semid].sem[sops[i].sem_num] ) ) {
+ errno1 = errno;
+ r = -1;
+ }
+ }
+ }
+ else /* sops[i].sem_op == 0 */ {
+ /* not supported */
+ }
+ SemInfo->set[semid].pid[sops[i].sem_num] = getpid( );
+ }
+
+ sem_post( &SemInfo->sem );
+
+ errno = errno1;
+ return r;
+}
diff --git a/src/backend/port/qnx/sem.h b/src/backend/port/qnx/sem.h
new file mode 100644
index 00000000000..e9fd57ea351
--- /dev/null
+++ b/src/backend/port/qnx/sem.h
@@ -0,0 +1,54 @@
+/*-------------------------------------------------------------------------
+ *
+ * sem.h
+ * System V Semaphore Emulation
+ *
+ * Copyright (c) 1999, repas AEG Automation GmbH
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/sem.h,v 1.1 1999/12/16 01:25:06 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _SYS_SEM_H
+#define _SYS_SEM_H
+
+#include <sys/ipc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+* Semctl Command Definitions.
+ */
+
+#define GETNCNT 3 /* get semncnt */
+#define GETPID 4 /* get sempid */
+#define GETVAL 5 /* get semval */
+#define GETALL 6 /* get all semval's */
+#define GETZCNT 7 /* get semzcnt */
+#define SETVAL 8 /* set semval */
+#define SETALL 9 /* set all semval's */
+
+/*
+* User semaphore template for semop system calls.
+ */
+
+struct sembuf {
+ ushort_t sem_num; /* semaphore # */
+ short sem_op; /* semaphore operation */
+ short sem_flg; /* operation flags */
+};
+
+extern int semctl( int semid, int semnum, int cmd, /*...*/union semun arg );
+extern int semget( key_t key, int nsems, int semflg );
+extern int semop( int semid, struct sembuf *sops, size_t nsops );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SEM_H */
diff --git a/src/backend/port/qnx/shm.c b/src/backend/port/qnx/shm.c
new file mode 100644
index 00000000000..293c901ac69
--- /dev/null
+++ b/src/backend/port/qnx/shm.c
@@ -0,0 +1,193 @@
+/*-------------------------------------------------------------------------
+ *
+ * shm.c
+ * System V Shared Memory Emulation
+ *
+ * Copyright (c) 1999, repas AEG Automation GmbH
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/shm.c,v 1.1 1999/12/16 01:25:06 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/shm.h>
+
+
+#define MODE 0777
+
+#define SHMMAX 1024
+
+
+struct shm_info {
+ int shmid;
+ key_t key;
+ size_t size;
+ void *addr;
+};
+
+static struct shm_info *ShmInfo;
+
+
+static int shm_putinfo( struct shm_info *info );
+static int shm_updinfo( int i, struct shm_info *info );
+static int shm_getinfo( int shmid, struct shm_info *info );
+static int shm_getinfobyaddr( const void *addr, struct shm_info *info );
+
+
+static int shm_putinfo( struct shm_info *info )
+{
+ int i;
+
+ if( ShmInfo == NULL ) {
+ ShmInfo = calloc( SHMMAX, sizeof( struct shm_info ) );
+ if( ShmInfo == NULL ) return -1;
+ /* initialize ShmInfo */
+ for( i = 0; i < SHMMAX; i++ ) {
+ ShmInfo[i].shmid = -1;
+ }
+ }
+
+ /* search first free element */
+ i = 0;
+ while( i < SHMMAX && ShmInfo[i].shmid != -1 ) i++;
+ if( i >= SHMMAX ) {
+ errno = ENOSPC;
+ return -1;
+ }
+
+ memcpy( &ShmInfo[i], info, sizeof( struct shm_info ) );
+
+ return i;
+}
+
+static int shm_updinfo( int i, struct shm_info *info )
+{
+ if( i >= SHMMAX ) return -1;
+ if( ShmInfo == NULL ) return -1;
+
+ memcpy( &ShmInfo[i], info, sizeof( struct shm_info ) );
+
+ return i;
+}
+
+static int shm_getinfo( int shmid, struct shm_info *info )
+{
+ int i;
+
+ if( ShmInfo == NULL ) return -1;
+
+ /* search element */
+ i = 0;
+ while( i < SHMMAX && ShmInfo[i].shmid != shmid ) i++;
+ if( i >= SHMMAX ) return -1;
+
+ memcpy( info, &ShmInfo[i], sizeof( struct shm_info ) );
+
+ return i;
+}
+
+static int shm_getinfobyaddr( const void *addr, struct shm_info *info )
+{
+ int i;
+
+ if( ShmInfo == ( struct shm_info * )-1 ) return -1;
+
+ /* search element */
+ i = 0;
+ while( i < SHMMAX && ShmInfo[i].addr != addr ) i++;
+ if( i >= SHMMAX ) return -1;
+
+ memcpy( info, &ShmInfo[i], sizeof( struct shm_info ) );
+
+ return i;
+}
+
+
+void *shmat( int shmid, const void *shmaddr, int shmflg )
+{
+ struct shm_info info;
+ int i;
+
+ i = shm_getinfo( shmid, &info );
+ if( i == -1 ) {
+ errno = EACCES;
+ return ( void * )-1;
+ }
+
+ info.addr = mmap( ( void * )shmaddr, info.size,
+ PROT_READ | PROT_WRITE, MAP_SHARED, shmid, 0 );
+ if( info.addr == MAP_FAILED ) return info.addr;
+
+ if( shm_updinfo( i, &info ) == -1 ) {
+ errno = EACCES;
+ return ( void * )-1;
+ }
+
+ return info.addr;
+}
+
+int shmdt( const void *addr )
+{
+ struct shm_info info;
+
+ if( shm_getinfobyaddr( addr, &info ) == -1 ) {
+ errno = EACCES;
+ return -1;
+ }
+
+ return munmap( ( void * )addr, info.size );
+}
+
+int shmctl( int shmid, int cmd, struct shmid_ds *buf )
+{
+ struct shm_info info;
+ char name[NAME_MAX+1];
+
+ /* IPC_RMID supported only */
+ if( cmd != IPC_RMID ) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if( shm_getinfo( shmid, &info ) == -1 ) {
+ errno = EACCES;
+ return -1;
+ }
+
+ return shm_unlink( itoa( info.key, name, 16 ) );
+}
+
+int shmget( key_t key, size_t size, int flags )
+{
+ char name[NAME_MAX+1];
+ int oflag = 0;
+ struct shm_info info;
+
+ if( flags & IPC_CREAT ) oflag |= O_CREAT;
+ if( flags & IPC_EXCL ) oflag |= O_EXCL;
+ if( flags & SHM_R ) {
+ if( flags & SHM_W ) oflag |= O_RDWR;
+ else oflag |= O_RDONLY;
+ }
+ info.shmid = shm_open( itoa( key, name, 16 ), oflag, MODE );
+
+ /* store shared memory information */
+ if( info.shmid != -1 ) {
+ info.key = key;
+ info.size = size;
+ info.addr = NULL;
+ if( shm_putinfo( &info ) == -1 ) return -1;
+ }
+
+ /* The size may only be set once. Ignore errors. */
+ ltrunc( info.shmid, size, SEEK_SET );
+
+ return info.shmid;
+}
diff --git a/src/backend/port/qnx/shm.h b/src/backend/port/qnx/shm.h
new file mode 100644
index 00000000000..02c2eeb3df7
--- /dev/null
+++ b/src/backend/port/qnx/shm.h
@@ -0,0 +1,40 @@
+/*-------------------------------------------------------------------------
+ *
+ * shm.h
+ * System V Shared Memory Emulation
+ *
+ * Copyright (c) 1999, repas AEG Automation GmbH
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/shm.h,v 1.1 1999/12/16 01:25:06 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _SYS_SHM_H
+#define _SYS_SHM_H
+
+#include <sys/ipc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SHM_R 0400 /* read permission */
+#define SHM_W 0200 /* write permission */
+
+struct shmid_ds {
+ int dummy;
+};
+
+extern void *shmat( int shmid, const void *shmaddr, int shmflg );
+extern int shmdt( const void *addr );
+extern int shmctl( int shmid, int cmd, struct shmid_ds *buf );
+extern int shmget( key_t key, size_t size, int flags );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SHM_H */
diff --git a/src/backend/port/qnx/tstrint.c b/src/backend/port/qnx/tstrint.c
new file mode 100644
index 00000000000..82d04e1a735
--- /dev/null
+++ b/src/backend/port/qnx/tstrint.c
@@ -0,0 +1,31 @@
+/*-------------------------------------------------------------------------
+ *
+ * tstrint.c
+ * rint() test
+ *
+ * Copyright (c) 1999, repas AEG Automation GmbH
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/tstrint.c,v 1.1 1999/12/16 01:25:06 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "os.h"
+
+
+int main( int argc, char **argv )
+{
+ double x;
+
+ if( argc != 2 ) exit( 1 );
+
+ x = strtod( argv[1], NULL );
+ printf( "rint( %f ) = %f\n", x, rint( x ) );
+
+ return 0;
+}
diff --git a/src/backend/port/qnx/tstsem.c b/src/backend/port/qnx/tstsem.c
new file mode 100644
index 00000000000..e0eccf7a44c
--- /dev/null
+++ b/src/backend/port/qnx/tstsem.c
@@ -0,0 +1,135 @@
+/*-------------------------------------------------------------------------
+ *
+ * tstsem.c
+ * Test of System V Semaphore Emulation
+ *
+ * Copyright (c) 1999, repas AEG Automation GmbH
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/tstsem.c,v 1.1 1999/12/16 01:25:06 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "postgres.h"
+#include "storage/ipc.h"
+#include <sys/mman.h>
+#include <sys/sem.h>
+
+
+#define SEMMAX 1
+#define OPSMAX 1
+
+
+int main( int argc, char **argv )
+{
+ int c, errflg = 0;
+ char s[80];
+ key_t key = IPC_PRIVATE;
+ int nsems = SEMMAX;
+ int semflg = 0;
+ int unlink = 0;
+ int semid, i;
+ struct sembuf sops[OPSMAX];
+ u_short array[SEMMAX];
+ union semun arg;
+
+ optarg = NULL;
+ while( !errflg && ( c = getopt( argc, argv, "k:n:cxu" ) ) != -1 ) {
+ switch( c ) {
+ case 'k': key = atoi( optarg ); break;
+ case 'n': nsems = atoi( optarg ); break;
+ case 'c': semflg |= IPC_CREAT; break;
+ case 'x': semflg |= IPC_EXCL; break;
+ case 'u': unlink = 1; break;
+ default: errflg++;
+ }
+ }
+ if( errflg ) {
+ printf( "usage: tstsem [-k key] [-n nsems] [-cxu]\n" );
+ exit( 1 );
+ }
+
+ if( unlink ) {
+ i = shm_unlink( "SysV_Sem_Info" );
+ if( i == -1 ) perror( "shm_unlink" );
+ exit( i );
+ }
+
+ semid = semget( key, nsems, semflg );
+ if( semid == -1 ) {
+ perror( "semget" );
+ exit( semid );
+ }
+
+ do {
+ printf( "(-)sem_op, (+)sem_op, (G)ETVAL, (S)ETVAL, GET(P)ID, GET(A)LL, SETA(L)L, e(x)it: " );
+ scanf( "%s", s );
+ switch( s[0] ) {
+ case '-':
+ case '+':
+ sops[0].sem_num = 0;
+ sops[0].sem_op = atoi( s );
+ if( sops[0].sem_op == 0 ) sops[0].sem_op = s[0] == '+' ? +1 : -1;
+ sops[0].sem_flg = 0;
+ if( semop( semid, sops, 1 ) == -1 ) perror( "semop" );
+ break;
+
+ case 'G':
+ case 'g':
+ i = semctl( semid, 0, GETVAL, arg );
+ if( i == -1 ) perror( "semctl" );
+ else printf( "semval = %d\n", i );
+ break;
+
+ case 'S':
+ case 's':
+ printf( "semval = " );
+ scanf( "%d", &arg.val );
+ if( semctl( semid, 0, SETVAL, arg ) == -1 ) perror( "semctl" );
+ break;
+
+ case 'P':
+ case 'p':
+ i = semctl( semid, 0, GETPID, arg );
+ if( i == -1 ) perror( "semctl" );
+ else printf( "PID = %d\n", i );
+ break;
+
+ case 'A':
+ case 'a':
+ arg.array = array;
+ i = semctl( semid, 0, GETALL, arg );
+ if( i == -1 ) perror( "semctl" );
+ else {
+ for( i = 0; i < nsems; i++ ) {
+ printf( "semval[%d] = %hu\n", i, arg.array[i] );
+ }
+ }
+ break;
+
+ case 'L':
+ case 'l':
+ arg.array = array;
+ for( i = 0; i < nsems; i++ ) {
+ printf( "semval[%d] = ", i );
+ scanf( "%hu", &arg.array[i] );
+ }
+ if( semctl( semid, 0, SETALL, arg ) == -1 )perror( "semctl" );
+ break;
+ }
+ }
+ while( s[0] != 'x' );
+
+ if( semctl( semid, 0, IPC_RMID, arg ) == -1 ) {
+ perror( "semctl" );
+ exit( -1 );
+ }
+
+ exit( 0 );
+}
diff --git a/src/backend/port/qnx/tstshm.c b/src/backend/port/qnx/tstshm.c
new file mode 100644
index 00000000000..4cd2110edde
--- /dev/null
+++ b/src/backend/port/qnx/tstshm.c
@@ -0,0 +1,80 @@
+/*-------------------------------------------------------------------------
+ *
+ * tstshm.c
+ * Test of System V Shared Memory Emulation
+ *
+ * Copyright (c) 1999, repas AEG Automation GmbH
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/tstshm.c,v 1.1 1999/12/16 01:25:06 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/shm.h>
+
+
+int main( int argc, char **argv )
+{
+ int c, errflg = 0;
+ char s[80];
+ key_t key = 0x1000;
+ size_t size = 256;
+ int shmid = -1;
+ caddr_t addr = NULL;
+
+ optarg = NULL;
+ while( !errflg && ( c = getopt( argc, argv, "k:s:" ) ) != -1 ) {
+ switch( c ) {
+ case 'k': key = atoi( optarg ); break;
+ case 's': size = atoi( optarg ); break;
+ default: errflg++;
+ }
+ }
+ if( errflg ) {
+ printf( "usage: tstshm [-k key] [-s size]\n" );
+ exit( 1 );
+ }
+
+ do {
+ printf( "shm(g)et, shm(a)t, shm(d)t, shm(c)tl, (w)rite, (r)ead, e(x)it: " );
+ scanf( "%s", s );
+ switch( s[0] ) {
+ case 'g':
+ shmid = shmget( key, size, IPC_CREAT | SHM_R | SHM_W );
+ if( shmid == -1 ) perror( "shmget" );
+ break;
+
+ case 'a':
+ addr = shmat( shmid, NULL, 0 );
+ if( addr == ( void * )-1 ) perror( "shmat" );
+ break;
+
+ case 'd':
+ if( shmdt( addr ) == -1 ) perror( "shmdt" );
+ else addr = NULL;
+ break;
+
+ case 'c':
+ if( shmctl( shmid, IPC_RMID, NULL ) == -1 ) perror( "shmctl" );
+ else shmid = -1;
+ break;
+
+ case 'w':
+ printf( "String to write: " );
+ scanf( "%s", addr );
+ break;
+
+ case 'r':
+ puts( addr );
+ break;
+ }
+ }
+ while( s[0] != 'x' );
+
+ return 0;
+}