Minor fixes to comments.
[AROS.git] / rom / filesys / AmberRAM / handler.c
blob6e1b86c4e255b828b3770a331018740a8080cde3
1 /*
3 File: handler.c
4 Author: Neil Cafferkey
5 Copyright (C) 2001-2008 Neil Cafferkey
6 Copyright (C) 2011 The AROS Development Team
8 This file is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as
10 published by the Free Software Foundation; either version 2.1 of the
11 License, or (at your option) any later version.
13 This file is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with this file; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston,
21 MA 02111-1307, USA.
25 #include <aros/debug.h>
26 #include <aros/asmcall.h>
28 #include "handler_protos.h"
31 /* Global variables */
33 #ifndef __AROS__
34 struct ExecBase *SysBase;
35 #endif
37 /* Data prototypes */
39 #ifndef __AROS__
40 extern struct ExecBase *AbsExecBase;
41 #endif
43 /* Function prototypes */
45 static struct DosPacket *GetPacket(struct MsgPort *port);
46 static VOID ReplyPacket(struct MsgPort *proc_port, struct DosPacket *packet,
47 PINT result1, PINT result2);
48 static TEXT *BStr(struct Handler *h, UBYTE *b_str);
49 static TEXT *BStr2(struct Handler *h, UBYTE *b_str);
51 #ifdef __AROS__
52 LONG AmberMain(struct ExecBase *SysBase)
53 #else
54 LONG AmberMain(void)
55 #endif
57 struct Handler *handler;
58 struct MsgPort *proc_port;
59 struct DosPacket *packet;
60 PINT result;
61 BOOL exit;
62 LONG link_type;
63 APTR link_target;
64 ULONG port_signals;
65 struct Message *message;
67 /* Open libraries */
68 handler = AllocMem(sizeof(struct Handler), MEMF_CLEAR);
69 if(handler == NULL)
70 return RETURN_FAIL;
72 #ifndef __AROS__
73 SysBase = AbsExecBase;
74 #endif
76 DOSBase = (struct DosLibrary *)OpenLibrary(DOSNAME, DOS_VERSION);
77 if(DOSBase == NULL) {
78 FreeMem(handler, sizeof(struct Handler));
79 return RETURN_FAIL;
82 /* Process start-up packet */
84 proc_port = &((*(struct Process *)FindTask(NULL)).pr_MsgPort);
86 WaitPort(proc_port);
87 packet = GetPacket(proc_port);
89 exit = CmdStartup(handler, BStr(handler, BADDR(packet->dp_Arg1)),
90 BADDR(packet->dp_Arg3), proc_port);
92 ReplyPacket(proc_port, packet, DOSBOOL(!exit), IoErr());
94 /* Set up port signals */
96 port_signals = 1 << (proc_port->mp_SigBit);
97 Signal(proc_port->mp_SigTask, port_signals);
98 if(!exit)
99 port_signals |= 1 << (handler->notify_port->mp_SigBit);
101 /* Service packet requests */
103 while(!exit)
105 Wait(port_signals);
107 /* Accept returning messages from notification clients */
109 while((message = GetMsg(handler->notify_port)) != NULL)
111 ReceiveNotifyReply(handler, (APTR)message);
114 /* Service packet requests */
116 while((packet = GetPacket(proc_port)) != NULL)
118 result = DOSTRUE;
119 SetIoErr(0);
121 switch(packet->dp_Type)
123 case ACTION_DIE:
125 if(!CmdDie(handler))
126 result = DOSFALSE;
127 exit = result;
128 break;
130 case ACTION_IS_FILESYSTEM:
132 if(!CmdIsFileSystem())
133 result = DOSFALSE;
134 break;
136 case ACTION_FINDOUTPUT:
138 if(!CmdFind(handler, BADDR(packet->dp_Arg1),
139 BADDR(packet->dp_Arg2), BStr(handler, BADDR(packet->dp_Arg3)),
140 MODE_NEWFILE))
141 result = DOSFALSE;
142 break;
144 case ACTION_FINDUPDATE:
146 if(!CmdFind(handler, BADDR(packet->dp_Arg1),
147 BADDR(packet->dp_Arg2), BStr(handler, BADDR(packet->dp_Arg3)),
148 MODE_READWRITE))
149 result = DOSFALSE;
150 break;
152 case ACTION_FINDINPUT:
154 if(!CmdFind(handler, BADDR(packet->dp_Arg1),
155 BADDR(packet->dp_Arg2), BStr(handler, BADDR(packet->dp_Arg3)),
156 MODE_OLDFILE))
157 result = DOSFALSE;
158 break;
160 case ACTION_FH_FROM_LOCK:
162 result = CmdFHFromLock(handler, BADDR(packet->dp_Arg1),
163 BADDR(packet->dp_Arg2));
164 break;
166 case ACTION_END:
168 if(!CmdEnd(handler, (APTR)packet->dp_Arg1))
169 result = DOSFALSE;
170 break;
172 case ACTION_READ:
174 result = CmdRead(handler, (struct Opening *)packet->dp_Arg1,
175 (UBYTE *)packet->dp_Arg2, packet->dp_Arg3);
176 break;
178 case ACTION_WRITE:
180 result = CmdWrite(handler, (struct Opening *)packet->dp_Arg1,
181 (UBYTE *)packet->dp_Arg2, packet->dp_Arg3);
182 break;
184 case ACTION_SEEK:
185 result = CmdSeek(handler, (struct Opening *)packet->dp_Arg1,
186 packet->dp_Arg2, packet->dp_Arg3);
187 break;
189 case ACTION_SET_FILE_SIZE:
191 result = CmdSetFileSize(handler, (APTR)packet->dp_Arg1,
192 packet->dp_Arg2, packet->dp_Arg3);
193 break;
195 case ACTION_LOCATE_OBJECT:
197 result = (PINT)MKBADDR(CmdLocateObject(handler,
198 BADDR(packet->dp_Arg1), BStr(handler, BADDR(packet->dp_Arg2)),
199 packet->dp_Arg3));
200 break;
202 case ACTION_FREE_LOCK:
204 if(!CmdFreeLock(handler, BADDR(packet->dp_Arg1)))
205 result = DOSFALSE;
206 break;
208 case ACTION_COPY_DIR:
210 result = (PINT)MKBADDR(CmdCopyDir(handler, BADDR(packet->dp_Arg1)));
211 break;
213 case ACTION_COPY_DIR_FH:
215 result = (PINT)MKBADDR(CmdCopyDirFH(handler, (APTR)packet->dp_Arg1));
216 break;
218 case ACTION_PARENT:
220 result = (PINT)MKBADDR(CmdParent(handler, BADDR(packet->dp_Arg1)));
221 break;
223 case ACTION_PARENT_FH:
225 result = (PINT)MKBADDR(CmdParentFH(handler, (APTR)packet->dp_Arg1));
226 break;
228 case ACTION_SAME_LOCK:
230 if(!CmdSameLock(handler, BADDR(packet->dp_Arg1), BADDR(packet->dp_Arg2)))
231 result = DOSFALSE;
232 break;
234 case ACTION_CREATE_DIR:
236 result = (PINT)MKBADDR(CmdCreateDir(handler, BADDR(packet->dp_Arg1),
237 BStr(handler, BADDR(packet->dp_Arg2))));
238 break;
240 case ACTION_EXAMINE_OBJECT:
242 if(!CmdExamineObject(handler, BADDR(packet->dp_Arg1),
243 BADDR(packet->dp_Arg2)))
244 result = DOSFALSE;
245 break;
247 case ACTION_EXAMINE_FH:
249 if(!CmdExamineFH(handler, (APTR)packet->dp_Arg1,
250 BADDR(packet->dp_Arg2)))
251 result = DOSFALSE;
252 break;
254 case ACTION_EXAMINE_NEXT:
256 if(!CmdExamineNext(handler, BADDR(packet->dp_Arg2)))
257 result = DOSFALSE;
258 break;
260 case ACTION_EXAMINE_ALL:
262 if(!CmdExamineAll(handler, BADDR(packet->dp_Arg1),
263 (APTR)packet->dp_Arg2, packet->dp_Arg3, packet->dp_Arg4,
264 (APTR)packet->dp_Arg5))
265 result = DOSFALSE;
266 break;
268 case ACTION_EXAMINE_ALL_END:
270 CmdExamineAllEnd(handler, BADDR(packet->dp_Arg1),
271 (APTR)packet->dp_Arg2, packet->dp_Arg3, packet->dp_Arg4,
272 (APTR)packet->dp_Arg5);
273 break;
275 case ACTION_INFO:
277 if(!CmdInfo(handler, BADDR(packet->dp_Arg2)))
278 result = DOSFALSE;
279 break;
281 case ACTION_DISK_INFO:
283 if(!CmdInfo(handler, BADDR(packet->dp_Arg1)))
284 result = DOSFALSE;
285 break;
287 case ACTION_SET_PROTECT:
289 if(!CmdSetProtect(handler, BADDR(packet->dp_Arg2),
290 BStr(handler, BADDR(packet->dp_Arg3)), packet->dp_Arg4))
291 result = DOSFALSE;
292 break;
294 case ACTION_SET_COMMENT:
296 if(!CmdSetComment(handler, BADDR(packet->dp_Arg2),
297 BStr(handler, BADDR(packet->dp_Arg3)),
298 BStr2(handler, BADDR(packet->dp_Arg4))))
299 result = DOSFALSE;
300 break;
302 case ACTION_RENAME_OBJECT:
304 if(!CmdRenameObject(handler, BADDR(packet->dp_Arg1),
305 BStr(handler, BADDR(packet->dp_Arg2)), BADDR(packet->dp_Arg3),
306 BStr2(handler, BADDR(packet->dp_Arg4))))
307 result = DOSFALSE;
308 break;
310 case ACTION_RENAME_DISK:
312 if(!CmdRenameDisk(handler, BStr(handler, BADDR(packet->dp_Arg1))))
313 result = DOSFALSE;
314 break;
316 case ACTION_SET_DATE:
318 if(!CmdSetDate(handler, BADDR(packet->dp_Arg2),
319 BStr(handler, BADDR(packet->dp_Arg3)), (APTR)packet->dp_Arg4))
320 result = DOSFALSE;
321 break;
323 case ACTION_DELETE_OBJECT:
325 if(!CmdDeleteObject(handler, BADDR(packet->dp_Arg1),
326 BStr(handler, BADDR(packet->dp_Arg2))))
327 result = DOSFALSE;
328 break;
330 case ACTION_CURRENT_VOLUME:
332 result = (PINT)MKBADDR(CmdCurrentVolume(handler));
333 break;
335 case ACTION_CHANGE_MODE:
337 result = CmdChangeMode(handler, packet->dp_Arg1, BADDR(packet->dp_Arg2),
338 packet->dp_Arg3);
339 break;
341 case ACTION_MAKE_LINK:
343 link_target = (APTR)packet->dp_Arg3;
344 link_type = packet->dp_Arg4;
345 if(link_type == LINK_HARD)
346 link_target = BADDR(link_target);
347 if(!CmdMakeLink(handler, BADDR(packet->dp_Arg1),
348 BStr(handler, BADDR(packet->dp_Arg2)), link_target, link_type))
349 result = DOSFALSE;
350 break;
352 case ACTION_READ_LINK:
354 result = CmdReadLink(handler, BADDR(packet->dp_Arg1),
355 (APTR)packet->dp_Arg2, (APTR)packet->dp_Arg3,
356 packet->dp_Arg4);
357 break;
359 case ACTION_WRITE_PROTECT:
361 if(!CmdWriteProtect(handler, packet->dp_Arg1,
362 (ULONG)packet->dp_Arg2))
363 result = DOSFALSE;
364 break;
366 case ACTION_FLUSH:
368 if(!CmdFlush())
369 result = DOSFALSE;
370 break;
372 case ACTION_ADD_NOTIFY:
374 if(!CmdAddNotify(handler, (APTR)packet->dp_Arg1))
375 result = DOSFALSE;
376 break;
378 case ACTION_REMOVE_NOTIFY:
380 if(!CmdRemoveNotify(handler, (APTR)packet->dp_Arg1))
381 result = DOSFALSE;
382 break;
384 default:
385 result = DOSFALSE;
386 SetIoErr(ERROR_ACTION_NOT_KNOWN);
389 ReplyPacket(proc_port, packet, result, IoErr());
394 CloseLibrary((APTR)DOSBase);
396 DeleteHandler(handler);
398 return RETURN_OK;
401 static struct DosPacket *GetPacket(struct MsgPort *port)
403 struct Message *message;
404 struct DosPacket *packet;
406 message = GetMsg(port);
407 if(message != NULL)
408 packet = (struct DosPacket *)((struct Node *)message)->ln_Name;
409 else
410 packet = NULL;
412 return packet;
417 static VOID ReplyPacket(struct MsgPort *proc_port, struct DosPacket *packet,
418 PINT result1, PINT result2)
420 struct MsgPort *port;
421 struct Message *message;
423 port = packet->dp_Port;
424 message = packet->dp_Link;
426 packet->dp_Port = proc_port;
427 packet->dp_Res1 = result1;
428 packet->dp_Res2 = result2;
430 PutMsg(port, message);
432 return;
435 static TEXT *BStr(struct Handler *h, UBYTE *b_str)
437 UBYTE length;
439 #ifdef AROS_FAST_BSTR
440 length = StrSize(b_str);
441 CopyMem(b_str, h->b_buffer, length);
442 #else
443 length = *b_str;
444 if(length != 0)
445 CopyMem(b_str + 1, h->b_buffer, length);
446 #endif
447 *(h->b_buffer + length) = '\0';
449 return h->b_buffer;
454 static TEXT *BStr2(struct Handler *h, UBYTE *b_str)
456 UBYTE length;
458 #ifdef AROS_FAST_BSTR
459 length = StrSize(b_str);
460 CopyMem(b_str, h->b_buffer2, length);
461 #else
462 length = *b_str;
463 if(length != 0)
464 CopyMem(b_str + 1, h->b_buffer2, length);
465 #endif
466 *(h->b_buffer2 + length) = '\0';
468 return h->b_buffer2;
473 UBYTE *MkBStr(struct Handler *h, TEXT *str)
475 UBYTE length;
477 length = StrLen(str);
478 #ifdef AROS_FAST_BSTR
479 CopyMem(str, h->b_buffer, length + 1);
480 #else
481 if(length != 0)
482 CopyMem(str, h->b_buffer + 1, length);
483 *h->b_buffer = length;
484 #endif
486 return h->b_buffer;