Some work in progress.
[AROS.git] / arch / all-unix / devs / unixio / deviceutil.c
blobee356d5d5197a790781dbe037a04deb9e3a634f9
1 #define DEBUG 0
2 #define DOPEN(x)
4 #include <errno.h>
6 #include <aros/debug.h>
7 #include <aros/symbolsets.h>
8 #include <exec/errors.h>
9 #include <proto/exec.h>
11 #include "unixio_device.h"
13 static int unixdevice_Open(struct UnixDevice *unixioDev, struct IOStdReq *ioreq, STRPTR unitname, ULONG flags)
15 struct UnitData *unit;
17 D(bug("unixio.device: open UnitData %s\n", unitname));
19 ObtainSemaphore(&unixioDev->sigsem);
21 unit = (struct UnitData *)FindName(&unixioDev->units, unitname);
23 if (UnitData)
25 /* TODO: Check sharing permission here */
26 UnitData->usecount++;
27 ReleaseSemaphore(&unixioDev->sigsem);
29 ioreq->io_Unit = (struct Unit *)unit;
30 ioreq->io_Error = 0;
31 ioreq->io_Message.mn_Node.ln_Type = NT_REPLYMSG;
33 DOPEN(bug("unixio.device: in libopen func. Unit is already open\n"));
34 return TRUE;
37 DOPEN(bug("unixio.device: in libopen func. Creating new UnitData ...\n"));
39 unit = (struct UnitData *)AllocVec(sizeof(struct UnitData) + strlen(unitname), MEMF_PUBLIC);
40 if (unit)
42 unit->fd = Hidd_UnixIO_Open(unixioDev->unixio, unitname, O_RWDR|O_NONBLOCK, 0755, NULL);
43 if (unit->fd != -1)
45 unit->unitNode.ln_Name = unit->unitName;
46 unit->unixio = unixioDev->unixio;
47 unit->usecount = 1;
48 unit->writeLength = 0;
49 unit->stopped = FALSE;
50 unit->eofmode = FALSE;
51 NEWLIST(&unit->readQueue);
52 NEWLIST(&unit->writeQueue);
53 strcpy(unit->unitName, unitname);
55 AddTail((struct List *)&unixioDev->units, &UnitData->n);
56 ReleaseSemaphore(&unixioDev->sigsem);
58 ioreq->io_Unit = (struct Unit *)unit;
59 ioreq->io_Error = 0;
60 ioreq->io_Message.mn_Node.ln_Type = NT_REPLYMSG;
62 return TRUE;
66 ReleaseSemaphore(&unixioDev->sigsem);
67 ioreq->io_Error = IOERR_OPENFAIL;
69 return FALSE;
72 ADD2OPENDEV(unixdevice_Open, 0);
74 /****************************************************************************************/
76 static int unixdevice_Close((struct UnixDevice *unixioDev, struct IOStdReq *ioreq)
78 struct UnitData *unit = (struct UnitData *)ioreq->io_Unit;
79 ULONG usecnt;
81 D(bug("unixio.device: close unit %s\n", unit->n.ln_Name));
83 ObtainSemaphore(&unixioDev->sigsem);
85 usecnt = --unit->usecount;
86 if (!usecnt)
88 D(bug("unixio.device: Unit is no more in use, disposing...\n"));
90 Remove(&unit->unitNode);
93 ReleaseSemaphore(&unixioDev->sigsem);
95 if (!usecnt)
97 Hidd_UnixIO_CloseFile(unixioDev->unixio, unit->fd, NULL);
98 FreeVec(unit);
101 return TRUE;
104 ADD2CLOSEDEV(unixdevice_Close, 0);
106 /****************************************************************************************/