1 unstable release
0.1.0 | Jun 9, 2021 |
---|
#10 in #sony
31KB
662 lines
pupper
A Sony PlayStation 3 PUP (PlayStation Update Package) implementation.
Overview
The PS3 receives software updates in a file format called 'PUP'. These packages are essentially 'flat' file systems: they contain individual files, or 'segments', but lack any hierarchical structure.
This crate facilitates the creation and (de)serialization of PUPs.
See Also
lib.rs
:
A Sony PlayStation 3 PUP (PlayStation Update Package) implementation.
Overview
The PS3 receives software updates in a file format called 'PUP'. These packages are essentially 'flat' file systems: they contain individual files, or 'segments', but lack any hierarchical structure.
This crate facilitates the creation and (de)serialization of PUPs.
Examples
Let's first create a new [Pup
] and assign it an image version:
use pupper::{Pup, Segment};
let segments = Vec::<Segment>::new();
let image_version: u64 = 0xAAAA_BBBB;
let pup = Pup::new(segments.clone(), image_version);
assert_eq!(segments, pup.segments);
assert_eq!(image_version, pup.image_version);
As you can see, [Pup
] is, for most intents and purposes, a POD type. Pup::image_version
is a public [u64
], and Pup::segments
is transparently a Vec<Segment>
.
Let's now create a segment and add it to the [Pup
] we previously created:
use pupper::SegmentId;
#
let id = SegmentId(0x100);
let data = std::fs::read("foo.txt").unwrap();
let segment = Segment::new(id, data.clone());
// Segment is (mostly) a POD type, too!
assert_eq!(id, segment.id);
assert_eq!(data, segment.data);
pup.segments.push(segment.clone());
assert_eq!(segment, pup.segments[0]);
Finally, let's serialize the entire [Pup
]. Afterwards, we'll deserialize it to confirm the
conversions were lossless:
use pupper::Pup;
use std::convert::TryFrom as _;
#
// Serialize the PUP.
let data = Vec::<u8>::from(&pup);
// Deserialize the PUP.
assert_eq!(Ok(pup), Pup::try_from(data.as_slice()));
Dependencies
~1.5MB
~24K SLoC