OSDN Git Service

(LibGoblin)
[drdeamon64/drdeamon64.git] / libfiletype / drd64_libfiletype_main.c
1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
2
3                          D r . D e a m o n  6 4
4                         for INTEL64(R), AMD64(R)
5         
6    Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
10
11  1. Redistributions of source code must retain the above copyright notice,
12     this list of conditions and the following disclaimer.
13  2. Redistributions in binary form must reproduce the above copyright
14     notice, this list of conditions and the following disclaimer in the
15     documentation and/or other materials provided with the distribution.
16
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
30
31 /* File Info -----------------------------------------------------------
32 File: drd64_.c
33 Function: 
34 Comment: 
35 ----------------------------------------------------------------------*/
36
37 #define DRD64_SRC_LIBFILETYPE_MAIN
38 #include"drd64_libfiletype.h"
39
40 #define DRD64_SRC_LIBFILETYPE_MAIN_SRCID        0x01
41
42 #define LOCATION(n)     DRD64_ERR_LOCATION( \
43                         DRD64_ERROR_MODULE_LIBFILETYPE, DRD64_ERROR_ARCH_NODEPEND, \
44                         DRD64_SRC_LIBFILETYPE_MAIN_SRCID, (n))
45
46
47 /*----------------------------------------------------------------------
48 ----------------------------------------------------------------------*/
49 #define FUNCID_LibFileType_CheckFileType        0x01
50 LIBFILETYPE_FUNC
51 int
52         LibFileType_CheckFileType(
53                 LibFileType_FileType    *p_filetype,
54                 const char      *pstr_filename,
55                 int             i_argfd )
56 {
57         struct  stat    t_stat;
58         int             i_result        = 0x00;
59         int             i_fd;
60         int             i_err;
61         off_t   t_foffset;
62         DWord   dw_lines;
63         DWord   dw_length;
64
65         i_result = LibFileType_GetFileType_fromFileName( p_filetype, pstr_filename );
66
67         // Open File-Descriptor ---
68         if( -0x01 == i_argfd )  {
69                 i_fd    = open( pstr_filename, O_RDONLY );
70                 if( -0x01 == i_fd )     {
71                         LibBrownie_Error_SetErrorInfo(
72                                         DRD64_WARNING( DRD64_ERROR_PTN_SYSCALL, 0x00, 0x01 ),
73                                         LOCATION( FUNCID_LibFileType_CheckFileType ),
74                                         errno, (QWord)i_fd, (QWord)0x00, __LINE__ ); 
75                         return 0x01;
76                 }
77         }
78         else
79                 { i_fd  = i_argfd; }
80
81         // Save Now File-Cursor ---
82         t_foffset       = lseek( i_fd, 0, SEEK_CUR );
83         if( -0x01 == t_foffset )        {
84                 LibBrownie_Error_SetErrorInfo(
85                                 DRD64_ERROR( DRD64_ERROR_PTN_SYSCALL, 0x01, 0x02 ),
86                                 LOCATION( FUNCID_LibFileType_CheckFileType ),
87                                 errno, (QWord)i_fd, (QWord)t_foffset, __LINE__ ); 
88                 i_result        = -0x02;
89                 goto goto_LibFileType_CheckFileType_post;
90         }
91         
92         /* Get FileSize from fstat func. */
93         i_err   = fstat( i_fd, &t_stat );
94         if( -0x01 == i_err )    {
95                 LibBrownie_Error_SetErrorInfo(
96                                 DRD64_ERROR( DRD64_ERROR_PTN_LIBCALL, 0x01, 0x03 ),
97                                 LOCATION( FUNCID_LibFileType_CheckFileType ),
98                                 errno, (QWord)i_fd, (QWord)i_err, __LINE__ ); 
99                 i_result        = -0x03;
100                 goto goto_LibFileType_CheckFileType_error;
101         }
102         p_filetype->dw_filesize = t_stat.st_size;
103
104         /* XXX : Verify Data-File (Text or Binray) */
105         if( DRD64_LIBFILETYPE_TEXT == p_filetype->b_type )      {
106                 i_err   = LibFileType_TextFile_VerifyTextFile( &dw_lines, &dw_length, i_fd );
107                 if( 0 > i_err )         {
108                         LibBrownie_Error_SetErrorInfo(
109                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x04 ),
110                                 LOCATION( FUNCID_LibFileType_CheckFileType ),
111                                 errno, (QWord)i_fd, (QWord)i_err, __LINE__ ); 
112                         i_result        = -0x04;
113                         goto goto_LibFileType_CheckFileType_error;
114                 }
115                 p_filetype->dw_lines            = dw_lines;
116                 p_filetype->dw_maxlength        = dw_length;
117         }
118         else if( DRD64_LIBFILETYPE_BINARY == p_filetype->b_type )       {
119                 i_err   = LibFileType_BinaryFile_VerifyBinaryFile( p_filetype, i_fd );
120                 if( 0 > i_err )         {
121                         LibBrownie_Error_SetErrorInfo(
122                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x05 ),
123                                 LOCATION( FUNCID_LibFileType_CheckFileType ),
124                                 errno, (QWord)i_fd, (QWord)i_err, __LINE__ ); 
125                         i_result        = -0x05;
126                         goto goto_LibFileType_CheckFileType_error;
127                 }
128         }
129
130 goto_LibFileType_CheckFileType_error:
131         // Restore Now File-Cursor ---
132         t_foffset       = lseek( i_fd, t_foffset, SEEK_SET );
133         if( -0x01 == t_foffset )        {
134                 LibBrownie_Error_SetErrorInfo(
135                                 DRD64_ERROR( DRD64_ERROR_PTN_SYSCALL, 0x01, 0x05 ),
136                                 LOCATION( FUNCID_LibFileType_CheckFileType ),
137                                 errno, (QWord)i_fd, (QWord)t_foffset, __LINE__ ); 
138                 // NO set i_result Value because orig. i_result value clear.
139         }
140         
141 goto_LibFileType_CheckFileType_post:
142         if( -0x01 == i_argfd )
143                 { close( i_fd ); }
144         
145         return i_result;
146 }
147
148
149 /*----------------------------------------------------------------------
150 ----------------------------------------------------------------------*/
151 #define FUNCID_LibFileType_CheckMemoryType      0x02
152 LIBFILETYPE_FUNC
153 int
154         LibFileType_CheckMemoryType(
155                 LibFileType_FileType    *p_filetype,
156                 Byte    *pb_data,
157                 int             i_size )
158 {
159         int             i_result;
160         
161         assert( NULL != p_filetype );
162         assert( NULL != pb_data );
163
164         p_filetype->b_type              = DRD64_LIBFILETYPE_BINARY;
165         p_filetype->w_subtype   = DRD64_LIBFILETYPE_SUB_BINARY;
166
167         i_result        = LibFileType_BinaryFile_VerifyBinaryData( p_filetype, pb_data, i_size );
168
169         return i_result;
170 }
171
172
173 /*----------------------------------------------------------------------
174 ----------------------------------------------------------------------*/
175 #define FUNCID_LibFileType_Init         0x06
176 LIBFILETYPE_FUNC
177 int
178         LibFileType_Init(
179                 void )
180 {
181         int             i_result;
182
183         i_result        = LibBrownie_Init();
184
185         return i_result;
186 }
187
188
189 /*----------------------------------------------------------------------
190 ----------------------------------------------------------------------*/
191 #define FUNCID_LibFileType_Term         0x07
192 LIBFILETYPE_FUNC
193 int
194         LibFileType_Term(
195                 void )
196 {
197         LibBrownie_Term();
198
199         return 0x00;
200 }
201
202
203 /* EOF of drd64_.c ----------------------------------- */