X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fsystem.c;h=f0b64615bed2ca5adabb6e0ad30e706579bbc97c;hb=7fb546943ef0bd07a1bc65164e6e752b9fa4126f;hp=58069cd771de6b48fcbfa318ce48d1eec554ff15;hpb=b085ca30976ec26256344bd3532205d440e69309;p=chaz%2Ftar diff --git a/src/system.c b/src/system.c index 58069cd..f0b6461 100644 --- a/src/system.c +++ b/src/system.c @@ -20,6 +20,44 @@ #include "common.h" #include "rmt.h" +#include + +void +sys_stat_nanoseconds(struct tar_stat_info *stat) +{ +#if defined(HAVE_STRUCT_STAT_ST_SPARE1) + stat->atime_nsec = stat->stat.st_spare1 * 1000; + stat->mtime_nsec = stat->stat.st_spare2 * 1000; + stat->ctime_nsec = stat->stat.st_spare3 * 1000; +#elif defined(HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC) + stat->atime_nsec = stat->stat.st_atim.tv_nsec; + stat->mtime_nsec = stat->stat.st_mtim.tv_nsec; + stat->ctime_nsec = stat->stat.st_ctim.tv_nsec; +#elif defined(HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC) + stat->atime_nsec = stat->stat.st_atimespec.tv_nsec; + stat->mtime_nsec = stat->stat.st_mtimespec.tv_nsec; + stat->ctime_nsec = stat->stat.st_ctimespec.tv_nsec; +#elif defined(HAVE_STRUCT_STAT_ST_ATIMENSEC) + stat->atime_nsec = stat->stat.st_atimensec; + stat->mtime_nsec = stat->stat.st_mtimensec; + stat->ctime_nsec = stat->stat.st_ctimensec; +#else + stat->atime_nsec = stat->mtime_nsec = stat->ctime_nsec = 0; +#endif +} + +int +sys_utimes(char *file_name, struct timeval tvp[3]) +{ +#ifdef HAVE_UTIMES + return utimes (file_name, tvp); +#else + struct utimbuf utimbuf; + utimbuf.actime = tvp[0].tv_sec; + utimbuf.modtime = tvp[1].tv_sec; + return utime (file_name, &utimbuf); +#endif +} #if MSDOS @@ -65,17 +103,26 @@ sys_spawn_shell () spawnl (P_WAIT, getenv ("COMSPEC"), "-", 0); } -void -sys_compare_uid_gid (struct stat *a, struct stat *b) +/* stat() in djgpp's C library gives a constant number of 42 as the + uid and gid of a file. So, comparing an FTP'ed archive just after + unpack would fail on MSDOS. */ + +bool +sys_compare_uid (struct stat *a, struct stat *b) { - /* stat() in djgpp's C library gives a constant number of 42 as the - uid and gid of a file. So, comparing an FTP'ed archive just after - unpack would fail on MSDOS. */ + return true; +} + +bool +sys_compare_gid (struct stat *a, struct stat *b) +{ + return true; } void sys_compare_links (struct stat *link_data, struct stat *stat_data) { + return true; } int @@ -214,7 +261,7 @@ sys_spawn_shell () child = xfork (); if (child == 0) { - execlp (shell, "-sh", "-i", 0); + execlp (shell, "-sh", "-i", (char *) 0); exec_fatal (shell); } else @@ -229,24 +276,23 @@ sys_spawn_shell () } } -void -sys_compare_uid_gid (struct stat *a, struct stat *b) +bool +sys_compare_uid (struct stat *a, struct stat *b) { - if (a->st_uid != b->st_uid) - report_difference (_("Uid differs")); - if (a->st_gid != b->st_gid) - report_difference (_("Gid differs")); + return a->st_uid == b->st_uid; } -void +bool +sys_compare_gid (struct stat *a, struct stat *b) +{ + return a->st_gid == b->st_gid; +} + +bool sys_compare_links (struct stat *link_data, struct stat *stat_data) { - if (stat_data->st_dev != link_data->st_dev - || stat_data->st_ino != link_data->st_ino) - { - report_difference (_("Not linked to %s"), - quote (current_stat_info.link_name)); - } + return stat_data->st_dev == link_data->st_dev + && stat_data->st_ino == link_data->st_ino; } int @@ -507,7 +553,7 @@ sys_child_open_for_uncompress (void) { /* The parent tar is still here! Just clean up. */ - read_full_records_option = 1; + read_full_records_option = true; archive = parent_pipe[PREAD]; xclose (parent_pipe[PWRITE]); return child_pid;