--- freem/src/shmmgr.c 2025/03/09 19:50:47 1.4
+++ freem/src/shmmgr.c 2025/04/14 19:46:18 1.8
@@ -1,5 +1,5 @@
/*
- * $Id: shmmgr.c,v 1.4 2025/03/09 19:50:47 snw Exp $
+ * $Id: shmmgr.c,v 1.8 2025/04/14 19:46:18 snw Exp $
* shared memory manager
*
*
@@ -24,6 +24,18 @@
* along with FreeM. If not, see .
*
* $Log: shmmgr.c,v $
+ * Revision 1.8 2025/04/14 19:46:18 snw
+ * Add SHM_REMAP flag to shmat on FreeBSD
+ *
+ * Revision 1.7 2025/04/09 19:52:02 snw
+ * Eliminate as many warnings as possible while building with -Wall
+ *
+ * Revision 1.6 2025/04/04 19:43:18 snw
+ * Switch to using environment catalog to determine user and group for environment, and remove -u and -g flags from freem
+ *
+ * Revision 1.5 2025/03/24 02:56:50 snw
+ * Shared memory compatibility fixes for OS/2
+ *
* Revision 1.4 2025/03/09 19:50:47 snw
* Second phase of REUSE compliance and header reformat
*
@@ -48,7 +60,7 @@
#include
#include
-#if !defined(__OpenBSD__) && !defined(__APPLE__)
+#if !defined(__OpenBSD__) && !defined(__APPLE__) && !defined(__OS2__)
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
@@ -70,10 +82,8 @@ shm_config_t *shm_config = (shm_config_t
short shm_init(const size_t seg_size)
{
- union semun arg;
size_t alloc_map_size;
long pg_size;
- register int i;
key_t shm_sk;
shm_sk = ftok (config_file, 5);
@@ -92,7 +102,7 @@ short shm_init(const size_t seg_size)
shm_config->key = ftok (config_file, 1);
shm_config->pgsiz = pg_size;
- shm_config->seg_id = shmget (shm_config->key, shm_config->segsiz, 0660 | IPC_CREAT);
+ shm_config->seg_id = shmget (shm_config->key, shm_config->segsiz, 0770 | IPC_CREAT);
if (shm_config->seg_id == -1) {
if (errno == 22) {
fprintf (stderr, "shm_init: cannot get shared memory segment of %ld bytes\r\n\r\n", (unsigned long) shm_config->segsiz);
@@ -162,8 +172,14 @@ short shm_init(const size_t seg_size)
fprintf (stderr, "shm_init: detach failed during detach/reattach [shmdt error %s]\r\n", strerror (errno));
exit (1);
}
-
+
+#if defined(__FreeBSD__)
+ shm_config->dta = shmat (shm_config->seg_id, new_addr, SHM_REMAP);
+#else
shm_config->dta = shmat (shm_config->seg_id, new_addr, 0);
+#endif
+
+
if (shm_config->dta == (void *) -1) {
fprintf (stderr, "shm_init: fatal error attaching shared memory segment [shmat error '%s']\r\n", strerror (errno));
@@ -194,7 +210,6 @@ short shm_init(const size_t seg_size)
void shm_daemon_init(void)
{
union semun arg;
- size_t alloc_map_size;
key_t shm_sk;
register int i;
@@ -470,7 +485,7 @@ void shm_dump(void)
printf ("SHARED MEMORY CONFIGURATION\r\n");
printf (" pgsiz %ld\r\n", (unsigned long) shm_config->pgsiz);
printf (" pgct %d\r\n", shm_config->pgct);
- printf (" key %ld\r\n", shm_config->key);
+ printf (" key %d\r\n", shm_config->key);
printf (" segid %d\r\n", shm_config->seg_id);
printf (" sizeof shm_page_t %ld\r\n", (long) sizeof (shm_page_t));
printf (" segsiz %ld\r\n", (long) shm_config->segsiz);