Source code for pcapkit.protocols.misc.pcap.header

# -*- coding: utf-8 -*-
"""Global Header
===================

.. module:: pcapkit.protocols.misc.pcap.header

:mod:`pcapkit.protocols.misc.pcap.header` contains
:class:`~pcapkit.protocols.misc.pcap.header.Header` only,
which implements an extractor for global headers [*]_
of PCAP, whose structure is described as below:

.. code-block:: c

    typedef struct pcap_hdr_s {
        guint32 magic_number;   /* magic number */
        guint16 version_major;  /* major version number */
        guint16 version_minor;  /* minor version number */
        gint32  thiszone;       /* GMT to local correction */
        guint32 sigfigs;        /* accuracy of timestamps */
        guint32 snaplen;        /* max length of captured packets, in octets */
        guint32 network;        /* data link type */
    } pcap_hdr_t;

.. [*] https://wiki.wireshark.org/Development/LibpcapFileFormat#Global_Header

.. versionchanged:: 1.5.0

   A global header cut short rebuilds as captured, where it rebuilt at full
   width (:issue:`1470`).

"""
import io
import operator
import sys
from typing import TYPE_CHECKING, overload

from pcapkit.const.reg.linktype import LinkType as Enum_LinkType
from pcapkit.corekit.version import VersionInfo
from pcapkit.protocols.data.misc.pcap.header import Header as Data_Header
from pcapkit.protocols.data.misc.pcap.header import MagicNumber as Data_MagicNumber
from pcapkit.protocols.protocol import ProtocolBase
from pcapkit.protocols.schema.misc.pcap.header import GLOBAL_HEADER_LEN, MAGIC_NUMBER
from pcapkit.protocols.schema.misc.pcap.header import Header as Schema_Header
from pcapkit.protocols.schema.schema import keep_short_read, replay_short_read
from pcapkit.utilities.exceptions import EndianError, FileError, UnsupportedCall

if TYPE_CHECKING:
    from enum import IntEnum as StdlibEnum
    from typing import IO, Any, NoReturn, Optional, Type

    from aenum import IntEnum as AenumEnum
    from typing_extensions import Literal, Self

__all__ = ['Header']

#: The PCAP magic number for each byte order and nanosecond flag, the reverse of
#: :data:`~pcapkit.protocols.schema.misc.pcap.header.MAGIC_NUMBER`, so that
#: :meth:`Header._make_magic` looks one up rather than searching for it -- an
#: undeclared pair raises :exc:`KeyError`.
_DECLARED_MAGIC = {declared: magic for magic, declared in MAGIC_NUMBER.items()}