Skip to content

Commit 98028f0

Browse files
committed
fixed mode setting for mknods from cmdline, moved inode logic to the archive class
Signed-off-by: Zen <[email protected]>
1 parent f2bb24e commit 98028f0

File tree

4 files changed

+18
-11
lines changed

4 files changed

+18
-11
lines changed

src/pycpio/cpio/archive.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@ class CPIOArchive(dict):
1414
def __setitem__(self, name, value):
1515
if name in self:
1616
raise AttributeError("Entry already exists: %s" % name)
17+
if value.header.ino in self.inodes:
18+
from .common import get_new_inode
19+
self.logger.debug("Inode already exists: %s", value.header.ino)
20+
value.header.ino = get_new_inode(self.inodes)
21+
self.logger.debug("New inode: %s", value.header.ino)
1722
super().__setitem__(name, value)
23+
self.inodes.add(value.header.ino)
1824

1925
def __contains__(self, name):
2026
""" Check if an entry exists in the archive """
@@ -23,6 +29,7 @@ def __contains__(self, name):
2329
def __init__(self, structure=HEADER_NEW, *args, **kwargs):
2430
super().__init__(*args, **kwargs)
2531
self.structure = structure
32+
self.inodes = set()
2633

2734
def pop(self, name):
2835
""" Remove an entry from the archive """

src/pycpio/cpio/data.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ def from_dir(path: Path, parent=None, relative=None, *args, **kwargs):
3535

3636
data = []
3737
data.append(CPIOData.from_path(path=path, relative=relative, *args, **kwargs))
38-
if logger := kwargs.get('logger'):
39-
logger.warning(data[0])
4038
for child in path.iterdir():
4139
if parent:
4240
child_path = parent / child

src/pycpio/pycpio.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ def add_symlink(self, name: str, target: str):
4444
""" Adds a symlink to the CPIO archive. """
4545
self._build_cpio_entry(name=name, entry_type=CPIOModes['Symlink'].value, data=target)
4646

47-
def add_chardev(self, name: str, major: int, minor: int):
47+
def add_chardev(self, name: str, major: int, minor: int, *args, **kwargs):
4848
""" Adds a character device to the CPIO archive. """
49-
self._build_cpio_entry(name=name, entry_type=CPIOModes['CharDev'].value, rdevmajor=major, rdevminor=minor)
49+
self._build_cpio_entry(name=name, entry_type=CPIOModes['CharDev'].value, rdevmajor=major, rdevminor=minor, *args, **kwargs)
5050

5151
def read_cpio_file(self, file_path: Path):
5252
""" Creates a CPIOReader object and reads the file. """
@@ -64,12 +64,16 @@ def list_files(self):
6464
""" Returns a list of files in the CPIO archive. """
6565
return '\n'.join([name for name in self.entries.keys()])
6666

67-
def _build_cpio_entry(self, name: str, entry_type: CPIOModes, data=None, **kwargs):
67+
def _build_cpio_entry(self, name: str, entry_type: CPIOModes, data=None, *args, **kwargs):
6868
""" Creates a CPIOData object and adds it to the CPIO archive. """
69+
overrides = self.overrides.copy()
70+
if mode := kwargs.pop('mode', None):
71+
overrides['mode'] = mode
72+
self.logger.info("Setting override: mode=%s" % mode)
6973
kwargs = {'name': name, 'structure': self.structure, 'mode': entry_type, 'data': data,
70-
'overrides': self.overrides, 'logger': self.logger, '_log_init': False, **kwargs}
74+
'overrides': overrides, 'logger': self.logger, '_log_init': False, **kwargs}
7175

72-
self.entries.add_entry(CPIOData.create_entry(**kwargs))
76+
self.entries.add_entry(CPIOData.create_entry(*args, **kwargs))
7377

7478
def __str__(self):
7579
return "\n".join([str(f) for f in self.entries.values()])

src/pycpio/writer/writer.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
from zenlib.logging import loggify
33

4-
from pycpio.cpio import pad_cpio, get_new_inode
4+
from pycpio.cpio import pad_cpio
55
from pycpio.header import CPIOHeader, HEADER_NEW
66

77
from pathlib import Path
@@ -33,9 +33,7 @@ def write(self):
3333
# That class manages the CPIOData objects, as well as duplicate detection
3434
# If data is passed to the writer, it should try to write it
3535
if entry.header.ino in inodes:
36-
self.logger.warning(f"Duplicate inode: {entry.header.ino}")
37-
entry.header.ino = get_new_inode(inodes)
38-
self.logger.info(f"New inode: {entry.header.ino}")
36+
raise ValueError(f"Duplicate inode: {entry.header.ino}")
3937
inodes.add(entry.header.ino)
4038

4139
entry_bytes = bytes(entry)

0 commit comments

Comments
 (0)