mirror of
https://github.com/vivier/EMILE.git
synced 2024-09-28 23:54:28 +00:00
116 lines
1.9 KiB
C
116 lines
1.9 KiB
C
|
/*
|
||
|
*
|
||
|
* (c) 2005 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include <unistd.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#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
|