netatalk  4.6.0
Free and Open Source Apple Filing Protocol (AFP) Server
Loading...
Searching...
No Matches
include/atalk/dsi.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
3 * All rights reserved.
4 */
5
6#ifndef _ATALK_DSI_H
7#define _ATALK_DSI_H
8
9#include <sys/types.h>
10#include <arpa/inet.h>
11#include <netinet/in.h>
12#include <signal.h>
13#include <sys/socket.h>
14#include <sys/time.h>
15
16#include <atalk/afp.h>
17#include <atalk/globals.h>
18#include <atalk/server_child.h>
19
40
41#define DSI_BLOCKSIZ 16
42struct dsi_block {
43 uint8_t dsi_flags;
44 uint8_t dsi_command;
45 uint16_t dsi_requestID;
46 union {
47 uint32_t dsi_code;
48 uint32_t dsi_doff;
50 uint32_t dsi_len;
51 uint32_t dsi_reserved;
52};
53
54#define DSI_DATASIZ 65536
55
56/* child and parent processes might interpret a couple of these
57 * differently. */
58typedef struct DSI {
59 struct DSI *next;
62 char status[1400];
63 char *signature;
65 struct sockaddr_storage server, client;
66 struct itimerval timer;
67 int tickle;
72
74 uint16_t serverID, clientID;
75 uint8_t *commands;
76 uint8_t data[DSI_DATASIZ];
77 size_t datalen, cmdlen;
79 uint32_t flags;
80 int socket;
82
83 /* DSI readahead buffer used for buffered reads in dsi_peek */
84 size_t dsireadbuf;
85 char *buffer;
86 char *start;
87 char *eof;
88 char *end;
89
90#ifdef USE_ZEROCONF
91 char *zeroconfname;
92 int zeroconf_registered;
93#endif
94
95 /* protocol specific open/close */
96 pid_t (*proto_open)(struct DSI *);
97 void (*proto_close)(struct DSI *);
99
100/* DSI flags */
101#define DSIFL_REQUEST 0x00
102#define DSIFL_REPLY 0x01
103#define DSIFL_MAX 0x01
104
105/* DSI session options */
106#define DSIOPT_SERVQUANT 0x00
107#define DSIOPT_ATTNQUANT 0x01
108#define DSIOPT_REPLCSIZE 0x02
109
110/* DSI Commands */
111#define DSIFUNC_CLOSE 1
112#define DSIFUNC_CMD 2
113#define DSIFUNC_STAT 3
114#define DSIFUNC_OPEN 4
115#define DSIFUNC_TICKLE 5
116#define DSIFUNC_WRITE 6
117#define DSIFUNC_ATTN 8
118#define DSIFUNC_MAX 8
119
120/* DSI Error codes: most of these aren't used. */
121#define DSIERR_OK 0x0000
122#define DSIERR_BADVERS 0xfbd6
123#define DSIERR_BUFSMALL 0xfbd5
124#define DSIERR_NOSESS 0xfbd4
125#define DSIERR_NOSERV 0xfbd3
126#define DSIERR_PARM 0xfbd2
127#define DSIERR_SERVBUSY 0xfbd1
128#define DSIERR_SESSCLOS 0xfbd0
129#define DSIERR_SIZERR 0xfbcf
130#define DSIERR_TOOMANY 0xfbce
131#define DSIERR_NOACK 0xfbcd
132
133/* server and client quanta; the server quantum counts write data only */
134#define DSI_DEFQUANT 2
135#define DSI_SERVQUANT_MAX 0x10000000
136#define DSI_SERVQUANT_MIN 32000
137#define DSI_SERVQUANT_DEF 0x100000L
138
139/* Write request blocks: FPWrite is 12 bytes, FPWriteExt 20 bytes. */
140#define DSI_WROFF_FPWRITE 12
141#define DSI_WROFF_FPWRITEEXT 20
142
143/* On-wire overhead of an FPWriteExt frame: DSI header + request block. */
144#define DSI_FRAME_OVERHEAD_EXT (DSI_BLOCKSIZ + DSI_WROFF_FPWRITEEXT)
145
147#define DSI_QUANTUM_GROWTH_MAX (256 * 1024)
148
150#define DSI_AFPOVERTCP_PORT 548
151
152/* DSI session State flags */
153#define DSI_DATA (1 << 0)
154#define DSI_RUNNING (1 << 1)
155#define DSI_SLEEPING (1 << 2)
156#define DSI_EXTSLEEP (1 << 3)
157#define DSI_DISCONNECTED (1 << 4)
158#define DSI_DIE (1 << 5)
159#define DSI_NOREPLY (1 << 6)
160#define DSI_RECONSOCKET (1 << 7)
161#define DSI_RECONINPROG (1 << 8)
162#define DSI_AFP_LOGGED_OUT (1 << 9)
163
164/* basic initialization: dsi_init.c */
165extern DSI *dsi_init(AFPObj *obj, const char *hostname, const char *address,
166 const char *port);
167extern void dsi_setstatus(DSI *, char *, const size_t);
168extern int dsi_tcp_init(DSI *dsi, const char *hostname, const char *address,
169 const char *port);
170extern uint32_t dsi_effective_mss(const DSI *);
171extern uint32_t dsi_align_quantum(uint32_t configured, uint32_t mss);
172extern void dsi_free(DSI *dsi);
173
174/* in dsi_getsess.c */
175extern int dsi_getsession(DSI *, server_child_t *, const int, afp_child_t **);
176extern void dsi_kill(int);
177
178
179/* DSI Commands: individual files */
180extern void dsi_opensession(DSI *);
181extern int dsi_attention(DSI *, AFPUserBytes);
182extern int dsi_cmdreply(DSI *, const int);
183extern int dsi_tickle(DSI *);
184extern void dsi_getstatus(DSI *);
185extern void dsi_close(DSI *);
186
187#define DSI_NOWAIT 1
188#define DSI_MSG_MORE 2
189
190/* low-level stream commands -- in dsi_stream.c */
191extern ssize_t dsi_stream_write(DSI *, void *, const size_t, const int mode);
192extern size_t dsi_stream_read(DSI *, void *, const size_t);
193extern int dsi_stream_send(DSI *, void *, size_t);
194extern int dsi_stream_receive(DSI *);
195extern int dsi_disconnect(DSI *dsi);
196
197#ifdef WITH_SENDFILE
198extern ssize_t dsi_stream_read_file(DSI *, int, off_t off, const size_t len,
199 const int err);
200#endif
201
202/* client writes -- dsi_write.c */
203extern size_t dsi_writeinit(DSI *, char **);
204extern size_t dsi_write(DSI *, void *, const size_t);
205extern void dsi_writeflush(DSI *);
206#define dsi_wrtreply(a,b) dsi_cmdreply(a,b)
207
208/* client reads -- dsi_read.c */
209extern ssize_t dsi_readinit(DSI *, void *, const size_t, const size_t,
210 const int);
211extern ssize_t dsi_read(DSI *, void *, const size_t);
212extern void dsi_readdone(DSI *);
213
214/* some useful macros */
215#define dsi_serverID(x) ((x)->serverID++)
216#define dsi_send(x) do { \
217 (x)->header.dsi_len = htonl((x)->cmdlen); \
218 dsi_stream_send((x), (x)->commands, (x)->cmdlen); \
219 } while (0)
220
221#endif /* atalk/dsi.h */
uint16_t AFPUserBytes
Definition afp.h:30
size_t dsi_write(DSI *, void *, const size_t)
Definition dsi_write.c:70
int dsi_attention(DSI *, AFPUserBytes)
send an attention.
Definition dsi_attn.c:25
size_t dsi_stream_read(DSI *, void *, const size_t)
Read data from DSI buffer.
Definition dsi_stream.c:534
ssize_t dsi_stream_write(DSI *, void *, const size_t, const int mode)
write raw DSI data
Definition dsi_stream.c:304
void dsi_setstatus(DSI *, char *, const size_t)
int dsi_stream_send(DSI *, void *, size_t)
write data.
Definition dsi_stream.c:581
DSI * dsi_init(AFPObj *obj, const char *hostname, const char *address, const char *port)
Definition dsi_init.c:17
int dsi_getsession(DSI *, server_child_t *, const int, afp_child_t **)
Start a DSI session, fork an afpd process.
Definition dsi_getsess.c:35
ssize_t dsi_stream_read_file(DSI *, int, off_t off, const size_t len, const int err)
Definition dsi_stream.c:371
ssize_t dsi_readinit(DSI *, void *, const size_t, const size_t, const int)
streaming i/o for afp_read.
Definition dsi_read.c:29
uint32_t dsi_effective_mss(const DSI *)
Definition dsi_tcp.c:108
int dsi_tcp_init(DSI *dsi, const char *hostname, const char *address, const char *port)
Initialize DSI over TCP.
Definition dsi_tcp.c:567
uint32_t dsi_align_quantum(uint32_t configured, uint32_t mss)
Definition dsi_tcp.c:161
void dsi_opensession(DSI *)
Definition dsi_opensess.c:20
void dsi_writeflush(DSI *)
Definition dsi_write.c:88
int dsi_tickle(DSI *)
Definition dsi_tickle.c:19
int dsi_disconnect(DSI *dsi)
Communication error with the client, enter disconnected state.
Definition dsi_stream.c:282
int dsi_stream_receive(DSI *)
Read DSI command and data.
Definition dsi_stream.c:662
void dsi_free(DSI *dsi)
Definition dsi_tcp.c:204
size_t dsi_writeinit(DSI *, char **)
Definition dsi_write.c:31
void dsi_kill(int)
void dsi_close(DSI *)
Definition dsi_close.c:16
void dsi_getstatus(DSI *)
Definition dsi_getstat.c:18
int dsi_cmdreply(DSI *, const int)
Definition dsi_cmdreply.c:19
ssize_t dsi_read(DSI *, void *, const size_t)
Definition dsi_read.c:57
void dsi_readdone(DSI *)
Definition dsi_read.c:51
data structures and utility functions for child processes
struct afp_child afp_child_t
Definition globals.h:190
Definition include/atalk/dsi.h:58
char * eof
Definition include/atalk/dsi.h:87
uint16_t serverID
Definition include/atalk/dsi.h:74
AFPObj * AFPobj
Definition include/atalk/dsi.h:60
char * signature
Definition include/atalk/dsi.h:63
int tickle
Definition include/atalk/dsi.h:67
int msg_request
Definition include/atalk/dsi.h:70
size_t datalen
Definition include/atalk/dsi.h:77
struct sockaddr_storage server client
Definition include/atalk/dsi.h:65
char * start
Definition include/atalk/dsi.h:86
char * buffer
Definition include/atalk/dsi.h:85
size_t cmdlen
Definition include/atalk/dsi.h:77
void(*) proto_close(struct DSI *)
Definition include/atalk/dsi.h:97
off_t read_count
Definition include/atalk/dsi.h:78
int in_write
Definition include/atalk/dsi.h:68
uint32_t datasize
Definition include/atalk/dsi.h:73
off_t write_count
Definition include/atalk/dsi.h:78
int down_request
Definition include/atalk/dsi.h:71
char * end
Definition include/atalk/dsi.h:88
int serversock
Definition include/atalk/dsi.h:81
uint32_t server_quantum
Definition include/atalk/dsi.h:73
uint16_t clientID
Definition include/atalk/dsi.h:74
uint32_t flags
Definition include/atalk/dsi.h:79
uint8_t data[DSI_DATASIZ]
Definition include/atalk/dsi.h:76
int socket
Definition include/atalk/dsi.h:80
size_t dsireadbuf
Definition include/atalk/dsi.h:84
char status[1400]
Definition include/atalk/dsi.h:62
pid_t(*) proto_open(struct DSI *)
Definition include/atalk/dsi.h:96
uint32_t attn_quantum
Definition include/atalk/dsi.h:73
struct itimerval timer
Definition include/atalk/dsi.h:66
int statuslen
Definition include/atalk/dsi.h:61
struct dsi_block header
Definition include/atalk/dsi.h:64
uint8_t * commands
Definition include/atalk/dsi.h:75
struct DSI * next
Definition include/atalk/dsi.h:59
Definition include/atalk/dsi.h:42
uint8_t dsi_command
Definition include/atalk/dsi.h:44
uint32_t dsi_len
Definition include/atalk/dsi.h:50
uint16_t dsi_requestID
Definition include/atalk/dsi.h:45
union dsi_block::@163171127153115331212301270372123254264166034110 dsi_data
uint32_t dsi_reserved
Definition include/atalk/dsi.h:51
uint8_t dsi_flags
Definition include/atalk/dsi.h:43
Definition server_child.h:47
Definition cnid_metad.c:111
#define DSI_DATASIZ
Definition test/testsuite/dsi.h:58