/*
+ * $Id: session.c,v 1.20 2009-10-16 01:10:59 didg Exp $
+ *
* Copyright (c) 1990,1994 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef HAVE_SYS_ERRNO_H
+#include <sys/errno.h>
+#endif /* HAVE_SYS_ERRNO_H */
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif /* HAVE_ERRNO_H */
+
+#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
-#include <sys/syslog.h>
+#include <atalk/logger.h>
#include <sys/time.h>
#include <sys/uio.h>
#include <netatalk/endian.h>
#include <atalk/pap.h>
#include "file.h"
+#include "lp.h"
+#include "session.h"
+
+int ps(struct papfile *infile, struct papfile *outfile, struct sockaddr_at *sat);
extern unsigned char connid, quantum, oquantum;
-char buf[ PAP_MAXQUANTUM ][ 4 + PAP_MAXDATA ];
-struct iovec niov[ PAP_MAXQUANTUM ] = {
+static char buf[ PAP_MAXQUANTUM ][ 4 + PAP_MAXDATA ];
+static struct iovec niov[ PAP_MAXQUANTUM ] = {
{ buf[ 0 ], 0 },
{ buf[ 1 ], 0 },
{ buf[ 2 ], 0 },
{ buf[ 6 ], 0 },
{ buf[ 7 ], 0 },
};
-struct iovec iov[ PAP_MAXQUANTUM ] = {
- { buf[ 0 ] + 4, 0 },
- { buf[ 1 ] + 4, 0 },
- { buf[ 2 ] + 4, 0 },
- { buf[ 3 ] + 4, 0 },
- { buf[ 4 ] + 4, 0 },
- { buf[ 5 ] + 4, 0 },
- { buf[ 6 ] + 4, 0 },
- { buf[ 7 ] + 4, 0 },
-};
/*
* Accept files until the client closes the connection.
* Read lines of a file, until the client sends eof, after
* which we'll send eof also.
*/
-session( atp, sat )
- ATP atp;
- struct sockaddr_at *sat;
+int session(ATP atp, struct sockaddr_at *sat)
{
struct timeval tv;
struct atp_block atpb;
char cbuf[ 578 ];
int i, cc, timeout = 0, readpending = 0;
u_int16_t seq = 0, rseq = 1, netseq;
- u_char readport;
+ u_char readport; /* uninitialized, OK 310105 */
infile.pf_state = PF_BOT;
- infile.pf_len = 0;
- infile.pf_buf = 0;
- infile.pf_cur = 0;
- infile.pf_end = 0;
+ infile.pf_bufsize = 0;
+ infile.pf_datalen = 0;
+ infile.pf_buf = NULL;
+ infile.pf_data = NULL;
outfile.pf_state = PF_BOT;
- outfile.pf_len = 0;
- outfile.pf_buf = 0;
- outfile.pf_cur = 0;
- outfile.pf_end = 0;
+ outfile.pf_bufsize = 0;
+ outfile.pf_datalen = 0;
+ outfile.pf_buf = NULL;
+ outfile.pf_data = NULL;
/*
* Ask for data.
cbuf[ 1 ] = PAP_READ;
if (++seq == 0) seq = 1;
netseq = htons( seq );
- bcopy( &netseq, &cbuf[ 2 ], sizeof( netseq ));
+ memcpy( &cbuf[ 2 ], &netseq, sizeof( netseq ));
atpb.atp_saddr = sat;
atpb.atp_sreqdata = cbuf;
atpb.atp_sreqdlen = 4; /* bytes in SendData request */
atpb.atp_sreqto = 5; /* retry timer */
atpb.atp_sreqtries = -1; /* infinite retries */
if ( atp_sreq( atp, &atpb, oquantum, ATP_XO )) {
- syslog( LOG_ERR, "atp_sreq: %m" );
- exit( 1 );
+ LOG(log_error, logtype_papd, "atp_sreq: %s", strerror(errno) );
+ return( -1 );
}
for (;;) {
FD_ZERO( &fds );
FD_SET( atp_fileno( atp ), &fds );
- if (( cc = select( FD_SETSIZE, &fds, 0, 0, &tv )) < 0 ) {
- syslog( LOG_ERR, "select: %m" );
- exit( 1 );
+ do { /* do list until success or an unrecoverable error occurs */
+ if (( cc = select( FD_SETSIZE, &fds, NULL, NULL, &tv )) < 0 )
+ LOG(log_error, logtype_papd, "select: %s", strerror(errno) ); /* log all errors */
+ } while (( cc < 0 ) && (errno == 4));
+
+ if ( cc < 0 ) {
+ LOG(log_error, logtype_papd, "select: Error is unrecoverable" );
+ return( -1 );
}
if ( cc == 0 ) {
if ( timeout++ > 2 ) {
- syslog( LOG_ERR, "connection timed out" );
+ LOG(log_error, logtype_papd, "connection timed out" );
lp_cancel();
- exit( 1 );
+ return( -1 );
}
/*
atpb.atp_sreqto = 0; /* best effort */
atpb.atp_sreqtries = 1; /* try once */
if ( atp_sreq( atp, &atpb, 0, 0 )) {
- syslog( LOG_ERR, "atp_sreq: %m" );
- exit( 1 );
+ LOG(log_error, logtype_papd, "atp_sreq: %s", strerror(errno) );
+ return( -1 );
}
continue;
} else {
timeout = 0;
}
- bzero( &ssat, sizeof( struct sockaddr_at ));
+ memset( &ssat, 0, sizeof( struct sockaddr_at ));
switch( atp_rsel( atp, &ssat, ATP_TRESP | ATP_TREQ )) {
case ATP_TREQ :
atpb.atp_saddr = &ssat;
atpb.atp_rreqdata = cbuf;
atpb.atp_rreqdlen = sizeof( cbuf );
if ( atp_rreq( atp, &atpb ) < 0 ) {
- syslog( LOG_ERR, "atp_rreq: %m" );
- exit( 1 );
+ LOG(log_error, logtype_papd, "atp_rreq: %s", strerror(errno) );
+ return( -1 );
}
/* sanity */
if ( (unsigned char)cbuf[ 0 ] != connid ) {
- syslog( LOG_ERR, "Bad ATP request!" );
+ LOG(log_error, logtype_papd, "Bad ATP request!" );
continue;
}
/*
* Other side is ready for some data.
*/
- bcopy( &cbuf[ 2 ], &netseq, sizeof( netseq ));
+ memcpy( &netseq, &cbuf[ 2 ], sizeof( netseq ));
if ( netseq != 0 ) {
if ( rseq != ntohs( netseq )) {
break;
* If we're in the middle of a file, clean up.
*/
if (( infile.pf_state & PF_BOT ) ||
- ( PF_BUFSIZ( &infile ) == 0 &&
+ ( infile.pf_datalen == 0 &&
( infile.pf_state & PF_EOF ))) {
lp_print();
} else {
atpb.atp_sresiov = niov;
atpb.atp_sresiovcnt = 1;
if ( atp_sresp( atp, &atpb ) < 0 ) {
- syslog( LOG_ERR, "atp_sresp: %m" );
+ LOG(log_error, logtype_papd, "atp_sresp: %s", strerror(errno) );
exit( 1 );
}
- exit( 0 );
+ return( 0 );
break;
case PAP_TICKLE :
break;
default :
- syslog( LOG_ERR, "Bad PAP request!" );
+ LOG(log_error, logtype_papd, "Bad PAP request!" );
}
break;
atpb.atp_rresiov = niov;
atpb.atp_rresiovcnt = oquantum;
if ( atp_rresp( atp, &atpb ) < 0 ) {
- syslog( LOG_ERR, "atp_rresp: %m" );
- exit( 1 );
+ LOG(log_error, logtype_papd, "atp_rresp: %s", strerror(errno) );
+ return( -1 );
}
/* sanity */
if ( ((unsigned char *)niov[ 0 ].iov_base)[ 0 ] != connid ||
((char *)niov[ 0 ].iov_base)[ 1 ] != PAP_DATA ) {
- syslog( LOG_ERR, "Bad data response!" );
+ LOG(log_error, logtype_papd, "Bad data response!" );
continue;
}
for ( i = 0; i < atpb.atp_rresiovcnt; i++ ) {
- APPEND( &infile,
- niov[ i ].iov_base + 4, niov[ i ].iov_len - 4 );
+ append( &infile,
+ (char *)niov[ i ].iov_base + 4, niov[ i ].iov_len - 4 );
if (( infile.pf_state & PF_EOF ) == 0 &&
((char *)niov[ 0 ].iov_base)[ 2 ] ) {
infile.pf_state |= PF_EOF;
}
/* move data */
- if ( ps( &infile, &outfile ) < 0 ) {
- syslog( LOG_ERR, "parse: bad return" );
- exit( 1 ); /* really? close? */
+ if ( ps( &infile, &outfile, sat ) < 0 ) {
+ LOG(log_error, logtype_papd, "parse: bad return" );
+ return( -1 ); /* really? close? */
}
/*
cbuf[ 1 ] = PAP_READ;
if ( ++seq == 0 ) seq = 1;
netseq = htons( seq );
- bcopy( &netseq, &cbuf[ 2 ], sizeof( netseq ));
+ memcpy( &cbuf[ 2 ], &netseq, sizeof( netseq ));
atpb.atp_saddr = sat;
atpb.atp_sreqdata = cbuf;
atpb.atp_sreqdlen = 4; /* bytes in SendData request */
atpb.atp_sreqto = 5; /* retry timer */
atpb.atp_sreqtries = -1; /* infinite retries */
if ( atp_sreq( atp, &atpb, oquantum, ATP_XO )) {
- syslog( LOG_ERR, "atp_sreq: %m" );
- exit( 1 );
+ LOG(log_error, logtype_papd, "atp_sreq: %s", strerror(errno) );
+ return( -1 );
}
break;
break;
default :
- syslog( LOG_ERR, "atp_rsel: %m" );
- exit( 1 );
+ LOG(log_error, logtype_papd, "atp_rsel: %s", strerror(errno) );
+ return( -1 );
}
/* send any data that we have */
if ( readpending &&
- ( PF_BUFSIZ( &outfile ) || ( outfile.pf_state & PF_EOF ))) {
+ ( outfile.pf_datalen || ( outfile.pf_state & PF_EOF ))) {
for ( i = 0; i < quantum; i++ ) {
((char *)niov[ i ].iov_base)[ 0 ] = connid;
((char *)niov[ i ].iov_base)[ 1 ] = PAP_DATA;
((char *)niov[ i ].iov_base)[ 2 ] =
((char *)niov[ i ].iov_base)[ 3 ] = 0;
- if ( PF_BUFSIZ( &outfile ) > PAP_MAXDATA ) {
+ if ( outfile.pf_datalen > PAP_MAXDATA ) {
cc = PAP_MAXDATA;
} else {
- cc = PF_BUFSIZ( &outfile );
+ cc = outfile.pf_datalen;
if ( outfile.pf_state & PF_EOF ) {
((char *)niov[ 0 ].iov_base)[ 2 ] = 1; /* eof */
outfile.pf_state = PF_BOT;
}
niov[ i ].iov_len = 4 + cc;
- bcopy( outfile.pf_cur, niov[ i ].iov_base + 4, cc );
+ memcpy( (char *)niov[ i ].iov_base + 4, outfile.pf_data, cc );
CONSUME( &outfile, cc );
- if ( PF_BUFSIZ( &outfile ) == 0 ) {
+ if ( outfile.pf_datalen == 0 ) {
i++;
break;
}
atpb.atp_sresiov = niov;
atpb.atp_sresiovcnt = i; /* reported by stevebn@pc1.eos.co.uk */
if ( atp_sresp( atp, &atpb ) < 0 ) {
- syslog( LOG_ERR, "atp_sresp: %m" );
- exit( 1 );
+ LOG(log_error, logtype_papd, "atp_sresp: %s", strerror(errno) );
+ return( -1 );
}
readpending = 0;
}