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