| [683] | 1 | //
 | 
|---|
 | 2 | // Simulation de memoire partagee pour mac
 | 
|---|
 | 3 | //
 | 
|---|
 | 4 | 
 | 
|---|
 | 5 | #include <stdio.h>
 | 
|---|
 | 6 | #include "macshm.h"
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | int shmget(int key, size_t size, int flags)
 | 
|---|
 | 9 | {
 | 
|---|
 | 10 |   char fn[256];
 | 
|---|
 | 11 |   sprintf(fn, "shm.%d", key);
 | 
|---|
 | 12 |   c2pstr(fn);
 | 
|---|
 | 13 |   OSErr err = 0;
 | 
|---|
 | 14 |   if (flags & IPC_CREAT) err = Create((StringPtr)fn, 0,'MMCC','TEXT');
 | 
|---|
 | 15 |   if ((flags & IPC_EXCL) && (err == dupFNErr)) return -1;
 | 
|---|
 | 16 |   short fRefNum;
 | 
|---|
 | 17 |   FSOpen((StringPtr)fn, 0, &fRefNum);
 | 
|---|
 | 18 |   long sz;
 | 
|---|
 | 19 |   GetEOF(fRefNum, &sz);
 | 
|---|
 | 20 |   if (size > sz) SetEOF(fRefNum, size);
 | 
|---|
 | 21 |   FSClose(fRefNum);
 | 
|---|
 | 22 |   return key;
 | 
|---|
 | 23 | }
 | 
|---|
 | 24 | 
 | 
|---|
 | 25 | void* shmat(int shmid, void*, int)
 | 
|---|
 | 26 | {
 | 
|---|
 | 27 |   char fn[256];
 | 
|---|
 | 28 |   sprintf(fn, "shm.%d", shmid);
 | 
|---|
 | 29 |   c2pstr(fn);
 | 
|---|
 | 30 |   short fRefNum;
 | 
|---|
 | 31 |   FSOpen((StringPtr)fn, 0, &fRefNum);
 | 
|---|
 | 32 |   long sz;
 | 
|---|
 | 33 |   GetEOF(fRefNum, &sz);
 | 
|---|
 | 34 |   char* p = new char[sz + sizeof(int)];
 | 
|---|
 | 35 |   *(int*)p = shmid;
 | 
|---|
 | 36 |   p += sizeof(int);
 | 
|---|
 | 37 |   FSRead(fRefNum, &sz, p);
 | 
|---|
 | 38 |   FSClose(fRefNum);
 | 
|---|
 | 39 |   return (void*) p;
 | 
|---|
 | 40 | }
 | 
|---|
 | 41 | 
 | 
|---|
 | 42 | int shmctl(int shmid, int cmd, struct shmid_ds* buf)
 | 
|---|
 | 43 | {
 | 
|---|
 | 44 |   char fn[256];
 | 
|---|
 | 45 |   sprintf(fn, "shm.%d", shmid);
 | 
|---|
 | 46 |   c2pstr(fn);
 | 
|---|
 | 47 |   switch(cmd) {
 | 
|---|
 | 48 |     case IPC_STAT:
 | 
|---|
 | 49 |       short fRefNum;
 | 
|---|
 | 50 |       FSOpen((StringPtr)fn, 0, &fRefNum);
 | 
|---|
 | 51 |       long sz;
 | 
|---|
 | 52 |       GetEOF(fRefNum, &sz);
 | 
|---|
 | 53 |       buf->shm_segsz = sz;
 | 
|---|
 | 54 |       FSClose(fRefNum);
 | 
|---|
 | 55 |       return 0;
 | 
|---|
 | 56 |     case IPC_RMID:
 | 
|---|
 | 57 |       FSDelete((StringPtr)fn, 0);
 | 
|---|
 | 58 |       return 0;
 | 
|---|
 | 59 |   }
 | 
|---|
 | 60 |   return -1;
 | 
|---|
 | 61 | }
 | 
|---|
 | 62 | int shmdt(const void *addr)
 | 
|---|
 | 63 | {
 | 
|---|
 | 64 |   char* p = (char*)addr - sizeof(int);
 | 
|---|
 | 65 |   int shmid = *(int*)p;
 | 
|---|
 | 66 |   
 | 
|---|
 | 67 |   char fn[256];
 | 
|---|
 | 68 |   sprintf(fn, "shm.%d", shmid);
 | 
|---|
 | 69 |   c2pstr(fn);
 | 
|---|
 | 70 |   short fRefNum;
 | 
|---|
 | 71 |   FSOpen((StringPtr)fn, 0, &fRefNum);
 | 
|---|
 | 72 |   long sz;
 | 
|---|
 | 73 |   GetEOF(fRefNum, &sz);
 | 
|---|
 | 74 |   FSWrite(fRefNum, &sz, addr);
 | 
|---|
 | 75 |   FSClose(fRefNum);
 | 
|---|
 | 76 |   
 | 
|---|
 | 77 |   delete[] p;
 | 
|---|
 | 78 |   return 0;
 | 
|---|
 | 79 | }
 | 
|---|
 | 80 | 
 | 
|---|