src/dir.c

Go to the documentation of this file.
00001 /*
00002 * /giis/dir.c This files deals with gathering vital infomations need for recovery.
00003 *
00004 * Copyright (C) 2006. G.Lakshmipathi.<lakshmipathi_g@rediffmail.com>
00005 *
00006 */
00007 
00008 #include "giis.h"
00009 
00010 /*
00011 * set_content_offset() will first set offset of directory and then read it into buffer 
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 * read_dir() Loads directory into buffer 
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 * record_dir() enters directory informations into a file 
00033 *
00034 * Modification for giis2.1:
00035 *
00036 * Makes a call to check4dir_dups().
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);             /* Set file pointer to end */
00052 
00053   /*  Don't Call during installation. */
00054 
00055   if (install == 0)
00056   {
00057     i = check4dir_dups (parent);
00058     CHECK if (i == 0)
00059     {                           /* Already we have it */
00060       close (fp);
00061       return 1;
00062     }
00063   }
00064 
00065   /* date n time */
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   {                             /* entry and found are Global */
00072     giis_d.info.inode_number = ide.de.inode;    /* current 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   {                             /* don't save system files except . and .. */
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   {                             /* Record all dir found during updates */
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 * record_file() records  file informations necessary for recovery.
00144 * file is system file which often begins with "." then don't record it for obvious reason.
00145 * Since that's not created by any users.
00146 *
00147 * Modification for giis2.1:
00148 *
00149 * Makes a call to check4file_dups().
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);             /* Set file pointer to end */
00167   /* date n time */
00168   result = time (NULL);
00169   strcpy (date_time, asctime (localtime (&result)));
00170   strcpy (giis_f.info.date_time, date_time);
00171 
00172 
00173   /* Get  inode  details */
00174 
00175   fs.inode_number = ide.de.inode;
00176   i = find_inode_offset ();
00177   CHECK i = read_inode ();
00178   CHECK
00179     /* Store files iff it's a new one or it's old one with some contents modified and
00180        Don't Called during installation. */
00181     if (install == 0)
00182   {
00183     i = check4file_dups (parent);
00184     CHECK if (i == 0)
00185     {                           /* Already we have it */
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;     /*Same parent 4 all files in dir */
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     /* Store block number of files<48KB size */
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   /* Error check 4 some raw error check details */
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)  /* Not supported */
00223     return 1;
00224 
00225 
00226 
00227   /* Set flags */
00228 
00229   giis_f.info.sfragment_flag = 0;       /* Fragment level for single indirect */
00230   giis_f.info.dfragment_flag = 0;       /* Do the Same for double */
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;                 /* used in search4sequence13 */
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 * show_dir() displays the content of the requested  directory inode.
00273 * And during installation stores file and directory entries.
00274 *
00275 * Modification for giis2:
00276 *
00277 * Introduce new variable  install_file with it's help we first store all directory 
00278 * informations first. Once all directories are recorded then we start to record files
00279 * from these directories.
00280 *
00281 * Modification for giis2.1:
00282 *
00283 * update_dir variable to update directories.
00284 */
00285 int show_dir ()
00286 {
00287   int i = 0;
00288   unsigned long long temp_content_offset, parent = 0;       /* So that we don't mess up original offset */
00289   temp_content_offset = fs.content_offset;
00290 
00291   while ((ide.de.rec_len != 0) && (ide.de.rec_len % 4 == 0))
00292   {
00293 
00294     /*First entry is current directory inode */
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);    /*Install:Record data in DIR_INFO_FILE */
00312         entry++;
00313       }
00314 
00315       if ((update_file || install_file) && (ide.de.file_type != 2)
00316           && (ide.de.file_type != 0))
00317       {
00318         /*Record data in FILE_INFO_FILE */
00319         record_file (parent);
00320       }
00321     }
00322     temp_content_offset += ide.de.rec_len;      /* Next entry */
00323     i = lseek64 (fd, temp_content_offset, 0);
00324     i = read (fd, ide.buffer, DIR_SIZE);
00325   }
00326 
00327   /* reset for next directories */
00328   entry = 0;
00329   found = 0;
00330   return 1;
00331 }

Generated on Wed Jul 25 20:43:33 2007 for giis by  doxygen 1.5.1