*.tar архив, поле mtime структуры posix_header, как его получить?

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
жучара
Сообщения: 1035
ОС: астралинукс

*.tar архив, поле mtime структуры posix_header, как его получить?

Сообщение жучара »

Друзья! Продолжаю ковыряться с таром. Так уж устроен tar-архив что в нём по нулевому смещению (и не только по нулевому, но мы возьмём самое начало файла для простоты) есть структура posix_header, описывающая один какой-нибудь сархивированный файл (в нашем случае вообще один файл, ибо архивировать будем только один файл) а в ней поле mtime, суть char mtime[12] которое означает:
The mtime field represents the data modification time of the file at the time it was archived. It represents the integer number of seconds since January 1, 1970, 00:00 Coordinated Universal Time.
...
All other fields are zero-filled octal numbers in ASCII. Each numeric field of width w contains w minus 1 digits, and a null.
Сархивируем что-нибудь и посмотрим на это поле:

Дату посмотрим сперва:

Shell

$ date
Пт 29 ноя 2024 10:30:58 +05
$
Поехали:

Shell

$ touch foo
$ tar --create --file=_0.tar foo
$
$ hexdump --skip 136 -n 12 -v -e '"%_p"' _0.tar
14722250636.$
$
По последней команде: поле mtime лежит в файле _0.tar по смещению 136 и имеет длину 12. Вот мы его и получили. Точка это нулевой символ, а всё остальное до неё это собственно дата. Ну и переведём в человеческий вид:

Shell

$ date -d @14722250636
Сб 12 июл 2436 15:03:56 +05
$
Занавес.

=========================================================

Если как-то присобачить, что ли, строку 14722250636 к Си , то получим:

Код: Выделить всё

#include <stdio.h>
#include <time.h>

int main ()
{
	
    time_t lt = atoi ("14722250636")  ;
	printf(ctime(&lt));
	
	return 0;
}

Shell

$ ./a.out
Wed Mar 22 19:39:08 2028
$
Час от часу не легче. Так как же на самом деле получить поле mtime структуры posix_header? Спасибо, кто откликнется. Debian 12.
Я просто читаю маны.
Спасибо сказали:
IMB
Сообщения: 2565
ОС: Debian

Re: *.tar архив, поле mtime структуры posix_header, как его получить?

Сообщение IMB »

пример реализации https://git.busybox.net/busybox/tree/archival/tar.c#n287 , скачайте исходники и изучите

для хостового tar реализация может отличаться, рекомендация идентичная
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1035
ОС: астралинукс

Re: *.tar архив, поле mtime структуры posix_header, как его получить?

Сообщение жучара »

IMB писал(а):
29.11.2024 11:41
пример реализации https://git.busybox.net/busybox/tree/archival/tar.c#n287 , скачайте исходники и изучите

для хостового tar реализация может отличаться, рекомендация идентичная
Но тогда уж лучше смотреть канонический tar. Просто задача сложна для меня и потому не пришла в голову. Тем более, что неправильность поля налицо (с этим же надеюсь, не будете спорить?). Смотреть как tar разбирается с неправильным полем... Впрочем, попытаюсь. Вопрос всё равно открыт, может, кто из ребят что ответит, пока я ковыряюсь с таром (не уверен, что справлюсь достаточно быстро).
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20999
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: *.tar архив, поле mtime структуры posix_header, как его получить?

Сообщение Bizdelnick »

The mtime field shall be the modification time of the file at the time it was archived. It is the ISO/IEC 646:1991 standard representation of the octal value of the modification time obtained from the stat() function.
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_13_06
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: