• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/ap/gpl/timemachine/netatalk-2.2.5/libatalk/atp/
1/*
2 * $Id: atp_close.c,v 1.5 2009-10-13 22:55:37 didg Exp $
3 *
4 * Copyright (c) 1990,1997 Regents of The University of Michigan.
5 * All Rights Reserved. See COPYRIGHT.
6 */
7
8#ifdef HAVE_CONFIG_H
9#include "config.h"
10#endif /* HAVE_CONFIG_H */
11
12#include <stdlib.h>
13#include <sys/types.h>
14#include <sys/time.h>
15#include <sys/socket.h>
16
17#include <netatalk/at.h>
18#include <atalk/netddp.h>
19#include <atalk/atp.h>
20#include "atp_internals.h"
21#ifdef EBUG
22#include <stdio.h>
23#endif /* EBUG */
24
25int atp_close(ATP ah)
26{
27    struct atpbuf	*cq;
28    int			i;
29
30    /* remove from list of open atp sockets & discard queued data
31    */
32#ifdef EBUG
33    print_bufuse( ah, "atp_close");
34#endif /* EBUG */
35
36    while ( ah->atph_queue != NULL ) {
37	cq = ah->atph_queue;
38	ah->atph_queue = cq->atpbuf_next;
39	atp_free_buf( cq );
40    }
41
42    while ( ah->atph_sent != NULL ) {
43	cq = ah->atph_sent;
44	for ( i = 0; i < 8; ++i ) {
45	    if ( cq->atpbuf_info.atpbuf_xo.atpxo_packet[ i ] != NULL ) {
46		atp_free_buf( cq->atpbuf_info.atpbuf_xo.atpxo_packet[ i ] );
47	    }
48	}
49	ah->atph_sent = cq->atpbuf_next;
50	atp_free_buf( cq );
51    }
52
53    if ( ah->atph_reqpkt != NULL ) {
54	atp_free_buf( ah->atph_reqpkt );
55	ah->atph_reqpkt = NULL;
56    }
57
58    for ( i = 0; i < 8; ++i ) {
59	if ( ah->atph_resppkt[ i ] != NULL ) {
60	    atp_free_buf( ah->atph_resppkt[ i ] );
61	    ah->atph_resppkt[ i ] = NULL;
62	}
63    }
64
65#ifdef EBUG
66    print_bufuse( ah, "atp_close end");
67#endif /* EBUG */
68
69    i = ah->atph_socket;
70    atp_free_buf( (struct atpbuf *) ah );
71
72    if (netddp_close(i) < 0)
73      return -1;
74
75    return 0;
76}
77