/* * * (c) 2005 Laurent Vivier * */ #include #include #include "misc.h" #include "glue.h" /* * OpenDriver: * * http://developer.apple.com/documentation/mac/Devices/Devices-23.html * */ OSErr OpenDriver(ConstStr255Param name, short *drvrRefNum) { OSErr err; ParamBlockRec param; memset(¶m, 0, sizeof(ParamBlockRec)); param.ioNamePtr = (u_int32_t)name; param.ioPermssn = fsCurPerm; err = PBOpenSync(¶m); if (err != noErr) return err; *drvrRefNum = param.ioRefNum; return param.ioResult; } OSErr CloseDriver(short refNum) { OSErr err; ParamBlockRec param; memset(¶m, 0, sizeof(ParamBlockRec)); param.ioRefNum = refNum; err = PBCloseSync(¶m); if (err != noErr) return err; return param.ioResult; } ssize_t write(int fd, const void *buf, size_t count) { int res; ParamBlockRec param; param.ioCompletion = 0; param.ioVRefNum = 0; param.ioRefNum = fd; param.ioBuffer = (u_int32_t)buf; param.ioReqCount= count; param.ioPosMode = fsAtMark; param.ioPosOffset = 0; res = PBWriteSync(¶m); if (res != noErr) return 0; return param.ioActCount; } #ifdef USE_CLI static OSErr SerGetBuf(short refNum, long *count) { int res; CntrlParam param; param.ioCompletion = 0; param.ioVRefNum = 0; param.ioCRefNum = refNum; param.csCode = kSERDInputCount; res = PBStatusSync((ParmBlkPtr)¶m); *count = *(long*)¶m.csParam; return res; } ssize_t read(int fd, void *buf, size_t count) { int res; ParamBlockRec param; long available; res = SerGetBuf(fd, &available); if ( (res != noErr) || (available == 0) ) return 0; param.ioCompletion = 0; param.ioVRefNum = 0; param.ioRefNum = fd; param.ioBuffer = (u_int32_t)buf; param.ioReqCount= count > available ? available : count; param.ioPosMode = fsAtMark; param.ioPosOffset = 0; res = PBReadSync(¶m); if (res != noErr) return 0; return param.ioActCount; } #endif