/*
- * $Id: afp_dsi.c,v 1.41 2009-10-21 07:03:08 didg Exp $
+ * $Id: afp_dsi.c,v 1.43 2009-10-22 05:53:20 didg Exp $
*
* Copyright (c) 1999 Adrian Sun (asun@zoology.washington.edu)
* Copyright (c) 1990,1993 Regents of The University of Michigan.
#define CHILD_DIE (1 << 0)
#define CHILD_RUNNING (1 << 1)
#define CHILD_SLEEPING (1 << 2)
-#define CHILD_DATA (1 << 3)
static struct {
AFPObj *obj;
#ifdef SERVERTEXT
static void afp_dsi_getmesg (int sig _U_)
{
- readmessage(child.obj);
+ DSI *dsi = (DSI *) child.obj->handle;
+
+ dsi->msg_request = 1;
dsi_attention(child.obj->handle, AFPATTN_MESG | AFPATTN_TIME(5));
}
#endif /* SERVERTEXT */
* may use alarm() */
setitimer(ITIMER_REAL, &dsi->timer, NULL);
- /* we got some traffic from the client since the previous timer
- * tick. */
- if ((child.flags & CHILD_DATA)) {
- child.flags &= ~CHILD_DATA;
- return;
- }
-
/* if we're in the midst of processing something,
don't die. */
if ((child.flags & CHILD_SLEEPING) && child.tickle++ < child.obj->options.sleep) {
}
}
-
-#ifdef DEBUG1
-/* ---------------------------------
- * old signal handler for SIGUSR1 - set the debug flag and
- * redirect stdout to <tmpdir>/afpd-debug-<pid>.
- */
-void afp_set_debug (int sig)
+/* -----------------
+ if dsi->in_write is set attention, tickle (and close?) msg
+ aren't sent. We don't care about tickle
+*/
+static void pending_request(DSI *dsi)
{
- char fname[MAXPATHLEN];
-
- snprintf(fname, MAXPATHLEN-1, "%safpd-debug-%d", P_tmpdir, getpid());
- freopen(fname, "w", stdout);
- child.obj->options.flags |= OPTION_DEBUG;
+ /* send pending attention */
- return;
+ /* read msg if any, it could be done in afp_getsrvrmesg */
+ if (dsi->msg_request) {
+ dsi->msg_request = 0;
+ readmessage(child.obj);
+ }
}
-#endif
/* -------------------------------------------
afp over dsi. this never returns.
}
#endif /* DEBUGGING */
-#ifdef DEBUG1
- fault_setup((void (*)(void *))afp_dsi_die);
-#endif
-
/* get stuck here until the end */
while ((cmd = dsi_receive(dsi))) {
child.tickle = 0;
/* timer is not every 30 seconds anymore, so we don't get killed on the client side. */
if ((child.flags & CHILD_DIE))
dsi_tickle(dsi);
+ pending_request(dsi);
continue;
}
- child.flags |= CHILD_DATA;
switch(cmd) {
case DSIFUNC_CLOSE:
afp_dsi_close(obj);
LOG(log_info, logtype_afpd, "done");
-#ifdef DEBUG1
- if (obj->options.flags & OPTION_DEBUG )
- printf("done\n");
-#endif
return;
break;
#endif /* AFS */
function = (u_char) dsi->commands[0];
-#ifdef DEBUG1
- if (obj->options.flags & OPTION_DEBUG ) {
- printf("command: %d (%s)\n", function, AfpNum2name(function));
- bprint((char *) dsi->commands, dsi->cmdlen);
- }
-#endif
/* send off an afp command. in a couple cases, we take advantage
* of the fact that we're a stream-based protocol. */
break;
}
-#ifdef DEBUG1
- if (obj->options.flags & OPTION_DEBUG ) {
- printf( "reply: %d, %d\n", err, dsi->clientID);
- bprint((char *) dsi->data, dsi->datalen);
- }
-#endif
if (!dsi_cmdreply(dsi, err)) {
LOG(log_error, logtype_afpd, "dsi_cmdreply(%d): %s", dsi->socket, strerror(errno) );
afp_dsi_die(EXITERR_CLNT);
case DSIFUNC_WRITE: /* FPWrite and FPAddIcon */
function = (u_char) dsi->commands[0];
-#ifdef DEBUG1
- if ( obj->options.flags & OPTION_DEBUG ) {
- printf("(write) command: %d, %d\n", function, dsi->cmdlen);
- bprint((char *) dsi->commands, dsi->cmdlen);
- }
-#endif
if ( afp_switch[ function ] != NULL ) {
dsi->datalen = DSI_DATASIZ;
child.flags |= CHILD_RUNNING;
err = AFPERR_NOOP;
}
-#ifdef DEBUG1
- if (obj->options.flags & OPTION_DEBUG ) {
- printf( "(write) reply code: %d, %d\n", err, dsi->clientID);
- bprint((char *) dsi->data, dsi->datalen);
- }
-#endif
if (!dsi_wrtreply(dsi, err)) {
LOG(log_error, logtype_afpd, "dsi_wrtreply: %s", strerror(errno) );
afp_dsi_die(EXITERR_CLNT);
break;
case DSIFUNC_ATTN: /* attention replies */
- continue;
break;
/* error. this usually implies a mismatch of some kind
dsi_writeflush(dsi);
break;
}
-#ifdef DEBUG1
- if ( obj->options.flags & OPTION_DEBUG ) {
-#ifdef notdef
- pdesc( stdout );
-#endif /* notdef */
- of_pforkdesc( stdout );
- fflush( stdout );
- }
-#endif
+ pending_request(dsi);
}
/* error */