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