2.4 KiB
ShadowMount socket API v1
ShadowMount exposes a public Unix stream socket at
/system_tmp/shadowmount-api.sock. The internal
/system_tmp/shadowmount.sock endpoint is reserved for the SceShellCore
bridge and must not be used by third-party applications.
The ABI is defined in include/sm_api_protocol.h. All integers use the native
PS5 little-endian byte order. A client opens one connection, writes exactly one
64-byte sm_api_request_t, reads one 32-byte sm_api_response_t followed by
the advertised payload, and closes the connection.
Validate magic, version, operation, size, item_count, and item_size
before consuming a response. status is zero on success or a positive errno
value. Strings are NUL-terminated fixed-size byte arrays.
Operations
SM_API_GET_VERSIONreturns onesm_api_version_info_t.SM_API_LIST_IMAGESreturnssm_api_image_info_tentries.offsetis the zero-based entry offset;limitis clamped to 16 and zero means 16.SM_API_LIST_GAMESuses the same pagination and returnssm_api_game_info_tentries.SM_API_MOUNT_GAMEmounts the managed runtime stack identified bytitle_id.SM_API_UNMOUNT_GAMEreleases that runtime stack and its backing image chain.
List responses contain the full current count in total_count and the current
page size in item_count. Continue with offset += item_count until the offset
reaches total_count.
Mount mutations are deliberately conservative. They return EBUSY while a
game is active, while ShellCore owns another prepared title, during suspend,
or while a conflicting mount/release is in progress. ENOENT means the title
does not have a ShadowMount mount.lnk tracker. Clients should not retry
EBUSY in a tight loop.
The socket is created only after startup synchronization completes and is removed before shutdown mount cleanup begins.
Test payload
Build api-test.elf and run it while ShadowMount is active. It validates the
version response, walks every image and game page, then selects the first
managed game that is not already mounted and performs a mount/unmount cycle.
The mutation test is skipped when no safe candidate exists or the runtime is
busy; an existing mounted game is never selected.
Clients should call SM_API_GET_VERSION first and check its capability bits.
Unknown operations return ENOTSUP, malformed requests return EPROTO, and a
future incompatible structure layout will increment SM_API_VERSION.