X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=include%2Fatalk%2Fdsi.h;h=baaa960c9f031f838c025f4856231975ee406f23;hb=b0bcb8f6b0571592a50ce039882c9319e012a270;hp=63509c1f57596e426645961493c053dbd9021558;hpb=31843674b7bd32eabcce3a1ad6159b4f94921f79;p=netatalk.git diff --git a/include/atalk/dsi.h b/include/atalk/dsi.h index 63509c1f..baaa960c 100644 --- a/include/atalk/dsi.h +++ b/include/atalk/dsi.h @@ -6,15 +6,16 @@ #ifndef _ATALK_DSI_H #define _ATALK_DSI_H -#include #include #include +#include #include - +#include #include + #include #include -#include +#include /* What a DSI packet looks like: 0 32 @@ -49,23 +50,31 @@ struct dsi_block { u_int32_t dsi_reserved; /* reserved field */ }; -#define DSI_CMDSIZ 800 +#define DSI_CMDSIZ 8192 #define DSI_DATASIZ 8192 + /* child and parent processes might interpret a couple of these * differently. */ typedef struct DSI { + AFPObj *AFPobj; dsi_proto protocol; struct dsi_block header; - struct sockaddr_in server, client; - sigset_t sigblockset; - struct itimerval timer, savetimer; + struct sockaddr_storage server, client; + struct itimerval timer; + int tickle; /* tickle count */ + int in_write; /* in the middle of writing multiple packets, + signal handlers can't write to the socket */ + int msg_request; /* pending message to the client */ + int down_request; /* pending SIGUSR1 down in 5 mn */ + u_int32_t attn_quantum, datasize, server_quantum; u_int16_t serverID, clientID; - u_int8_t *status, commands[DSI_CMDSIZ], data[DSI_DATASIZ]; - int statuslen, datalen, cmdlen; - size_t read_count, write_count; - /* inited = initialized?, child = a child?, noreply = send reply? */ - char child, inited, noreply; + char *status; + u_int8_t commands[DSI_CMDSIZ], data[DSI_DATASIZ]; + size_t statuslen; + size_t datalen, cmdlen; + off_t read_count, write_count; + uint32_t flags; /* DSI flags like DSI_SLEEPING, DSI_DISCONNECTED */ const char *program; int socket, serversock; @@ -74,6 +83,23 @@ typedef struct DSI { * write/read just write/read data */ pid_t (*proto_open)(struct DSI *); void (*proto_close)(struct DSI *); + + /* url registered with slpd */ +#ifdef USE_SRVLOC + char srvloc_url[512]; +#endif + +#ifdef USE_ZEROCONF + char *bonjourname; /* server name as UTF8 maxlen MAXINSTANCENAMELEN */ + int zeroconf_registered; +#endif + + /* DSI readahead buffer used for buffered reads in dsi_peek */ + size_t dsireadbuf; /* size of the DSI readahead buffer used in dsi_peek() */ + char *buffer; + char *start; + char *eof; + char *end; } DSI; /* DSI flags */ @@ -84,6 +110,7 @@ typedef struct DSI { /* DSI session options */ #define DSIOPT_SERVQUANT 0x00 /* server request quantum */ #define DSIOPT_ATTNQUANT 0x01 /* attention quantum */ +#define DSIOPT_REPLCSIZE 0x02 /* AFP replaycache size supported by the server (that's us) */ /* DSI Commands */ #define DSIFUNC_CLOSE 1 /* DSICloseSession */ @@ -110,51 +137,70 @@ typedef struct DSI { /* server and client quanta */ #define DSI_DEFQUANT 2 /* default attention quantum size */ -#define DSI_SERVQUANT_MAX 0xffffffffL /* server quantum */ -#define DSI_SERVQUANT_MIN 0x0004A2E0L /* minimum server quantum */ -#define DSI_SERVQUANT_DEF DSI_SERVQUANT_MIN /* default server quantum */ +#define DSI_SERVQUANT_MAX 0xffffffff /* server quantum */ +#define DSI_SERVQUANT_MIN 32000 /* minimum server quantum */ +#define DSI_SERVQUANT_DEF 0x0004A2E0L /* default server quantum */ /* default port number */ #define DSI_AFPOVERTCP_PORT 548 +/* DSI session State flags */ +#define DSI_DATA (1 << 0) /* we have received a DSI command */ +#define DSI_RUNNING (1 << 1) /* we have received a AFP command */ +#define DSI_SLEEPING (1 << 2) /* we're sleeping after FPZzz */ +#define DSI_EXTSLEEP (1 << 3) /* we're sleeping after FPZzz */ +#define DSI_DISCONNECTED (1 << 4) /* we're in diconnected state after a socket error */ +#define DSI_DIE (1 << 5) /* SIGUSR1, going down in 5 minutes */ +#define DSI_NOREPLY (1 << 6) /* in dsi_write we generate our own replies */ +#define DSI_RECONSOCKET (1 << 7) /* we have a new socket from primary reconnect */ +#define DSI_RECONINPROG (1 << 8) /* used in the new session in reconnect */ +#define DSI_AFP_LOGGED_OUT (1 << 9) /* client called afp_logout, quit on next EOF from socket */ +#define DSI_GOT_ECONNRESET (1 << 10) /* got ECONNRESET from client => exit */ + /* basic initialization: dsi_init.c */ -extern DSI *dsi_init __P((const dsi_proto /*protocol*/, +extern DSI *dsi_init (const dsi_proto /*protocol*/, const char * /*program*/, const char * /*host*/, const char * /*address*/, - const int /*port*/, const int /*proxy*/, - const u_int32_t /* server quantum */)); -extern void dsi_setstatus __P((DSI *, u_int8_t *, const int)); + const char * /*port*/, const int /*proxy*/, + const u_int32_t /* server quantum */); +extern void dsi_setstatus (DSI *, char *, const size_t); /* in dsi_getsess.c */ -extern DSI *dsi_getsession __P((DSI *, server_child *, const int)); -extern void dsi_kill __P((int)); +extern afp_child_t *dsi_getsession (DSI *, server_child *, const int); +extern void dsi_kill (int); /* DSI Commands: individual files */ -extern void dsi_opensession __P((DSI *)); -extern int dsi_attention __P((DSI *, AFPUserBytes)); -extern int dsi_cmdreply __P((DSI *, const int)); -extern void dsi_tickle __P((DSI *)); -extern void dsi_getstatus __P((DSI *)); -extern void dsi_close __P((DSI *)); - +extern void dsi_opensession (DSI *); +extern int dsi_attention (DSI *, AFPUserBytes); +extern int dsi_cmdreply (DSI *, const int); +extern int dsi_tickle (DSI *); +extern void dsi_getstatus (DSI *); +extern void dsi_close (DSI *); + +#define DSI_NOWAIT 1 /* low-level stream commands -- in dsi_stream.c */ -extern size_t dsi_stream_write __P((DSI *, void *, const size_t)); -extern size_t dsi_stream_read __P((DSI *, void *, const size_t)); -extern int dsi_stream_send __P((DSI *, void *, size_t)); -extern int dsi_stream_receive __P((DSI *, void *, const int, int *)); +extern ssize_t dsi_stream_write (DSI *, void *, const size_t, const int mode); +extern size_t dsi_stream_read (DSI *, void *, const size_t); +extern int dsi_stream_send (DSI *, void *, size_t); +extern int dsi_stream_receive (DSI *, void *, const size_t, size_t *); +extern int dsi_disconnect(DSI *dsi); + +#ifdef WITH_SENDFILE +extern ssize_t dsi_stream_read_file(DSI *, int, off_t off, const size_t len); +#endif /* client writes -- dsi_write.c */ -extern size_t dsi_writeinit __P((DSI *, void *, const size_t)); -extern size_t dsi_write __P((DSI *, void *, const size_t)); -extern void dsi_writeflush __P((DSI *)); +extern size_t dsi_writeinit (DSI *, void *, const size_t); +extern size_t dsi_write (DSI *, void *, const size_t); +extern void dsi_writeflush (DSI *); #define dsi_wrtreply(a,b) dsi_cmdreply(a,b) /* client reads -- dsi_read.c */ -extern ssize_t dsi_readinit __P((DSI *, void *, const size_t, const size_t, - const int)); -extern ssize_t dsi_read __P((DSI *, void *, const size_t)); -extern void dsi_readdone __P((DSI *)); +extern ssize_t dsi_readinit (DSI *, void *, const size_t, const size_t, + const int); +extern ssize_t dsi_read (DSI *, void *, const size_t); +extern void dsi_readdone (DSI *); /* some useful macros */ #define dsi_serverID(x) ((x)->serverID++)