source: TI05-delivery/trunk/src/bbftp-server-3.2.0/bbftpd/readcontrol.c @ 773

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI05-delivery/trunk/src/bbftp-server-3.2.0/bbftpd/readcontrol.c@773
Revision 773, 6.1 KB checked in by spascoe, 14 years ago (diff)

Initial import of bbftp source

Line 
1/*
2 * bbftpd/readcontrol.c
3 * Copyright (C) 1999, 2000, 2001, 2002 IN2P3, CNRS
4 * bbftp@in2p3.fr
5 * http://doc.in2p3.fr/bbftp
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20 */ 
21
22/****************************************************************************
23
24 
25 RETURN:
26         0  calling program return to main loop
27        -1 calling program exit
28 
29 readcontrol.c v 0.0.0 1999/11/24
30               v 1.2.0 2000/01/26
31               v 1.3.0 2000/03/20   - Externalise the socket creation in order
32                                      to be able to retry the connection if we
33                                      where interrupted by a signal. 
34                                      (createreceivesock.c)
35                                      Bug shown by amlutz
36                                    - In case of problem in the father send
37                                      a reply bad but prevent children to resend
38                                      it by setting childendinerror to 1
39                                      Bug shown by amlutz
40               v 1.4.0 2000/03/22   - Use new encryption protocol
41               v 1.6.0 2000/03/24   - Reorganize the logic to split readcontrol
42                                      in several files
43                                    - Add sendafile call
44               v 1.8.5 2000/04/28   - Add createadir call
45               v 1.8.7 2000/05/24   - Modify headers
46               v 1.8.8 2000/06/02   - Add changetodir call
47                                    - Add sendlist call
48               v 1.9.0 2000/08/18   - Use configure to help portage
49               v 2.0.0 2000/12/07   - Discard completly unkown messages in
50                                      logged state
51               v 2.0.1 2001/04/23   - Correct indentation
52             
53*****************************************************************************/
54#include <sys/time.h>
55#include <netinet/in.h>
56#include <syslog.h>
57
58#include <bbftpd.h>
59#include <common.h>
60#include <daemon.h>
61#include <status.h>
62#include <structures.h>
63#include <version.h>
64
65extern int state ;
66extern int msgsock ;
67extern int unlinkfile ;
68extern int pid_child[MAXPORT] ;
69extern  int     recvcontrolto ;
70
71int readcontrol(int msgcode,int msglen) {
72
73    int        retcode ;
74    int        i ;
75   
76    /*
77    ** The message on control socket has already been read
78    */
79    /*
80    ** Depending on the state the accepted message may be different
81    */
82    switch (state) {
83        /*
84        ** State connected : Not called here started with v2
85        */
86        case S_LOGGED : {
87            /*
88            ** Initilize the pid array
89            */
90            for ( i=0 ; i< MAXPORT ; i++) {
91                pid_child[i] = 0 ;
92            }
93            unlinkfile = 0 ;
94            switch (msgcode) {
95#ifdef WITH_GZIP
96                case MSG_STORE_C :
97#else
98                case MSG_STORE_C : {
99                    syslog(BBFTPD_ERR,"Compression is not available on this server") ;
100                    retcode = discardmessage(msgsock,msglen,recvcontrolto) ;
101                    reply(MSG_BAD_NO_RETRY,"Compression is not available on this server") ;
102                    return retcode ;
103                }
104#endif
105                case MSG_STORE : {
106                    retcode = storeafile(msgcode) ;
107                    return retcode ;
108                }
109
110
111#ifdef WITH_GZIP
112                case MSG_RETR_C :
113#else
114                case MSG_RETR_C : {
115                    syslog(BBFTPD_ERR,"Compression is not available on this server") ;
116                    retcode = discardmessage(msgsock,msglen,recvcontrolto) ;
117                    reply(MSG_BAD_NO_RETRY,"Compression is not available on this server") ;
118                    return retcode ;
119                }
120#endif
121                case MSG_RETR : {
122                    retcode = sendafile(msgcode) ;
123                    return retcode ;
124                }
125
126#ifdef WITH_GZIP
127                case MSG_RETR_RFIO_C :
128#else
129                case MSG_RETR_RFIO_C : {
130                    syslog(BBFTPD_ERR,"Compression is not available on this server") ;
131                    retcode = discardmessage(msgsock,msglen,recvcontrolto) ;
132                    reply(MSG_BAD_NO_RETRY,"Compression is not available on this server") ;
133                    return retcode ;
134                }
135#endif
136                case MSG_RETR_RFIO : {
137#if defined(WITH_RFIO) || defined(WITH_RFIO64)
138                    retcode = sendafilerfio(msgcode) ;
139                    return retcode ;
140#else
141                    syslog(BBFTPD_ERR,"Retreive RFIO not supported") ;
142                    reply(MSG_BAD_NO_RETRY,"Retreive RFIO not supported") ;
143                    return 0 ;
144#endif
145                }
146
147
148                case MSG_MKDIR :{
149                    retcode = createadir(msgcode,msglen) ;
150                    return retcode ;
151                }
152                case MSG_CHDIR :{
153                    retcode = changetodir(msgcode,msglen) ;
154                    return retcode ;
155                }
156                case MSG_LIST :{
157                    retcode = sendlist(msgcode,msglen) ;
158                    return retcode ;
159                }
160                default : {
161                    syslog(BBFTPD_ERR,"Unkown message in logged state %d ",msgcode) ;
162                    retcode = discardmessage(msgsock,msglen,recvcontrolto) ;
163                    reply(MSG_BAD_NO_RETRY,"Unkown message in logged state") ;
164                    return retcode ;
165                }
166            }
167        }
168        default :
169            syslog(BBFTPD_ERR,"Receive message in state %d",state) ;
170            return -1 ;
171    }
172}
Note: See TracBrowser for help on using the repository browser.