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