netatalk  4.4.0dev
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 ([email protected])
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
20/* What a DSI packet looks like:
21 0 32
22 |-------------------------------|
23 |flags |command| requestID |
24 |-------------------------------|
25 |error code/enclosed data offset|
26 |-------------------------------|
27 |total data length |
28 |-------------------------------|
29 |reserved field |
30 |-------------------------------|
31
32 CONVENTION: anything with a dsi_ prefix is kept in network byte order.
33*/
34
35#define DSI_BLOCKSIZ 16
36struct dsi_block {
37 uint8_t dsi_flags; /* packet type: request or reply */
38 uint8_t dsi_command; /* command */
39 uint16_t dsi_requestID; /* request ID */
40 union {
41 uint32_t dsi_code; /* error code */
42 uint32_t dsi_doff; /* data offset */
44 uint32_t dsi_len; /* total data length */
45 uint32_t dsi_reserved; /* reserved field */
46};
47
48#define DSI_DATASIZ 65536
49
50/* child and parent processes might interpret a couple of these
51 * differently. */
52typedef struct DSI {
53 struct DSI *next; /* multiple listening addresses */
56 char status[1400];
57 char *signature;
59 struct sockaddr_storage server, client;
60 struct itimerval timer;
61 int tickle; /* tickle count */
62 int in_write; /* in the middle of writing multiple packets,
63 signal handlers can't write to the socket */
64 int msg_request; /* pending message to the client */
65 int down_request; /* pending SIGUSR1 down in 5 mn */
66
68 uint16_t serverID, clientID;
69 uint8_t *commands; /* DSI recieve buffer */
70 uint8_t data[DSI_DATASIZ]; /* DSI reply buffer */
71 size_t datalen, cmdlen;
73 uint32_t flags; /* DSI flags like DSI_SLEEPING, DSI_DISCONNECTED */
74 int socket; /* AFP session socket */
75 int serversock; /* listening socket */
76
77 /* DSI readahead buffer used for buffered reads in dsi_peek */
78 size_t dsireadbuf; /* size of the DSI readahead buffer used in dsi_peek() */
79 char *buffer; /* buffer start */
80 char *start; /* current buffer head */
81 char *eof; /* end of currently used buffer */
82 char *end;
83
84#ifdef USE_ZEROCONF
85 char *bonjourname; /* server name as UTF8 maxlen MAXINSTANCENAMELEN */
86 int zeroconf_registered;
87#endif
88
89 /* protocol specific open/close, send/receive
90 * send/receive fill in the header and use dsi->commands.
91 * write/read just write/read data */
92 pid_t (*proto_open)(struct DSI *);
93 void (*proto_close)(struct DSI *);
95
96/* DSI flags */
97#define DSIFL_REQUEST 0x00
98#define DSIFL_REPLY 0x01
99#define DSIFL_MAX 0x01
100
101/* DSI session options */
102#define DSIOPT_SERVQUANT 0x00 /* server request quantum */
103#define DSIOPT_ATTNQUANT 0x01 /* attention quantum */
104#define DSIOPT_REPLCSIZE 0x02 /* AFP replaycache size supported by the server (that's us) */
105
106/* DSI Commands */
107#define DSIFUNC_CLOSE 1 /* DSICloseSession */
108#define DSIFUNC_CMD 2 /* DSICommand */
109#define DSIFUNC_STAT 3 /* DSIGetStatus */
110#define DSIFUNC_OPEN 4 /* DSIOpenSession */
111#define DSIFUNC_TICKLE 5 /* DSITickle */
112#define DSIFUNC_WRITE 6 /* DSIWrite */
113#define DSIFUNC_ATTN 8 /* DSIAttention */
114#define DSIFUNC_MAX 8 /* largest command */
115
116/* DSI Error codes: most of these aren't used. */
117#define DSIERR_OK 0x0000
118#define DSIERR_BADVERS 0xfbd6
119#define DSIERR_BUFSMALL 0xfbd5
120#define DSIERR_NOSESS 0xfbd4
121#define DSIERR_NOSERV 0xfbd3
122#define DSIERR_PARM 0xfbd2
123#define DSIERR_SERVBUSY 0xfbd1
124#define DSIERR_SESSCLOS 0xfbd0
125#define DSIERR_SIZERR 0xfbcf
126#define DSIERR_TOOMANY 0xfbce
127#define DSIERR_NOACK 0xfbcd
128
129/* server and client quanta */
130#define DSI_DEFQUANT 2 /* default attention quantum size */
131#define DSI_SERVQUANT_MAX 0xffffffff /* server quantum */
132#define DSI_SERVQUANT_MIN 32000 /* minimum server quantum */
133#define DSI_SERVQUANT_DEF 0x100000L /* default server quantum (1 MB) */
134
135/* default port number */
136#define DSI_AFPOVERTCP_PORT 548
137
138/* DSI session State flags */
139#define DSI_DATA (1 << 0) /* we have received a DSI command */
140#define DSI_RUNNING (1 << 1) /* we have received a AFP command */
141#define DSI_SLEEPING (1 << 2) /* we're sleeping after FPZzz */
142#define DSI_EXTSLEEP (1 << 3) /* we're sleeping after FPZzz */
143#define DSI_DISCONNECTED (1 << 4) /* we're in diconnected state after a socket error */
144#define DSI_DIE (1 << 5) /* SIGUSR1, going down in 5 minutes */
145#define DSI_NOREPLY (1 << 6) /* in dsi_write we generate our own replies */
146#define DSI_RECONSOCKET (1 << 7) /* we have a new socket from primary reconnect */
147#define DSI_RECONINPROG (1 << 8) /* used in the new session in reconnect */
148#define DSI_AFP_LOGGED_OUT (1 << 9) /* client called afp_logout, quit on next EOF from socket */
149
150/* basic initialization: dsi_init.c */
151extern DSI *dsi_init(AFPObj *obj, const char *hostname, const char *address,
152 const char *port);
153extern void dsi_setstatus(DSI *, char *, const size_t);
154extern int dsi_tcp_init(DSI *dsi, const char *hostname, const char *address,
155 const char *port);
156extern void dsi_free(DSI *dsi);
157
158/* in dsi_getsess.c */
159extern int dsi_getsession(DSI *, server_child_t *, const int, afp_child_t **);
160extern void dsi_kill(int);
161
162
163/* DSI Commands: individual files */
164extern void dsi_opensession(DSI *);
165extern int dsi_attention(DSI *, AFPUserBytes);
166extern int dsi_cmdreply(DSI *, const int);
167extern int dsi_tickle(DSI *);
168extern void dsi_getstatus(DSI *);
169extern void dsi_close(DSI *);
170
171#define DSI_NOWAIT 1
172#define DSI_MSG_MORE 2
173
174/* low-level stream commands -- in dsi_stream.c */
175extern ssize_t dsi_stream_write(DSI *, void *, const size_t, const int mode);
176extern size_t dsi_stream_read(DSI *, void *, const size_t);
177extern int dsi_stream_send(DSI *, void *, size_t);
178extern int dsi_stream_receive(DSI *);
179extern int dsi_disconnect(DSI *dsi);
180
181#ifdef WITH_SENDFILE
182extern ssize_t dsi_stream_read_file(DSI *, int, off_t off, const size_t len,
183 const int err);
184#endif
185
186/* client writes -- dsi_write.c */
187extern size_t dsi_writeinit(DSI *, void *, const size_t);
188extern size_t dsi_write(DSI *, void *, const size_t);
189extern void dsi_writeflush(DSI *);
190#define dsi_wrtreply(a,b) dsi_cmdreply(a,b)
191
192/* client reads -- dsi_read.c */
193extern ssize_t dsi_readinit(DSI *, void *, const size_t, const size_t,
194 const int);
195extern ssize_t dsi_read(DSI *, void *, const size_t);
196extern void dsi_readdone(DSI *);
197
198/* some useful macros */
199#define dsi_serverID(x) ((x)->serverID++)
200#define dsi_send(x) do { \
201 (x)->header.dsi_len = htonl((x)->cmdlen); \
202 dsi_stream_send((x), (x)->commands, (x)->cmdlen); \
203 } while (0)
204
205#endif /* atalk/dsi.h */
static DSI * dsi
Definition afparg.c:39
uint16_t AFPUserBytes
Definition include/atalk/afp.h:30
size_t dsi_write(DSI *, void *, const size_t)
Definition dsi_write.c:52
int dsi_attention(DSI *, AFPUserBytes)
Definition dsi_attn.c:24
size_t dsi_stream_read(DSI *, void *, const size_t)
Definition dsi_stream.c:523
ssize_t dsi_stream_write(DSI *, void *, const size_t, const int mode)
Definition dsi_stream.c:295
size_t dsi_writeinit(DSI *, void *, const size_t)
Definition dsi_write.c:26
void dsi_setstatus(DSI *, char *, const size_t)
int dsi_stream_send(DSI *, void *, size_t)
Definition dsi_stream.c:568
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 **)
Definition dsi_getsess.c:36
ssize_t dsi_readinit(DSI *, void *, const size_t, const size_t, const int)
Definition dsi_read.c:26
int dsi_tcp_init(DSI *dsi, const char *hostname, const char *address, const char *port)
Definition dsi_tcp.c:430
void dsi_opensession(DSI *)
Definition dsi_opensess.c:20
void dsi_writeflush(DSI *)
Definition dsi_write.c:70
int dsi_tickle(DSI *)
Definition dsi_tickle.c:20
int dsi_disconnect(DSI *dsi)
Definition dsi_stream.c:277
int dsi_stream_receive(DSI *)
Definition dsi_stream.c:649
void dsi_free(DSI *dsi)
Definition dsi_tcp.c:104
void dsi_kill(int)
void dsi_close(DSI *)
Definition dsi_close.c:17
void dsi_getstatus(DSI *)
Definition dsi_getstat.c:19
int dsi_cmdreply(DSI *, const int)
Definition dsi_cmdreply.c:19
ssize_t dsi_read(DSI *, void *, const size_t)
Definition dsi_read.c:54
void dsi_readdone(DSI *)
Definition dsi_read.c:48
static char hostname[MAXHOSTNAMELEN]
Definition lp.c:169
static AFPObj obj
Definition netatalk.c:62
static unsigned char port
Definition pap.c:504
struct afp_child afp_child_t
Definition globals.h:154
Definition include/atalk/dsi.h:52
char * eof
Definition include/atalk/dsi.h:81
uint16_t serverID
Definition include/atalk/dsi.h:68
AFPObj * AFPobj
Definition include/atalk/dsi.h:54
char * signature
Definition include/atalk/dsi.h:57
int tickle
Definition include/atalk/dsi.h:61
int msg_request
Definition include/atalk/dsi.h:64
size_t datalen
Definition include/atalk/dsi.h:71
struct sockaddr_storage server client
Definition include/atalk/dsi.h:59
char * start
Definition include/atalk/dsi.h:80
char * buffer
Definition include/atalk/dsi.h:79
size_t cmdlen
Definition include/atalk/dsi.h:71
off_t read_count
Definition include/atalk/dsi.h:72
int in_write
Definition include/atalk/dsi.h:62
pid_t(* proto_open)(struct DSI *)
Definition include/atalk/dsi.h:92
uint32_t datasize
Definition include/atalk/dsi.h:67
off_t write_count
Definition include/atalk/dsi.h:72
int down_request
Definition include/atalk/dsi.h:65
char * end
Definition include/atalk/dsi.h:82
int serversock
Definition include/atalk/dsi.h:75
uint32_t server_quantum
Definition include/atalk/dsi.h:67
uint16_t clientID
Definition include/atalk/dsi.h:68
uint32_t flags
Definition include/atalk/dsi.h:73
void(* proto_close)(struct DSI *)
Definition include/atalk/dsi.h:93
uint8_t data[DSI_DATASIZ]
Definition include/atalk/dsi.h:70
int socket
Definition include/atalk/dsi.h:74
size_t dsireadbuf
Definition include/atalk/dsi.h:78
char status[1400]
Definition include/atalk/dsi.h:56
uint32_t attn_quantum
Definition include/atalk/dsi.h:67
struct itimerval timer
Definition include/atalk/dsi.h:60
int statuslen
Definition include/atalk/dsi.h:55
struct dsi_block header
Definition include/atalk/dsi.h:58
uint8_t * commands
Definition include/atalk/dsi.h:69
struct DSI * next
Definition include/atalk/dsi.h:53
Definition include/atalk/dsi.h:36
uint8_t dsi_command
Definition include/atalk/dsi.h:38
uint32_t dsi_code
Definition include/atalk/dsi.h:41
uint32_t dsi_len
Definition include/atalk/dsi.h:44
uint16_t dsi_requestID
Definition include/atalk/dsi.h:39
union dsi_block::@151265333004305367041254150200207234256102203004 dsi_data
uint32_t dsi_doff
Definition include/atalk/dsi.h:42
uint32_t dsi_reserved
Definition include/atalk/dsi.h:45
uint8_t dsi_flags
Definition include/atalk/dsi.h:37
Definition server_child.h:47
Definition cnid_metad.c:110
#define DSI_DATASIZ
Definition test/testsuite/dsi.h:43