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
);
25 /* TODO: Check sharing permission here */
27 ReleaseSemaphore(&unixioDev
->sigsem
);
29 ioreq
->io_Unit
= (struct Unit
*)unit
;
31 ioreq
->io_Message
.mn_Node
.ln_Type
= NT_REPLYMSG
;
33 DOPEN(bug("unixio.device: in libopen func. Unit is already open\n"));
37 DOPEN(bug("unixio.device: in libopen func. Creating new UnitData ...\n"));
39 unit
= (struct UnitData
*)AllocVec(sizeof(struct UnitData
) + strlen(unitname
), MEMF_PUBLIC
);
42 unit
->fd
= Hidd_UnixIO_Open(unixioDev
->unixio
, unitname
, O_RWDR
|O_NONBLOCK
, 0755, NULL
);
45 unit
->unitNode
.ln_Name
= unit
->unitName
;
46 unit
->unixio
= unixioDev
->unixio
;
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
;
60 ioreq
->io_Message
.mn_Node
.ln_Type
= NT_REPLYMSG
;
66 ReleaseSemaphore(&unixioDev
->sigsem
);
67 ioreq
->io_Error
= IOERR_OPENFAIL
;
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
;
81 D(bug("unixio.device: close unit %s\n", unit
->n
.ln_Name
));
83 ObtainSemaphore(&unixioDev
->sigsem
);
85 usecnt
= --unit
->usecount
;
88 D(bug("unixio.device: Unit is no more in use, disposing...\n"));
90 Remove(&unit
->unitNode
);
93 ReleaseSemaphore(&unixioDev
->sigsem
);
97 Hidd_UnixIO_CloseFile(unixioDev
->unixio
, unit
->fd
, NULL
);
104 ADD2CLOSEDEV(unixdevice_Close
, 0);
106 /****************************************************************************************/