#include <errno.h>#include <fcntl.h>#include <inttypes.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/param.h>#include <sys/socket.h>#include <unistd.h>#include <bstrlib.h>#include <atalk/adouble.h>#include <atalk/afp.h>#include <atalk/asp.h>#include <atalk/cnid.h>#include <atalk/dsi.h>#include <atalk/globals.h>#include <atalk/logger.h>#include <atalk/netatalk_conf.h>#include <atalk/util.h>#include "ad_cache.h"#include "dircache.h"#include "desktop.h"#include "directory.h"#include "file.h"#include "fork.h"#include "virtual_icon.h"#include "volume.h"Macros | |
| #define | ENDBIT(a) |
| #define | UNLOCKBIT(a) |
Functions | |
| static int | materialize_virtual_icon (struct ofork *ofork) |
| Materialize a virtual Icon fork into a real file on disk. | |
| static int | getforkparams (const AFPObj *obj, struct ofork *ofork, uint16_t bitmap, char *buf, size_t *buflen) |
| static off_t | get_off_t (char **ibuf, int is64) |
| static int | set_off_t (off_t offset, char *rbuf, int is64) |
| static int | is_neg (int is64, off_t val) |
| static int | sum_neg (int is64, off_t offset, off_t reqcount) |
| static int | fork_setmode (const AFPObj *obj, struct adouble *adp, int eid, int access, int ofrefnum) |
| int | afp_openfork (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| static void | rfork_invalidate_for_ofork (const struct vol *vol, struct ofork *ofork) |
| Invalidate cached rfork data for a file identified by its open fork. | |
| int | afp_setforkparams (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| static int | byte_lock (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen, int is64) |
| int | afp_bytelock (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| int | afp_bytelock_ext (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| static int | read_file (const struct ofork *ofork, int eid, off_t offset, char *rbuf, size_t *rbuflen) |
| Read *rbuflen bytes from fork at offset. | |
| static int | rfork_cache_serve_from_buf (DSI *dsi, struct dir *cached_entry, char *ibuf, off_t offset, off_t reqcount, int err, size_t *rbuflen) |
| Serve resource fork data from Tier 2 cache via DSI framing. | |
| static int | read_fork (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen, int is64) |
| int | afp_read (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| int | afp_read_ext (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| int | afp_flush (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| int | afp_flushfork (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| int | afp_syncfork (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| int | flushfork (struct ofork *ofork) |
| int | afp_closefork (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| static ssize_t | write_file (struct ofork *ofork, int eid, off_t offset, char *rbuf, size_t rbuflen) |
| static int | write_fork (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen, int is64) |
| int | afp_write (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| int | afp_write_ext (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| int | afp_getforkparams (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen) |
| #define ENDBIT | ( | a | ) |
| #define UNLOCKBIT | ( | a | ) |
| int afp_bytelock | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
| int afp_bytelock_ext | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
| int afp_closefork | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
| int afp_flush | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
| int afp_flushfork | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
| int afp_getforkparams | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
| int afp_openfork | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
| int afp_read | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
| int afp_read_ext | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
| int afp_setforkparams | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
| int afp_syncfork | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
| int afp_write | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
| int afp_write_ext | ( | AFPObj * | obj, |
| char * | ibuf, | ||
| size_t | ibuflen, | ||
| char * | rbuf, | ||
| size_t * | rbuflen ) |
|
static |
| int flushfork | ( | struct ofork * | ofork | ) |
|
static |
|
static |
|
static |
|
static |
|
static |
Materialize a virtual Icon fork into a real file on disk.
Creates the physical Icon file, seeds its resource fork with the virtual icon data, sets FinderInfo, and re-opens the fork through ad_open so the ofork has real file descriptors for writing.
|
static |
Read *rbuflen bytes from fork at offset.
| [in] | ofork | fork handle |
| [in] | eid | data fork or resource fork entry id |
| [in] | offset | offset |
| [in] | rbuf | data buffer |
| [in,out] | rbuflen | in: number of bytes to read, out: bytes read |
|
static |
|
static |
Serve resource fork data from Tier 2 cache via DSI framing.
Shared helper for cache-hit and just-populated cache paths in read_fork(). Handles dsi_readinit/dsi_read/dsi_readdone loop and LRU promotion.
| [in] | dsi | DSI connection |
| [in] | cached_entry | dir entry with populated dcache_rfork_buf |
| [in] | ibuf | DSI write buffer (repurposed from command buffer) |
| [in] | offset | Starting byte offset in the rfork |
| [in] | reqcount | Requested byte count |
| [in] | err | AFP error code (AFPERR_EOF or AFP_OK) |
| [out] | rbuflen | Output: bytes remaining (set by dsi_read) |
Invalidate cached rfork data for a file identified by its open fork.
Looks up the file's dircache entry via parent DID + name, and invalidates the AD cache (Tier 1 + Tier 2). Used after rfork writes and truncations.
|
static |
|
static |
|
static |
|
static |