00001
00002
00003
00004
00005
00006
00007
00008 #include "giis.h"
00009
00010
00011
00012
00013 int set_content_offset ()
00014 {
00015 fs.block_number = iin.in.i_block[0];
00016 fs.content_offset = (unsigned long long) fs.block_number * fs.block_size;
00017 lseek64 (fd, fs.content_offset, 0);
00018 return 1;
00019 }
00020
00021
00022
00023
00024 int read_dir ()
00025 {
00026 int i;
00027 i = read (fd, ide.buffer, DIR_SIZE);
00028 CHECK return 1;
00029 }
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 int record_dir (unsigned long parent)
00040 {
00041 int fp, i;
00042 fp = open (DIR_INFO_FILE, 2);
00043 if (fp == -1)
00044 {
00045 perror ("open:");
00046 printf ("\nError No:%d", errno);
00047 close (fp);
00048 return -1;
00049 }
00050
00051 lseek (fp, 0, 2);
00052
00053
00054
00055 if (install == 0)
00056 {
00057 i = check4dir_dups (parent);
00058 CHECK if (i == 0)
00059 {
00060 close (fp);
00061 return 1;
00062 }
00063 }
00064
00065
00066 result = time (NULL);
00067 strcpy (date_time, asctime (localtime (&result)));
00068 strcpy (giis_d.info.date_time, date_time);
00069
00070 if (entry == 0)
00071 {
00072 giis_d.info.inode_number = ide.de.inode;
00073 for (i = 0; i < ide.de.name_len; i++)
00074 giis_d.info.name[i] = ide.de.name[i];
00075 giis_d.info.name[i] = '\0';
00076 close (fp);
00077 return 1;
00078 }
00079 if (entry == 1)
00080 {
00081 giis_d.info.parent_inode_number = ide.de.inode;
00082 giis_d.info.search_flag = 0;
00083 i = write (fp, giis_d.buffer, GIIS_DSIZE);
00084 if (i != GIIS_DSIZE)
00085 {
00086 perror ("write():");
00087 printf ("\nError No:%d", errno);
00088 close (fp);
00089 return -1;
00090 }
00091 close (fp);
00092 return 1;
00093 }
00094 if (entry >= 2 && !found)
00095 giis_d.info.parent_inode_number = giis_d.info.inode_number;
00096 found = 1;
00097 for (i = 0; i < ide.de.name_len; i++)
00098 giis_d.info.name[i] = ide.de.name[i];
00099 giis_d.info.name[i] = '\0';
00100
00101 giis_d.info.inode_number = ide.de.inode;
00102 if (giis_d.info.name[0] == '.')
00103 {
00104 close (fp);
00105 return 1;
00106 }
00107 giis_d.info.search_flag = 0;
00108
00109 if ((strcmp (giis_d.info.name, "root") == 0))
00110 {
00111 giis_d.info.search_flag = 1;
00112 root_inode = giis_d.info.inode_number;
00113 }
00114
00115 if ((strcmp (giis_d.info.name, "home") == 0))
00116 {
00117 giis_d.info.search_flag = 1;
00118 home_inode = giis_d.info.inode_number;
00119 }
00120
00121
00122 if (update_dir)
00123 {
00124 giis_d.info.search_flag = 1;
00125 giis_d.info.parent_inode_number = parent;
00126
00127 }
00128
00129
00130 i = write (fp, giis_d.buffer, GIIS_DSIZE);
00131 if (i != GIIS_DSIZE)
00132 {
00133 perror (" write()");
00134 printf ("\nError No:%d \t fp=%d", errno, fp);
00135 close (fp);
00136 return -1;
00137 }
00138 close (fp);
00139 return 1;
00140 }
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 int record_file (unsigned long parent)
00152 {
00153 int fp, i;
00154
00155 if (ide.de.name[0] == '.')
00156 return 1;
00157
00158 fp = open (FILE_INFO_FILE, 1);
00159 if (fp == -1)
00160 {
00161 perror ("open:");
00162 printf ("\nError No:%d", errno);
00163 close (fp);
00164 return -1;
00165 }
00166 lseek (fp, 0, 2);
00167
00168 result = time (NULL);
00169 strcpy (date_time, asctime (localtime (&result)));
00170 strcpy (giis_f.info.date_time, date_time);
00171
00172
00173
00174
00175 fs.inode_number = ide.de.inode;
00176 i = find_inode_offset ();
00177 CHECK i = read_inode ();
00178 CHECK
00179
00180
00181 if (install == 0)
00182 {
00183 i = check4file_dups (parent);
00184 CHECK if (i == 0)
00185 {
00186 close (fp);
00187 return 1;
00188 }
00189 }
00190
00191 for (i = 0; i < ide.de.name_len; i++)
00192 giis_f.info.name[i] = ide.de.name[i];
00193 giis_f.info.name[i] = '\0';
00194 giis_f.info.inode_number = ide.de.inode;
00195 giis_f.info.parent_inode_number = parent;
00196 giis_f.info.mode = iin.in.i_mode;
00197 giis_f.info.owner = iin.in.i_uid;
00198 giis_f.info.file_blocks_count = iin.in.i_blocks;
00199 giis_f.info.file_size = iin.in.i_size;
00200 giis_f.info.file_flags = iin.in.i_flags;
00201 giis_f.info.search_flag = 0;
00202
00203
00204
00205 giis_f.info.last_data_block = 0;
00206 for (i = 0; i < 15; i++)
00207 {
00208 giis_f.info.data_block[i] = iin.in.i_block[i];
00209
00210 if (iin.in.i_block[i] == 0 && i <= 12 && !giis_f.info.last_data_block)
00211 giis_f.info.last_data_block = iin.in.i_block[i - 1];
00212 }
00213
00214
00215
00216 if (iin.in.i_block[0] == iin.in.i_block[1])
00217 return 1;
00218 if (iin.in.i_size > 49152 && (iin.in.i_block[12] == 0))
00219 return 1;
00220 if (iin.in.i_size < 49512 && (iin.in.i_block[12] != 0))
00221 return 1;
00222 if (iin.in.i_block[14] != 0)
00223 return 1;
00224
00225
00226
00227
00228
00229 giis_f.info.sfragment_flag = 0;
00230 giis_f.info.dfragment_flag = 0;
00231 giis_f.info.is_offset = 0;
00232 giis_f.info.id_offset = 0;
00233
00234
00235 if (iin.in.i_size >= 49152)
00236 {
00237
00238 if (giis_f.info.data_block[12] != 0)
00239 {
00240 i = search4sequence12 ();
00241 CHECK}
00242
00243 if (giis_f.info.data_block[13] != 0)
00244 {
00245
00246 i_round = 0;
00247 hole = 0;
00248 giis_f.info.last_data_block = 0;
00249 i = search4sequence13 ();
00250 CHECK}
00251
00252 }
00253
00254
00255
00256 i = write (fp, giis_f.buffer, GIIS_FSIZE);
00257 if (i != GIIS_FSIZE)
00258 {
00259 perror (" write():");
00260 printf ("\nError No:%d", errno);
00261 close (fp);
00262 return -1;
00263 }
00264
00265
00266
00267 close (fp);
00268 return 1;
00269 }
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285 int show_dir ()
00286 {
00287 int i = 0;
00288 unsigned long long temp_content_offset, parent = 0;
00289 temp_content_offset = fs.content_offset;
00290
00291 while ((ide.de.rec_len != 0) && (ide.de.rec_len % 4 == 0))
00292 {
00293
00294
00295
00296 if ((entry == 0) && (ide.de.file_type == 2))
00297 {
00298 parent = ide.de.inode;
00299 }
00300
00301 if (update_dir && (ide.de.file_type == 2))
00302 {
00303 record_dir (parent);
00304 entry++;
00305 }
00306 if (update_dir == 0)
00307 {
00308
00309 if ((update_file == 0) && (install_file == 0) && (ide.de.file_type == 2))
00310 {
00311 record_dir (parent);
00312 entry++;
00313 }
00314
00315 if ((update_file || install_file) && (ide.de.file_type != 2)
00316 && (ide.de.file_type != 0))
00317 {
00318
00319 record_file (parent);
00320 }
00321 }
00322 temp_content_offset += ide.de.rec_len;
00323 i = lseek64 (fd, temp_content_offset, 0);
00324 i = read (fd, ide.buffer, DIR_SIZE);
00325 }
00326
00327
00328 entry = 0;
00329 found = 0;
00330 return 1;
00331 }