]> arthur.barton.de Git - netatalk.git/blob - libatalk/pap/pap_close.c
autoconf POSIX.1 sys/wait.h check
[netatalk.git] / libatalk / pap / pap_close.c
1 /*
2  * $Id: pap_close.c,v 1.3 2001-06-29 14:14:47 rufustfirefly Exp $
3  *
4  * close the connection
5  */
6
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif /* HAVE_CONFIG_H */
10
11 int pap_close(PAP pap)
12 {
13   struct atp_block atpb;
14   struct iovec iov;
15   unsigned char buf[PAP_HDRSIZ];
16   int err = -1;
17
18   buf[ 0 ] = pap->pap_connid;
19   buf[ 1 ] = PAP_CLOSE;
20   buf[ 2 ] = buf[ 3 ] = 0;
21
22   atpb.atp_saddr = &pap->pap_sat;
23   atpb.atp_sreqdata = buf;
24   atpb.atp_sreqdlen = sizeof(buf);      /* bytes in CloseConn request */
25   atpb.atp_sreqto = 2;                  /* retry timer */
26   atpb.atp_sreqtries = 5;               /* retry count */
27   if (atp_sreq( atp, &atpb, 1, ATP_XO ) < 0) {
28     goto close_done;
29   }
30
31   /* check for CloseConnReply */
32   iov.iov_base = pap->pap_data;
33   iov.iov_len = sizeof( pap->pap_data );
34   atpb.atp_rresiov = &iov;
35   atpb.atp_rresiovcnt = 1;
36   if ( atp_rresp( pap->pap_atp, &atpb ) < 0 ) {
37     goto close_done;
38   }
39   
40   /* sanity */
41   if ( iov.iov_len != 4 || pap->pap_data[ 0 ] != pap->pap_connid ||
42        pap->pap_data[ 1 ] != PAP_CLOSEREPLY ) {
43     syslog(LOG_ERR, "pap_close: Bad response!");
44     goto close_done;
45   }
46   err = 0;
47
48 close_done:
49   atp_close(pap->pap_atp);
50   free(pap);
51   return err;
52 }