netatalk: afpcmd_spotlight.c File Reference

netatalk 4.5.1
Free and Open Source Apple Filing Protocol (AFP) Server
Loading...
Searching...
No Matches
afpcmd_spotlight.c File Reference
`#include <stdio.h>`
`#include <stdint.h>`
`#include <string.h>`
`#include "afpcmd.h"`
`#include "afpclient.h"`
`#include <talloc.h>`
`#include <atalk/afp.h>`
`#include <atalk/spotlight.h>`
`#include <atalk/dalloc.h>`

## Macros
#define | SL_PACK_BUFLEN 65472
#define | TEST_SQ_TYPE_INT64 0x8400
#define | TEST_SQ_TYPE_TOC 0x8800

## Functions
static uint64_t | spotlight_test_pack_tag (uint16_t type, uint16_t size_or_count, uint32_t val)
static uint32_t | spotlight_test_get_le32 (const char *buf, size_t offset)
static void | spotlight_test_put_le32 (uint8_t *buf, size_t offset, uint32_t val)
static void | spotlight_test_put_le64 (uint8_t *buf, size_t offset, uint64_t val)
static int | spotlight_pack_fetch_properties_rpc (char *rpcbuf)
static unsigned int | spotlight_send (CONN *conn, uint16_t vid, uint32_t subcmd, const uint8_t *rpc_buf, size_t rpc_len)
| Wrap an AFP_SPOTLIGHT_PRIVATE request and ship it on the DSI.
unsigned int | FPSpotlightFetchPropertiesWithShrunkTOC (CONN *conn, uint16_t vid)
| Send an otherwise-valid fetchPropertiesForContext: request whose TOC tag claims no usable complex-object entries.
unsigned int | FPSpotlightFetchPropertiesWithLargeTOCIndex (CONN *conn, uint16_t vid)
| Send a valid fetchPropertiesForContext: request whose first complex tag references a far out-of-range TOC index.
unsigned int | FPSpotlightRPCWithLargeInt64Count (CONN *conn, uint16_t vid)
| Send the companion advisory PoC: one INT64 tag claiming a huge count.
unsigned int | FPSpotlightOpen (CONN *conn, uint16_t vid, char *vol_path_out, size_t vol_path_buflen)
| Send SPOTLIGHT_CMD_OPEN and optionally extract the volume path.
unsigned int | FPSpotlightOpenQuery (CONN *conn, uint16_t vid, const char *query_dsl, uint64_t ctx)
| Build and send an openQueryWithParams:forContext: Spotlight RPC.
unsigned int | FPSpotlightDrainResults (CONN *conn, uint16_t vid, uint64_t ctx, int *total_results_out)
| Drain Spotlight query results until the server reports complete.
unsigned int | FPSpotlightCloseQuery (CONN *conn, uint16_t vid, uint64_t ctx)
| Send a closeQueryForContext: Spotlight RPC for the given context.

## Variables
int | Quiet

## Macro Definition Documentation

## ◆ SL_PACK_BUFLEN

#define SL_PACK_BUFLEN 65472

## ◆ TEST_SQ_TYPE_INT64

#define TEST_SQ_TYPE_INT64 0x8400

## ◆ TEST_SQ_TYPE_TOC

#define TEST_SQ_TYPE_TOC 0x8800

## Function Documentation

## ◆ FPSpotlightCloseQuery()

unsigned int FPSpotlightCloseQuery | ( | CONN * | conn,
|  | uint16_t | vid,
|  | uint64_t | ctx )

Send a closeQueryForContext: Spotlight RPC for the given context.

## ◆ FPSpotlightDrainResults()

unsigned int FPSpotlightDrainResults | ( | CONN * | conn,
|  | uint16_t | vid,
|  | uint64_t | ctx,
|  | int * | total_results_out )

Drain Spotlight query results until the server reports complete.

Loops fetchQueryResultsForContext: until the embedded status field is 0 (search complete) or the loop guard expires. Sums the kMDQueryResultIndices array length from each reply.

The SPOTLIGHT_CMD_RPC reply envelope has 4 leading bytes before the marshalled DALLOC_CTX (matches the server's sl_pack(reply, rbuf+4)).

## ◆ FPSpotlightFetchPropertiesWithLargeTOCIndex()

unsigned int FPSpotlightFetchPropertiesWithLargeTOCIndex | ( | CONN * | conn,
|  | uint16_t | vid )

Send a valid fetchPropertiesForContext: request whose first complex tag references a far out-of-range TOC index.

## ◆ FPSpotlightFetchPropertiesWithShrunkTOC()

unsigned int FPSpotlightFetchPropertiesWithShrunkTOC | ( | CONN * | conn,
|  | uint16_t | vid )

Send an otherwise-valid fetchPropertiesForContext: request whose TOC tag claims no usable complex-object entries.

## ◆ FPSpotlightOpen()

unsigned int FPSpotlightOpen | ( | CONN * | conn,
|  | uint16_t | vid,
|  | char * | vol_path_out,
|  | size_t | vol_path_buflen )

Send SPOTLIGHT_CMD_OPEN and optionally extract the volume path.

On success the reply layout is vid (4) + zero (4) + NUL-terminated path starting at dsi->data + 8; if `vol_path_out` is non-NULL the path is copied via strlcpy bounded by `vol_path_buflen`.

## ◆ FPSpotlightOpenQuery()

unsigned int FPSpotlightOpenQuery | ( | CONN * | conn,
|  | uint16_t | vid,
|  | const char * | query_dsl,
|  | uint64_t | ctx )

Build and send an openQueryWithParams:forContext: Spotlight RPC.

Mirrors sl_rpc_openQuery's expectations exactly. The outer DALLOC_CTX holds one sl_array_t (outer_array) with two children: [0] args : sl_array_t with three elements [0] = "openQueryWithParams:forContext:" (char *) [1] = ctx1 (uint64_t) [2] = ctx2 (uint64_t) [1] params : sl_dict_t — key/value pairs (kMDQueryString → DSL, kMDAttributeArray → sl_array_t, kMDScopeArray → char *)

Stack-local scalars use dalloc_add_copy so the value is memcpy'd into a freshly-talloc'd chunk; dalloc_add only captures a pointer.

Both ctx values are needed because sl_rpc_openQuery dereferences both via dalloc_get(query, "DALLOC_CTX", 0, "DALLOC_CTX", 0, "uint64_t", 1) and "uint64_t", 2.

## ◆ FPSpotlightRPCWithLargeInt64Count()

unsigned int FPSpotlightRPCWithLargeInt64Count | ( | CONN * | conn,
|  | uint16_t | vid )

Send the companion advisory PoC: one INT64 tag claiming a huge count.

## ◆ spotlight_pack_fetch_properties_rpc()

int spotlight_pack_fetch_properties_rpc | ( | char * | rpcbuf | ) |
| static

## ◆ spotlight_send()

unsigned int spotlight_send | ( | CONN * | conn,
|  | uint16_t | vid,
|  | uint32_t | subcmd,
|  | const uint8_t * | rpc_buf,
|  | size_t | rpc_len )
| static

Wrap an AFP_SPOTLIGHT_PRIVATE request and ship it on the DSI.

Builds the 24-byte SPOTLIGHT_PRIVATE envelope (cmd byte, vid, reserved, subcmd, reserved, padding) and appends `rpc_buf`, then sends and receives the reply via the existing my_dsi_* helpers.

## ◆ spotlight_test_get_le32()

uint32_t spotlight_test_get_le32 | ( | const char * | buf,
|  | size_t | offset )
| static

## ◆ spotlight_test_pack_tag()

uint64_t spotlight_test_pack_tag | ( | uint16_t | type,
|  | uint16_t | size_or_count,
|  | uint32_t | val )
| static

## ◆ spotlight_test_put_le32()

void spotlight_test_put_le32 | ( | uint8_t * | buf,
|  | size_t | offset,
|  | uint32_t | val )
| static

## ◆ spotlight_test_put_le64()

void spotlight_test_put_le64 | ( | uint8_t * | buf,
|  | size_t | offset,
|  | uint64_t | val )
| static

## Variable Documentation

## ◆ Quiet

int Quiet
| extern