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