X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=include%2Fatalk%2Fdsi.h;h=e16681a4eee95bbafc3d376065c2264dac631345;hb=cdb7047fb6897c1ad8b4ac264001d44154bf144d;hp=5053cb13d4565e285d64c7b616d03ebd1fc66c51;hpb=12857f8fdde6f59eb8759b35d75e89c0dad8cfbe;p=netatalk.git diff --git a/include/atalk/dsi.h b/include/atalk/dsi.h index 5053cb13..e16681a4 100644 --- a/include/atalk/dsi.h +++ b/include/atalk/dsi.h @@ -6,15 +6,15 @@ #ifndef _ATALK_DSI_H #define _ATALK_DSI_H -#include #include #include +#include #include +#include #include #include #include -#include /* What a DSI packet looks like: 0 32 @@ -56,26 +56,22 @@ struct dsi_block { typedef struct DSI { dsi_proto protocol; struct dsi_block header; - struct sockaddr_in server, client; - - sigset_t sigblockset, oldset; - int sigblocked; + 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 */ - int in_write; /* in the middle of writing multiple packets, signal handlers - * can't write to the socket - */ - u_int32_t attn_quantum, datasize, server_quantum; u_int16_t serverID, clientID; char *status; u_int8_t commands[DSI_CMDSIZ], data[DSI_DATASIZ]; size_t statuslen; size_t datalen, cmdlen; - size_t read_count, write_count; - int asleep; /* client won't reply AFP 0x7a ? */ - /* inited = initialized?, child = a child?, noreply = send reply? */ - char child, inited, noreply; + off_t read_count, write_count; + uint32_t flags; /* DSI flags like DSI_SLEEPING, DSI_DISCONNECTED */ const char *program; int socket, serversock; @@ -90,8 +86,11 @@ typedef struct DSI { char srvloc_url[512]; #endif +#ifdef USE_ZEROCONF + int zeroconf_registered; +#endif + /* buffer for OSX deadlock */ - int noblocking; char *buffer; char *start; char *eof; @@ -108,6 +107,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 */ @@ -141,16 +141,27 @@ typedef struct DSI { /* 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 */ + /* basic initialization: dsi_init.c */ extern DSI *dsi_init (const dsi_proto /*protocol*/, const char * /*program*/, const char * /*host*/, const char * /*address*/, - const int /*port*/, const int /*proxy*/, + 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 (DSI *, server_child *, const int); +extern afp_child_t *dsi_getsession (DSI *, server_child *, const int); extern void dsi_kill (int); @@ -161,17 +172,18 @@ extern int dsi_cmdreply (DSI *, const int); extern int dsi_tickle (DSI *); extern void dsi_getstatus (DSI *); extern void dsi_close (DSI *); -extern void dsi_sleep (DSI *, const int ); - -/* set, unset socket blocking mode */ -extern int dsi_block (DSI *, const int); +#define DSI_NOWAIT 1 /* low-level stream commands -- in dsi_stream.c */ -extern size_t dsi_stream_write (DSI *, void *, const size_t, const int mode); +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 *); +#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 (DSI *, void *, const size_t); extern size_t dsi_write (DSI *, void *, const size_t);