From 358e703c5c1a56fecf723d1413eda962938dcd4f Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Tue, 11 Feb 2003 09:33:49 +0000
Subject: [PATCH] Basic semaphore emulation and defines for GNU/Hurd

---
 src/xpdev/genwrap.c    |  2 +-
 src/xpdev/genwrap.h    |  2 ++
 src/xpdev/sem.c        | 45 ++++++++++++++++++++++++++++++++++++++++++
 src/xpdev/sem.h        | 10 ++++++++++
 src/xpdev/threadwrap.h |  4 ++++
 5 files changed, 62 insertions(+), 1 deletion(-)
 create mode 100644 src/xpdev/sem.c
 create mode 100644 src/xpdev/sem.h

diff --git a/src/xpdev/genwrap.c b/src/xpdev/genwrap.c
index 99e14075fd..03b3fb3cb0 100644
--- a/src/xpdev/genwrap.c
+++ b/src/xpdev/genwrap.c
@@ -123,7 +123,7 @@ void DLLCALL unix_beep(int freq, int dur)
 {
 	static int console_fd=-1;
 
-#if !defined(__OpenBSD__)
+#if !defined(__OpenBSD__) && !defined(__GNU__)
 	if(console_fd == -1) 
   		console_fd = open("/dev/console", O_NOCTTY);
 	
diff --git a/src/xpdev/genwrap.h b/src/xpdev/genwrap.h
index e4111b21e9..47c850ad45 100644
--- a/src/xpdev/genwrap.h
+++ b/src/xpdev/genwrap.h
@@ -106,6 +106,8 @@ extern "C" {
 	#define PLATFORM_DESC	"Solaris"
 #elif defined(__sun__)
 	#define PLATFORM_DESC	"SunOS"
+#elif defined(__gnu__)
+	#define PLATFORM_DESC	"GNU/Hurd"
 #elif defined(__unix__)
 	#define PLATFORM_DESC	"Unix"
 #else
diff --git a/src/xpdev/sem.c b/src/xpdev/sem.c
new file mode 100644
index 0000000000..825653e603
--- /dev/null
+++ b/src/xpdev/sem.c
@@ -0,0 +1,45 @@
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "genwrap.h"
+#include "sem.h"
+
+int sem_init(sem_t *sem, int pshared, unsigned int value)  {
+	sem=malloc(sizeof(sem_t));
+	if(sem==NULL)  {
+		errno=ENOSPC;
+		return(-1);
+	}
+	if(pipe((int *)sem)) {
+		errno=EPERM;
+		return(-1);
+	}
+	return(0);
+}
+
+int sem_destroy(sem_t *sem)  {
+	close(sem->read);
+	close(sem->write);
+	sem=NULL;
+	return(0);
+}
+
+int sem_post(sem_t *sem)  {
+	if(sem==NULL)  {
+		errno=EINVAL;
+		return(-1);
+	}
+	write(sem->write,"-",1)==1;
+	return(0);
+}
+
+int sem_wait(sem_t *sem)  {
+	char	buf;
+	if(sem==NULL) {
+		errno=EINVAL;
+		return(-1);
+	}
+	while(read(sem->read,&buf,1)<1)
+		SLEEP(1);
+	return(0);
+}
diff --git a/src/xpdev/sem.h b/src/xpdev/sem.h
new file mode 100644
index 0000000000..9dbdd9eb90
--- /dev/null
+++ b/src/xpdev/sem.h
@@ -0,0 +1,10 @@
+typedef struct {
+	int read;
+	int write;
+}  sem_t;
+
+int sem_init(sem_t *sem, int pshared, unsigned int value);
+int sem_destroy(sem_t *sem);
+int sem_post(sem_t *sem);
+int sem_wait(sem_t *sem);
+
diff --git a/src/xpdev/threadwrap.h b/src/xpdev/threadwrap.h
index accb941133..a72f5b0cbc 100644
--- a/src/xpdev/threadwrap.h
+++ b/src/xpdev/threadwrap.h
@@ -48,7 +48,11 @@ extern "C" {
 #if defined(__unix__)
 
 	#include <pthread.h>	/* POSIX threads and mutexes */
+#if defined(_NEED_SEM)
+	#include "sem.h"
+#else
 	#include <semaphore.h>	/* POSIX semaphores */
+#endif
 	ulong _beginthread(void( *start_address )( void * )
 		,unsigned stack_size, void *arglist);
 
-- 
GitLab