2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
6 #include <aros/debug.h>
8 #include <dos/rdargs.h>
9 #include <exec/lists.h>
10 #include <exec/memory.h>
11 #include <libraries/expansion.h>
12 #include <libraries/expansionbase.h>
13 #include <proto/alib.h>
14 #include <proto/arossupport.h>
15 #include <proto/dos.h>
16 #include <proto/exec.h>
17 #include <proto/expansion.h>
30 struct MinList handlerlist
;
33 LONG
parsePrefs(char *buffer
, LONG size
)
35 struct CSource csrc
= {buffer
, size
, 0};
40 D(bug("[Automount] parsePrefs()\n"));
42 while (csrc
.CS_CurChr
< csrc
.CS_Length
)
44 struct HandlerNode
*tn
;
48 ULONG mask
= 0xFFFFFFFF;
50 DB2(bug("[parsePrefs] Cur %d, Length %d\n", csrc
.CS_CurChr
, csrc
.CS_Length
));
52 res
= ReadItem(ident
, 256, &csrc
);
61 /* Skip over to the end of line */
62 while ((csrc
.CS_CurChr
< csrc
.CS_Length
) && (buffer
[csrc
.CS_CurChr
] != '\n'))
70 for (i
= 0; i
< 4; i
++)
76 Printf("LINE %ld: Mailformed filesystem ID\n", line
);
84 c
= strtoul(p
, &p
, 16);
88 mask
&= ~(0xFF000000 >> (i
<< 3));
98 Printf("LINE %ld: Missing filesystem ID\n", line
);
102 res
= ReadItem(ident
, 256, &csrc
);
103 if (res
== ITEM_ERROR
)
106 if (res
!= ITEM_EQUAL
)
108 Printf("LINE %ld: Unexpected item after filesystem ID\n", line
);
112 res
= ReadItem(ident
, 256, &csrc
);
113 if (res
== ITEM_ERROR
)
116 if ((res
!= ITEM_QUOTED
) && (res
!= ITEM_UNQUOTED
))
118 Printf("LINE %ld: Missing handler name\n", line
);
123 tn
= AllocPooled(pool
, sizeof(struct HandlerNode
) + res
);
125 return ERROR_NO_FREE_STORE
;
129 CopyMem(ident
, tn
->handler
, res
+ 1);
131 AddTail((struct List
*)&handlerlist
, (struct Node
*)tn
);
135 * Intentional ReadItem() bug workaround.
136 * Ungets '\n' every time, causing an infinite loop without this adjustment.
138 if ((csrc
.CS_CurChr
< csrc
.CS_Length
) && (buffer
[csrc
.CS_CurChr
] == '\n'))
148 static LONG
LoadPrefs(STRPTR filename
)
150 struct FileInfoBlock fib
;
156 D(bug("[Automount] LoadPrefs('%s')\n", filename
));
158 fh
= Open(filename
, MODE_OLDFILE
);
161 if (ExamineFH(fh
, &fib
))
165 buffer
= AllocMem(fib
.fib_Size
, MEMF_PUBLIC
| MEMF_CLEAR
);
168 size
= Read(fh
, buffer
, fib
.fib_Size
);
169 if (size
== fib
.fib_Size
)
170 retval
= parsePrefs(buffer
, size
);
174 FreeMem(buffer
, fib
.fib_Size
);
177 retval
= ERROR_NO_FREE_STORE
;
189 static struct HandlerNode
*FindHandler(ULONG id
)
191 struct HandlerNode
*n
;
193 ForeachNode(&handlerlist
, n
)
195 if (n
->id
== (id
& n
->mask
))
202 static BOOL
IsMounted(struct DeviceNode
*dn
)
205 struct DosList
*dl
= LockDosList(LDF_DEVICES
|LDF_READ
);
207 while ((dl
= NextDosEntry(dl
, LDF_DEVICES
)))
209 if (dl
== (struct DosList
*)dn
)
216 UnLockDosList(LDF_DEVICES
|LDF_READ
);
220 int __nocommandline
= 1;
226 pool
= CreatePool(1024, 1024, MEMF_ANY
);
229 PrintFault(ERROR_NO_FREE_STORE
, "Automount");
233 NewList((struct List
*)&handlerlist
);
234 res
= LoadPrefs("L:automount-config");
240 ForeachNode(&((struct ExpansionBase
*)ExpansionBase
)->MountList
, n
)
242 struct DeviceNode
*dn
= n
->bn_DeviceNode
;
244 D(bug("[Automount] Checking BootNode %b...\n", dn
->dn_Name
));
246 if ((!dn
->dn_Task
) && (!dn
->dn_SegList
) && (!dn
->dn_Handler
) && dn
->dn_Startup
)
248 struct FileSysStartupMsg
*fssm
= BADDR(dn
->dn_Startup
);
250 D(bug("[Automount] Not mounted\n"));
252 if (fssm
->fssm_Environ
)
254 struct DosEnvec
*de
= BADDR(fssm
->fssm_Environ
);
258 struct HandlerNode
*hn
= FindHandler(de
->de_DosType
);
262 Printf("Mounting %b with %s\n", dn
->dn_Name
, hn
->handler
);
264 dn
->dn_Handler
= CreateBSTR(hn
->handler
);
267 res
= ERROR_NO_FREE_STORE
;
273 D(bug("[Automount] Adding DOS entry...\n"));
274 AddDosEntry((struct DosList
*)dn
);
277 if (n
->bn_Flags
& ADNF_STARTPROC
)
281 D(bug("[Automount] Starting up...\n"));
283 res
= AROS_BSTR_strlen(dn
->dn_Name
);
284 buf
= AllocMem(res
+ 2, MEMF_ANY
);
287 res
= ERROR_NO_FREE_STORE
;
291 CopyMem(AROS_BSTR_ADDR(dn
->dn_Name
), buf
, res
);
305 PrintFault(res
, "Automount");