Ejemplo n.º 1
0
/*+++++++++++++++++++++++++ remove_paused_dir() +++++++++++++++++++++++++*/
static int
remove_paused_dir(char *dirname, int fra_pos)
{
   int           addchar = NO,
                 files_deleted = 0;
   off_t         file_size_deleted = 0;
   char          *ptr;
   struct dirent *dirp;
   DIR           *dp;
   struct stat   stat_buf;

   ptr = dirname + strlen(dirname);

   if ((dp = opendir(dirname)) == NULL)
   {
      system_log(ERROR_SIGN, __FILE__, __LINE__,
                 "Failed to opendir() <%s> : %s", dirname, strerror(errno));
      return(INCORRECT);
   }
   if (*(ptr - 1) != '/')
   {
      *(ptr++) = '/';
      addchar = YES;
   }

   while ((dirp = readdir(dp)) != NULL)
   {
      if ((dirp->d_name[0] == '.') && ((dirp->d_name[1] == '\0') ||
          ((dirp->d_name[1] == '.') && (dirp->d_name[2] == '\0'))))
      {
         continue;
      }
      (void)strcpy(ptr, dirp->d_name);
      if (stat(dirname, &stat_buf) == -1)
      {
         system_log(DEBUG_SIGN, __FILE__, __LINE__,
                    "Failed to stat() `%s' : %s", dirname, strerror(errno));
      }
      else
      {
         if (unlink(dirname) == -1)
         {
            system_log(DEBUG_SIGN, __FILE__, __LINE__,
                       "Failed to unlink() `%s' : %s",
                       dirname, strerror(errno));
         }
         else
         {
            files_deleted++;
            file_size_deleted += stat_buf.st_size;
         }
      }
   }
   if (addchar == YES)
   {
      ptr[-1] = 0;
   }
   else
   {
      *ptr = '\0';
   }
   if (closedir(dp) == -1)
   {
      system_log(ERROR_SIGN, __FILE__, __LINE__,
                 "Failed to closedir() <%s> : %s", dirname, strerror(errno));
      return(INCORRECT);
   }
   if (rmdir(dirname) == -1)
   {
      system_log(ERROR_SIGN, __FILE__, __LINE__,
                 "Failed to rmdir() <%s> : %s", dirname, strerror(errno));
      return(INCORRECT);
   }
   if (files_deleted > 0)
   {
      ABS_REDUCE_QUEUE(fra_pos, files_deleted, file_size_deleted);
   }

   return(SUCCESS);
}
Ejemplo n.º 2
0
/*######################### search_old_files() ##########################*/
void
search_old_files(time_t current_time)
{
   int           i, j, k,
                 delete_file,
                 junk_files,
                 file_counter,
                 queued_files,
#ifdef _DELETE_LOG
                 reason,
#endif
                 ret;
   time_t        diff_time,
                 pmatch_time;
   char          *work_ptr,
                 tmp_dir[MAX_PATH_LENGTH];
   off_t         queued_size_deleted,
                 file_size;
   struct stat   stat_buf;
   DIR           *dp;
   struct dirent *p_dir;

   for (i = 0; i < no_of_local_dirs; i++)
   {
      if ((de[i].dir != NULL) &&
          ((fra[de[i].fra_pos].dir_flag & DIR_DISABLED) == 0))
      {
         (void)strcpy(tmp_dir, de[i].dir);

         if ((dp = opendir(tmp_dir)) == NULL)
         {
            if ((errno != ENOENT) && (errno != EACCES))
            {
               system_log(WARN_SIGN, __FILE__, __LINE__,
                          "Can't access directory %s : %s",
                          tmp_dir, strerror(errno));
            }
         }
         else
         {
            file_counter        = 0;
            file_size           = 0;
            junk_files          = 0;
            queued_files        = 0;
            queued_size_deleted = 0;

            work_ptr = tmp_dir + strlen(tmp_dir);
            *work_ptr++ = '/';
            *work_ptr = '\0';

            errno = 0;
            while ((p_dir = readdir(dp)) != NULL)
            {
               /* Ignore "." and "..". */
               if (((p_dir->d_name[0] == '.') && (p_dir->d_name[1] == '\0')) ||
                   ((p_dir->d_name[0] == '.') && (p_dir->d_name[1] == '.') &&
                   (p_dir->d_name[2] == '\0')))
               {
                  continue;
               }

               (void)strcpy(work_ptr, p_dir->d_name);
               if (stat(tmp_dir, &stat_buf) < 0)
               {
                  /*
                   * Since this is a very low priority function lets not
                   * always report when we fail to stat() a file. Maybe the
                   * the user wants to keep some files.
                   */
                  continue;
               }

               /* Sure it is a normal file? */
               if (S_ISREG(stat_buf.st_mode))
               {
                  /*
                   * Regardless of what the delete_files_flag is set, also
                   * delete old files that are of zero length or have a
                   * leading dot.
                   */
                  diff_time = current_time - stat_buf.st_mtime;
                  if (diff_time < 0)
                  {
                     diff_time = 0;
                  }
                  if (((p_dir->d_name[0] == '.') &&
                       (diff_time > 3600L) &&
                       ((fra[de[i].fra_pos].unknown_file_time == 0) ||
                        ((fra[de[i].fra_pos].delete_files_flag & OLD_LOCKED_FILES) &&
                         (diff_time > fra[de[i].fra_pos].locked_file_time)))) ||
                      ((diff_time > 5L) &&
                       (diff_time > fra[de[i].fra_pos].unknown_file_time)))
                  {
                     if ((fra[de[i].fra_pos].delete_files_flag & UNKNOWN_FILES) ||
                         (p_dir->d_name[0] == '.'))
                     {
                        if (p_dir->d_name[0] == '.')
                        {
                           if ((fra[de[i].fra_pos].delete_files_flag & OLD_LOCKED_FILES) &&
                                (diff_time > fra[de[i].fra_pos].locked_file_time))
                           {
                              delete_file = YES;
#ifdef _DELETE_LOG
                              reason = DEL_OLD_LOCKED_FILE;
#endif
                           }
                           else
                           {
                              delete_file = NO;
                           }
                        }
                        else
                        {
                           if (de[i].flag & ALL_FILES)
                           {
                              delete_file = NO;
                           }
                           else
                           {
                              delete_file = YES;
#ifdef _DELETE_LOG
                              reason = DEL_UNKNOWN_FILE;
#endif
                              if (de[i].paused_dir == NULL)
                              {
                                 pmatch_time = current_time;
                              }
                              else
                              {
                                 pmatch_time = stat_buf.st_mtime;
                              }
                              for (j = 0; j < de[i].nfg; j++)
                              {
                                 for (k = 0; ((j < de[i].nfg) && (k < de[i].fme[j].nfm)); k++)
                                 {
                                    if ((ret = pmatch(de[i].fme[j].file_mask[k],
                                                      p_dir->d_name,
                                                      &pmatch_time)) == 0)
                                    {
                                       delete_file = NO;
                                       j = de[i].nfg;
                                    }
                                    else if (ret == 1)
                                         {
                                            break;
                                         }
                                 }
                              }
                           }
                        }
                        if (delete_file == YES)
                        {
                           if (unlink(tmp_dir) == -1)
                           {
                              system_log(WARN_SIGN, __FILE__, __LINE__,
                                         "Failed to unlink() %s : %s",
                                         tmp_dir, strerror(errno));
                           }
                           else
                           {
#ifdef _DELETE_LOG
                              size_t dl_real_size;

                              (void)strcpy(dl.file_name, p_dir->d_name);
                              (void)snprintf(dl.host_name,
                                             MAX_HOSTNAME_LENGTH + 4 + 1,
                                             "%-*s %03x",
                                             MAX_HOSTNAME_LENGTH, "-", reason);
                              *dl.file_size = stat_buf.st_size;
                              *dl.dir_id = de[i].dir_id;
                              *dl.job_id = 0;
                              *dl.input_time = 0L;
                              *dl.split_job_counter = 0;
                              *dl.unique_number = 0;
                              *dl.file_name_length = strlen(p_dir->d_name);
                              dl_real_size = *dl.file_name_length + dl.size +
                                             snprintf((dl.file_name + *dl.file_name_length + 1),
                                                      MAX_FILENAME_LENGTH + 1,
# if SIZEOF_TIME_T == 4
                                                      "%s%c>%ld (%s %d)",
# else
                                                      "%s%c>%lld (%s %d)",
# endif
                                                      DIR_CHECK, SEPARATOR_CHAR,
                                                      (pri_time_t)diff_time,
                                                      __FILE__, __LINE__);
                              if (write(dl.fd, dl.data, dl_real_size) != dl_real_size)
                              {
                                 system_log(ERROR_SIGN, __FILE__, __LINE__,
                                            "write() error : %s",
                                            strerror(errno));
                              }
#endif
                              file_counter++;
                              file_size += stat_buf.st_size;

                              if ((fra[de[i].fra_pos].delete_files_flag & UNKNOWN_FILES) == 0)
                              {
                                 junk_files++;
                              }
                           }
                        }
                        else if (fra[de[i].fra_pos].report_unknown_files == YES)
                             {
                                if ((fra[de[i].fra_pos].dir_flag & DIR_STOPPED) == 0)
                                {
                                   file_counter++;
                                   file_size += stat_buf.st_size;
                                }
                             }
                     }
                     else if (fra[de[i].fra_pos].report_unknown_files == YES)
                          {
                             if ((fra[de[i].fra_pos].dir_flag & DIR_STOPPED) == 0)
                             {
                                file_counter++;
                                file_size += stat_buf.st_size;
                             }
                             delete_file = NO;
                          }
                          else
                          {
                             delete_file = NO;
                          }
                  }
                  else
                  {
                     delete_file = NO;
                  }
                  if ((delete_file == NO) && (p_dir->d_name[0] != '.') &&
                      (fra[de[i].fra_pos].dir_flag & DIR_STOPPED) &&
                      (fra[de[i].fra_pos].delete_files_flag & QUEUED_FILES) &&
                      (diff_time > fra[de[i].fra_pos].queued_file_time))
                  {
                     if (unlink(tmp_dir) == -1)
                     {
                        system_log(WARN_SIGN, __FILE__, __LINE__,
                                   "Failed to unlink() %s : %s",
                                   tmp_dir, strerror(errno));
                     }
                     else
                     {
#ifdef _DELETE_LOG
                        size_t dl_real_size;

                        (void)strcpy(dl.file_name, p_dir->d_name);
                        (void)snprintf(dl.host_name,
                                       MAX_HOSTNAME_LENGTH + 4 + 1,
                                       "%-*s %03x",
                                       MAX_HOSTNAME_LENGTH, "-",
                                       DEL_QUEUED_FILE);
                        *dl.file_size = stat_buf.st_size;
                        *dl.dir_id = de[i].dir_id;
                        *dl.job_id = 0;
                        *dl.input_time = 0L;
                        *dl.split_job_counter = 0;
                        *dl.unique_number = 0;
                        *dl.file_name_length = strlen(p_dir->d_name);
                        dl_real_size = *dl.file_name_length + dl.size +
                                       snprintf((dl.file_name + *dl.file_name_length + 1),
                                                MAX_FILENAME_LENGTH + 1,
# if SIZEOF_TIME_T == 4
                                                "%s%c>%ld (%s %d)",
# else
                                                "%s%c>%lld (%s %d)",
# endif
                                                DIR_CHECK, SEPARATOR_CHAR,
                                                (pri_time_t)diff_time,
                                                __FILE__, __LINE__);
                        if (write(dl.fd, dl.data, dl_real_size) != dl_real_size)
                        {
                           system_log(ERROR_SIGN, __FILE__, __LINE__,
                                      "write() error : %s",
                                      strerror(errno));
                        }
#endif
                        queued_files++;
                        queued_size_deleted += stat_buf.st_size;
                     }
                  }
               }
                    /*
                     * Search queue directories for old files!
                     */
               else if ((fra[de[i].fra_pos].delete_files_flag & QUEUED_FILES) &&
                        (p_dir->d_name[0] == '.') &&
                        (S_ISDIR(stat_buf.st_mode)))
                    {
                       int pos;

                       if (((pos = get_host_position(fsa,
                                                     &p_dir->d_name[1],
                                                     no_of_hosts)) != INCORRECT) &&
                           ((fsa[pos].host_status & DO_NOT_DELETE_DATA) == 0))
                       {
                          DIR *dp_2;

                          if ((dp_2 = opendir(tmp_dir)) == NULL)
                          {
                             system_log(WARN_SIGN, __FILE__, __LINE__,
                                        "Can't access directory %s : %s",
                                        tmp_dir, strerror(errno));
                          }
                          else
                          {
                             int   files_deleted = 0;
                             off_t file_size_deleted = 0;
                             char  *work_ptr_2;

                             work_ptr_2 = tmp_dir + strlen(tmp_dir);
                             *work_ptr_2++ = '/';
                             *work_ptr_2 = '\0';

                             errno = 0;
                             while ((p_dir = readdir(dp_2)) != NULL)
                             {
                                /* Ignore "." and "..". */
                                if (p_dir->d_name[0] == '.')
                                {
                                   continue;
                                }

                                (void)strcpy(work_ptr_2, p_dir->d_name);
                                if (stat(tmp_dir, &stat_buf) < 0)
                                {
                                   /*
                                    * Since this is a very low priority function lets not
                                    * always report when we fail to stat() a file. Maybe the
                                    * the user wants to keep some files.
                                    */
                                   continue;
                                }

                                /* Sure it is a normal file? */
                                if (S_ISREG(stat_buf.st_mode))
                                {
                                   diff_time = current_time - stat_buf.st_mtime;
                                   if (diff_time < 0)
                                   {
                                      diff_time = 0;
                                   }
                                   if (diff_time > fra[de[i].fra_pos].queued_file_time)
                                   {
                                      if (unlink(tmp_dir) == -1)
                                      {
                                         system_log(WARN_SIGN, __FILE__, __LINE__,
                                                    "Failed to unlink() %s : %s",
                                                    tmp_dir, strerror(errno));
                                      }
                                      else
                                      {
#ifdef _DELETE_LOG
                                         size_t dl_real_size;

                                         (void)strcpy(dl.file_name, p_dir->d_name);
                                         (void)snprintf(dl.host_name,
                                                        MAX_HOSTNAME_LENGTH + 4 + 1,
                                                        "%-*s %03x",
                                                        MAX_HOSTNAME_LENGTH,
                                                        fsa[pos].host_alias,
                                                        DEL_QUEUED_FILE);
                                         *dl.file_size = stat_buf.st_size;
                                         *dl.dir_id = de[i].dir_id;
                                         *dl.job_id = 0;
                                         *dl.input_time = 0L;
                                         *dl.split_job_counter = 0;
                                         *dl.unique_number = 0;
                                         *dl.file_name_length = strlen(p_dir->d_name);
                                         dl_real_size = *dl.file_name_length + dl.size +
                                                        snprintf((dl.file_name + *dl.file_name_length + 1),
                                                                 MAX_FILENAME_LENGTH + 1,
# if SIZEOF_TIME_T == 4
                                                                 "%s%c>%ld (%s %d)",
# else
                                                                 "%s%c>%lld (%s %d)",
# endif
                                                                 DIR_CHECK,
                                                                 SEPARATOR_CHAR,
                                                                 (pri_time_t)diff_time,
                                                                 __FILE__, __LINE__);
                                         if (write(dl.fd, dl.data, dl_real_size) != dl_real_size)
                                         {
                                            system_log(ERROR_SIGN, __FILE__, __LINE__,
                                                       "write() error : %s",
                                                       strerror(errno));
                                         }
#endif
                                         files_deleted++;
                                         file_size_deleted += stat_buf.st_size;
                                      }
                                   }
                                }
                                errno = 0;
                             } /* while ((p_dir = readdir(dp_2)) != NULL) */

                             if (errno)
                             {
                                system_log(ERROR_SIGN, __FILE__, __LINE__,
                                           "Could not readdir() %s : %s",
                                           tmp_dir, strerror(errno));
                             }

                             if (files_deleted > 0)
                             {
                                queued_files += files_deleted;
                                queued_size_deleted += file_size_deleted;
                                ABS_REDUCE_QUEUE(de[i].fra_pos, files_deleted,
                                                 file_size_deleted);
                             }

                             /* Don't forget to close the directory. */
                             if (closedir(dp_2) < 0)
                             {
                                system_log(ERROR_SIGN, __FILE__, __LINE__,
                                           "Could not close directory %s : %s",
                                           tmp_dir, strerror(errno));
                             }
                          }
                       }
                    }
               errno = 0;
            }

            /*
             * NOTE: The ENOENT is when it catches a file that is just
             *       being renamed (lock DOT).
             */
            if ((errno) && (errno != ENOENT))
            {
               system_log(ERROR_SIGN, __FILE__, __LINE__,
                          "Could not readdir() %s : %s",
                          tmp_dir, strerror(errno));
            }

            /* Don't forget to close the directory. */
            if (closedir(dp) < 0)
            {
               system_log(ERROR_SIGN, __FILE__, __LINE__,
                          "Could not close directory %s : %s",
                          tmp_dir, strerror(errno));
            }

            /* Remove file name from directory name. */
            *(work_ptr - 1) = '\0';

            /* Tell user there are old files in this directory. */
            if (((file_counter - junk_files) > 0) &&
                (fra[de[i].fra_pos].report_unknown_files == YES) &&
                ((fra[de[i].fra_pos].delete_files_flag & UNKNOWN_FILES) == 0))
            {
               p_fra = &fra[de[i].fra_pos];
               if (file_size >= GIGABYTE)
               {
                  receive_log(WARN_SIGN, NULL, 0, current_time,
                              "There are %d (%d GiB) old (>%dh) files in %s. @%x",
                              file_counter - junk_files,
                              (int)(file_size / 1073741824),
                              fra[de[i].fra_pos].unknown_file_time / 3600,
                              tmp_dir, de[i].dir_id);
               }
               else if (file_size >= MEGABYTE)
                    {
                       receive_log(WARN_SIGN, NULL, 0, current_time,
                                   "There are %d (%d MiB) old (>%dh) files in %s. @%x",
                                   file_counter - junk_files,
                                   (int)(file_size / 1048576),
                                   fra[de[i].fra_pos].unknown_file_time / 3600,
                                   tmp_dir, de[i].dir_id);
                    }
               else if (file_size >= KILOBYTE)
                    {
                       receive_log(WARN_SIGN, NULL, 0, current_time,
                                   "There are %d (%d KiB) old (>%dh) files in %s. @%x",
                                   file_counter - junk_files, (int)(file_size / 1024),
                                   fra[de[i].fra_pos].unknown_file_time / 3600,
                                   tmp_dir, de[i].dir_id);
                    }
                    else
                    {
                       receive_log(WARN_SIGN, NULL, 0, current_time,
#if SIZEOF_OFF_T == 4
                                   "There are %d (%ld bytes) old (>%dh) files in %s. @%x",
#else
                                   "There are %d (%lld bytes) old (>%dh) files in %s. @%x",
#endif
                                   file_counter - junk_files,
                                   (pri_off_t)file_size,
                                   fra[de[i].fra_pos].unknown_file_time / 3600,
                                   tmp_dir, de[i].dir_id);
                    }
            }
            if (junk_files > 0)
            {
               p_fra = &fra[de[i].fra_pos];
               receive_log(DEBUG_SIGN, NULL, 0, current_time,
                           "Deleted %d file(s) (>%dh) that where of length 0 or had a leading dot, in %s. @%x",
                           junk_files,
                           fra[de[i].fra_pos].unknown_file_time / 3600,
                           tmp_dir, de[i].dir_id);
            }
            if (queued_files > 0)
            {
               p_fra = &fra[de[i].fra_pos];
               if (queued_size_deleted >= GIGABYTE)
               {
                  receive_log(DEBUG_SIGN, NULL, 0, current_time,
                              "Deleted %d (%d GiB) queued file(s), in %s. @%x",
                              queued_files,
                              (int)(queued_size_deleted / 1073741824),
                              tmp_dir, de[i].dir_id);
               }
               else if (queued_size_deleted >= MEGABYTE)
                    {
                       receive_log(DEBUG_SIGN, NULL, 0, current_time,
                                   "Deleted %d (%d MiB) queued file(s), in %s. @%x",
                                   queued_files,
                                   (int)(queued_size_deleted / 1048576),
                                   tmp_dir, de[i].dir_id);
                    }
               else if (queued_size_deleted >= KILOBYTE)
                    {
                       receive_log(DEBUG_SIGN, NULL, 0, current_time,
                                   "Deleted %d (%d KiB) queued file(s), in %s. @%x",
                                   queued_files,
                                   (int)(queued_size_deleted / 1024),
                                   tmp_dir, de[i].dir_id);
                    }
                    else
                    {
                       receive_log(DEBUG_SIGN, NULL, 0, current_time,
#if SIZEOF_OFF_T == 4
                                   "Deleted %d (%ld bytes) queued file(s), in %s. @%x",
#else
                                   "Deleted %d (%lld bytes) queued file(s), in %s. @%x",
#endif
                                   queued_files, (pri_off_t)queued_size_deleted,
                                   tmp_dir, de[i].dir_id);
                    }
            }
         }
      }
   }

   return;
}