/[osn-commons]/trunk/uar/uar.c
ViewVC logotype

Diff of /trunk/uar/uar.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 32 by rakinar2, Wed Aug 7 18:57:45 2024 UTC revision 33 by rakinar2, Thu Aug 8 16:57:39 2024 UTC
# Line 37  struct uar_header Line 37  struct uar_header
37      uint64_t size;      uint64_t size;
38  } __attribute__ ((packed));  } __attribute__ ((packed));
39    
40    /* TODO: Fix alignment */
41  struct uar_file  struct uar_file
42  {  {
43      enum uar_file_type type;      enum uar_file_type type;
     int __pad1;  
44      char *name;      char *name;
45      uint64_t namelen;      uint64_t namelen;
46      uint64_t offset;      uint64_t offset;
# Line 55  struct uar_file Line 55  struct uar_file
55      } data;      } data;
56      mode_t mode;      mode_t mode;
57      time_t mtime;      time_t mtime;
58      int __pad2;      uid_t uid;
59        gid_t gid;
60  };  };
61    
62  struct uar_archive  struct uar_archive
# Line 69  struct uar_archive Line 70  struct uar_archive
70      FILE *stream;      FILE *stream;
71      int last_errno;      int last_errno;
72      char *err_file;      char *err_file;
73        uar_create_callback_t create_callback;
74  };  };
75    
76    void
77    uar_set_create_callback (struct uar_archive *uar,
78                             uar_create_callback_t callback)
79    {
80        uar->create_callback = callback;
81    }
82    
83  static void  static void
84  uar_set_error (struct uar_archive *uar, enum uar_error ecode,  uar_set_error (struct uar_archive *uar, enum uar_error ecode,
85                 const char *err_file)                 const char *err_file)
# Line 335  uar_stream_add_file (struct uar_archive Line 344  uar_stream_add_file (struct uar_archive
344              if (lstat (fs_filename, &custom_stinfo) != 0)              if (lstat (fs_filename, &custom_stinfo) != 0)
345                  {                  {
346                      uar_set_error (uar, UAR_SYSCALL_ERROR, fs_filename);                      uar_set_error (uar, UAR_SYSCALL_ERROR, fs_filename);
347                      perror ("uar_stream_add_file::lstat");  
348                        if (uar->create_callback != NULL)
349                            uar->create_callback (uar, NULL, uar_filename,
350                                                  fs_filename, UAR_ELEVEL_WARNING,
351                                                  strerror (errno));
352    
353                      return NULL;                      return NULL;
354                  }                  }
355              else              else
# Line 347  uar_stream_add_file (struct uar_archive Line 361  uar_stream_add_file (struct uar_archive
361      if (stream == NULL)      if (stream == NULL)
362          {          {
363              uar_set_error (uar, UAR_SYSCALL_ERROR, fs_filename);              uar_set_error (uar, UAR_SYSCALL_ERROR, fs_filename);
364              perror ("uar_stream_add_file::fopen");  
365                if (uar->create_callback != NULL)
366                    uar->create_callback (uar, NULL, uar_filename, fs_filename,
367                                          UAR_ELEVEL_WARNING, strerror (errno));
368    
369              return NULL;              return NULL;
370          }          }
371    
# Line 367  uar_stream_add_file (struct uar_archive Line 385  uar_stream_add_file (struct uar_archive
385      if (file == NULL)      if (file == NULL)
386          {          {
387              ecode = UAR_SYSCALL_ERROR;              ecode = UAR_SYSCALL_ERROR;
             perror ("uar_stream_add_file::uar_file_create");  
388              goto uar_stream_add_file_end;              goto uar_stream_add_file_end;
389          }          }
390    
# Line 379  uar_stream_add_file (struct uar_archive Line 396  uar_stream_add_file (struct uar_archive
396    
397      if (!uar_add_file_entry (uar, file))      if (!uar_add_file_entry (uar, file))
398          {          {
             perror ("uar_stream_add_file::uar_add_file_entry");  
399              uar_file_destroy (file);              uar_file_destroy (file);
400              fclose (stream);              fclose (stream);
401              return NULL;              return NULL;
# Line 405  uar_stream_add_file (struct uar_archive Line 421  uar_stream_add_file (struct uar_archive
421              goto uar_stream_add_file_end;              goto uar_stream_add_file_end;
422          }          }
423    
424        if (ecode == UAR_SUCCESS && uar->create_callback != NULL)
425            {
426                uar->create_callback (uar, file, uar_filename, fs_filename,
427                                      UAR_ELEVEL_NONE, NULL);
428            }
429    
430  uar_stream_add_file_end:  uar_stream_add_file_end:
431      if (ecode != UAR_SUCCESS && file != NULL)      if (ecode != UAR_SUCCESS && file != NULL)
432          uar_file_destroy (file);          uar_file_destroy (file);
# Line 419  uar_stream_add_file_end: Line 441  uar_stream_add_file_end:
441    
442  struct uar_file *  struct uar_file *
443  uar_stream_add_dir (struct uar_archive *uar, const char *uar_dirname,  uar_stream_add_dir (struct uar_archive *uar, const char *uar_dirname,
444                      const char *fs_dirname, struct stat *stinfo,                      const char *fs_dirname, struct stat *stinfo)
                     uar_callback_t callback)  
445  {  {
446      struct stat custom_stinfo = { 0 };      struct stat custom_stinfo = { 0 };
447      enum uar_error ecode = UAR_SUCCESS;      enum uar_error ecode = UAR_SUCCESS;
# Line 433  uar_stream_add_dir (struct uar_archive * Line 454  uar_stream_add_dir (struct uar_archive *
454              if (lstat (fs_dirname, &custom_stinfo) != 0)              if (lstat (fs_dirname, &custom_stinfo) != 0)
455                  {                  {
456                      uar_set_error (uar, UAR_SYSCALL_ERROR, fs_dirname);                      uar_set_error (uar, UAR_SYSCALL_ERROR, fs_dirname);
457    
458                        if (uar->create_callback != NULL)
459                            uar->create_callback (uar, NULL, uar_dirname,
460                                                  fs_dirname, UAR_ELEVEL_WARNING,
461                                                  strerror (errno));
462    
463                      return NULL;                      return NULL;
464                  }                  }
465              else              else
# Line 457  uar_stream_add_dir (struct uar_archive * Line 484  uar_stream_add_dir (struct uar_archive *
484              goto uar_stream_add_dir_error;              goto uar_stream_add_dir_error;
485          }          }
486    
     if (!callback (uar, file, uar_dirname, fs_dirname))  
         {  
             ecode = UAR_SUCCESS;  
             goto uar_stream_add_dir_error;  
         }  
   
487      dir = opendir (fs_dirname);      dir = opendir (fs_dirname);
488    
489      if (dir == NULL)      if (dir == NULL)
490          {          {
491                if (uar->create_callback != NULL)
492                    uar->create_callback (uar, NULL, uar_dirname, fs_dirname,
493                                          UAR_ELEVEL_WARNING, strerror (errno));
494    
495              ecode = UAR_SYSCALL_ERROR;              ecode = UAR_SYSCALL_ERROR;
496              goto uar_stream_add_dir_error;              goto uar_stream_add_dir_error;
497          }          }
# Line 485  uar_stream_add_dir (struct uar_archive * Line 510  uar_stream_add_dir (struct uar_archive *
510              char *uar_fullpath = path_concat (uar_dirname, entry->d_name,              char *uar_fullpath = path_concat (uar_dirname, entry->d_name,
511                                                strlen (uar_dirname), dname_len);                                                strlen (uar_dirname), dname_len);
512    
513              struct uar_file *entry_file = uar_stream_add_entry (              struct uar_file *entry_file
514                  uar, uar_fullpath, fs_fullpath, NULL, callback);                  = uar_stream_add_entry (uar, uar_fullpath, fs_fullpath, NULL);
515    
516              if (entry_file == NULL)              if (entry_file != NULL)
517                  {                  size += entry_file->data.size;
                     ecode = UAR_SYSCALL_ERROR;  
                     goto uar_stream_add_dir_ret;  
                 }  
518    
             size += entry_file->data.size;  
519              free (fs_fullpath);              free (fs_fullpath);
520              free (uar_fullpath);              free (uar_fullpath);
521          }          }
522    
523      file->data.size = size;      file->data.size = size;
524    
525        if (ecode == UAR_SUCCESS && uar->create_callback != NULL)
526            {
527                uar->create_callback (uar, file, uar_dirname, fs_dirname,
528                                      UAR_ELEVEL_NONE, NULL);
529            }
530    
531        goto uar_stream_add_dir_ret;
532  uar_stream_add_dir_error:  uar_stream_add_dir_error:
533      uar_set_error (uar, ecode, fs_dirname);      uar_set_error (uar, ecode, fs_dirname);
534  uar_stream_add_dir_ret:  uar_stream_add_dir_ret:
# Line 525  uar_stream_add_link (struct uar_archive Line 553  uar_stream_add_link (struct uar_archive
553              if (lstat (fs_name, &custom_stinfo) != 0)              if (lstat (fs_name, &custom_stinfo) != 0)
554                  {                  {
555                      uar_set_error (uar, UAR_SYSCALL_ERROR, fs_name);                      uar_set_error (uar, UAR_SYSCALL_ERROR, fs_name);
556    
557                        if (uar->create_callback != NULL)
558                            uar->create_callback (uar, NULL, uar_name, fs_name,
559                                                  UAR_ELEVEL_WARNING,
560                                                  strerror (errno));
561    
562                      return NULL;                      return NULL;
563                  }                  }
564              else              else
# Line 551  uar_stream_add_link (struct uar_archive Line 585  uar_stream_add_link (struct uar_archive
585          {          {
586              uar_set_error (uar, UAR_SYSCALL_ERROR, fs_name);              uar_set_error (uar, UAR_SYSCALL_ERROR, fs_name);
587              uar_file_destroy (file);              uar_file_destroy (file);
588    
589                if (uar->create_callback != NULL)
590                    uar->create_callback (uar, NULL, uar_name, fs_name,
591                                          UAR_ELEVEL_WARNING, strerror (errno));
592    
593              return NULL;              return NULL;
594          }          }
595    
# Line 573  uar_stream_add_link (struct uar_archive Line 612  uar_stream_add_link (struct uar_archive
612              return NULL;              return NULL;
613          }          }
614    
615        if (uar->create_callback != NULL && file != NULL)
616            uar->create_callback (uar, file, uar_name, fs_name, UAR_ELEVEL_NONE,
617                                  NULL);
618    
619      return file;      return file;
620  }  }
621    
622  struct uar_file *  struct uar_file *
623  uar_stream_add_entry (struct uar_archive *uar, const char *uar_name,  uar_stream_add_entry (struct uar_archive *uar, const char *uar_name,
624                        const char *fs_name, struct stat *stinfo,                        const char *fs_name, struct stat *stinfo)
                       uar_callback_t callback)  
625  {  {
626      assert (uar != NULL && "uar is NULL");      assert (uar != NULL && "uar is NULL");
627      assert (uar->is_stream && "uar is not in stream mode");      assert (uar->is_stream && "uar is not in stream mode");
# Line 608  uar_stream_add_entry (struct uar_archive Line 650  uar_stream_add_entry (struct uar_archive
650                  {                  {
651                      return NULL;                      return NULL;
652                  }                  }
   
             if (!callback (uar, file, uar_name, fs_name))  
                 {  
                     uar_set_error (uar, UAR_SUCCESS, fs_name);  
                     return NULL;  
                 }  
653          }          }
654      else if (S_ISDIR (stinfo->st_mode))      else if (S_ISDIR (stinfo->st_mode))
655          {          {
656              file              file = uar_stream_add_dir (uar, uar_name, fs_name, stinfo);
                 = uar_stream_add_dir (uar, uar_name, fs_name, stinfo, callback);  
657          }          }
658      else      else
659          {          {
660              file = uar_stream_add_link (uar, uar_name, fs_name, stinfo);              file = uar_stream_add_link (uar, uar_name, fs_name, stinfo);
661          }          }
662    
663        if (file != NULL)
664            {
665                file->mode = stinfo->st_mode;
666                file->mtime = stinfo->st_mtime;
667                file->uid = stinfo->st_uid;
668                file->gid = stinfo->st_gid;
669            }
670    
671      return file;      return file;
672  }  }
673    
# Line 837  uar_file_create (const char *name, uint6 Line 880  uar_file_create (const char *name, uint6
880      file->type = UF_FILE;      file->type = UF_FILE;
881      file->mode = 0644;      file->mode = 0644;
882      file->mtime = 0;      file->mtime = 0;
883        file->uid = 0;
884        file->gid = 0;
885      file->name = malloc (namelen + 1);      file->name = malloc (namelen + 1);
886    
887      if (file->name == NULL)      if (file->name == NULL)

Legend:
Removed from v.32  
changed lines
  Added in v.33

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26