| 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 | 
 | 
|---|