OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / system / file / sysvol_open.c
1 /** 
2  *  Hyper Operating System  Application Framework
3  *
4  * @file  sysvol.h
5  * @brief %jp{システムボリューム}
6  *
7  * Copyright (C) 2006-2007 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12 #include <stdio.h>
13 #include <string.h>
14 #include "sysvol_local.h"
15 #include "system/sysapi/sysapi.h"
16 #include "system/file/drvobj.h"
17
18
19 /* ファイルを開く */
20 HANDLE SysVol_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
21 {
22         C_SYSVOL        *self;
23         int                     iLen;
24         int                     i;
25         
26         /* upper cast */
27         self = (C_SYSVOL *)pDrvObj;
28         
29         /* 自分自身のディレクトリを開くなら */
30         if ( *pszPath == '\0' )
31         {
32                 C_SYSVOLDIR *pDir;
33
34                 /* モードチェック */
35                 if ( !(iMode & (FILE_OPEN_DIR | FILE_OPEN_READ)) )
36                 {
37                         return HANDLE_NULL;
38                 }
39                 
40                 /* ディスクリプタ生成 */
41                 if ( (pDir = (C_SYSVOLDIR *)SysMem_Alloc(sizeof(C_SYSVOLDIR))) == NULL )
42                 {
43                         return HANDLE_NULL;
44                 }
45                 FileObj_Create(&pDir->FileObj, (C_DRVOBJ *)self, NULL);
46                 pDir->iReadPtr = 0;
47                 
48                 return (HANDLE)pDir;
49         }
50         
51         /* 下位デバイスを検索 */
52         for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ )
53         {
54                 /* 名前部分探索 */
55                 for ( iLen =0; pszPath[iLen] != '\0' && pszPath[iLen] != '/'; iLen++ )
56                         ;
57                 
58                 if ( strncmp(pszPath, self->DevTable[i].szName, iLen) == 0 )
59                 {
60                         break;
61                 }
62         }
63         if ( i >= DEVVOL_MAX_DEVICE )
64         {
65                 return HANDLE_NULL;
66         }
67         
68         if ( pszPath[iLen] == '/' )
69         {
70                 iLen++;
71         }
72         
73         return DrvObj_vOpen(self->DevTable[i].pDrvObj, &pszPath[iLen], iMode);
74 }
75
76
77 /* end of file */
78