source: TI05-delivery/trunk/src/bbftp-server-3.2.0/bbftpd/bbftpd_message.c @ 1426

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

Added temporary debug code.

Line 
1/*
2 * bbftpd/bbftpd_message.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 
26 bbftpd_message.c   v 0.0.0  1999/11/24
27                    v 1.6.0  2000/03/24 - Take the readmessage routine from
28                                          bbftpc which is more flexible the
29                                          only difference is that this one is
30                                          logging into bbftpd_log
31                    v 1.6.1  2000/03/24 - Portage to OSF1
32                                        - Set the socket in non block mode
33                    v 1.8.7  2000/05/30 - Portage to IRIX64
34                    v 1.8.10 2000/08/11 - Portage to Linux
35                    v 1.9.0  2000/08/24 - Use configure to help port
36                    v 1.9.4  2000/10/16 - Supress %m
37                    v 2.0.0  2000/12/07 - Introduce discardmessage routine
38                                        - Replace recv by read for ssh mode
39                                          (Tim Adye)
40                    v 2.0.1 2001/04/23  - Correct indentation
41                    v 2.1.0 2001/06/01  - Set all messages routine in one
42                                          file
43
44*****************************************************************************/
45#include <bbftpd.h>
46
47#include <stdlib.h>
48
49#include <errno.h>
50
51#include <bbftpd_private_log.h>
52#if TIME_WITH_SYS_TIME
53# include <sys/time.h>
54# include <time.h>
55#else
56# if HAVE_SYS_TIME_H
57#  include <sys/time.h>
58# else
59#  include <time.h>
60# endif
61#endif
62#include <unistd.h>
63#include <utime.h>
64#if HAVE_STRING_H
65# include <string.h>
66#endif
67
68#include <netinet/in.h>
69#include <common.h>
70#include <daemon.h>
71#include <daemon_proto.h>
72#include <structures.h>
73
74extern int outcontrolsock ;
75extern  int     sendcontrolto ;
76
77int readmessage(int sock,char *buffer,int msglen,int to) 
78{
79    int    nbget ;
80    int    retcode ;
81    int        nfds ;
82    fd_set    selectmask ; /* Select mask */
83    struct timeval    wait_timer;
84
85    nbget = 0 ;
86/*
87** start the reading loop
88*/
89    while ( nbget < msglen ) {
90        nfds = sysconf(_SC_OPEN_MAX) ;
91        FD_ZERO(&selectmask) ;
92        FD_SET(sock,&selectmask) ;
93        wait_timer.tv_sec  = to ;
94        wait_timer.tv_usec = 0 ;
95        if ( (retcode = select(nfds,&selectmask,0,0,&wait_timer) ) == -1 ) {
96            /*
97            ** Select error
98            */
99            bbftpd_log(BBFTPD_ERR,"Read message : Select error : MSG (%d,%d)",msglen,nbget) ;
100            return -1 ;
101        } else if ( retcode == 0 ) {
102            bbftpd_log(BBFTPD_ERR,"Read message : Time out : MSG (%d,%d)",msglen,nbget) ;
103            return -1 ;
104        } else {
105            retcode = read(sock,&buffer[nbget],msglen-nbget) ;
106            if ( retcode < 0 ) {
107                bbftpd_log(BBFTPD_ERR,"Read message : Receive error : MSG (%d,%d) : %s",msglen,nbget,strerror(errno)) ;
108                return -1 ;
109            } else if ( retcode == 0 ) {
110                bbftpd_log(BBFTPD_ERR,"Read message : Connexion breaks") ;
111                return -1 ;
112            } else {
113                nbget = nbget + retcode ;
114            }
115        }
116    }
117
118    // DEBUG
119    // Do a checksum of the message and log it.
120    int i, c;
121    c = 0;
122    for (i = 0; i < msglen; i++) {
123      c += (int)buffer[i];
124    }
125    bbftpd_log(LOG_DEBUG, "readmessage: %d, chksum: %d", msglen, c);
126
127    return(0) ;
128
129
130}
131
132int discardmessage(int sock,int msglen,int to) 
133{
134    int    nbget ;
135    int    retcode ;
136    int        nfds ;
137    fd_set    selectmask ; /* Select mask */
138    struct timeval    wait_timer;
139    char buffer[256] ;
140   
141    // DEBUG
142    bbftpd_log(LOG_DEBUG, "discardmessage: %d", msglen);
143
144
145    /*
146    ** We are going to read buflen by buflen till the message
147    ** is exhausted
148    */
149   
150    nbget = 0 ;
151    while ( nbget < msglen ) {
152        nfds = sysconf(_SC_OPEN_MAX) ;
153        FD_ZERO(&selectmask) ;
154        FD_SET(sock,&selectmask) ;
155        wait_timer.tv_sec  = to ;
156        wait_timer.tv_usec = 0 ;
157        if ( (retcode = select(nfds,&selectmask,0,0,&wait_timer) ) == -1 ) {
158            /*
159            ** Select error
160            */
161            bbftpd_log(BBFTPD_ERR,"Discard message : Select error : MSG (%d,%d)",msglen,nbget) ;
162            return -1 ;
163        } else if ( retcode == 0 ) {
164            bbftpd_log(BBFTPD_ERR,"Discard message : Time out : MSG (%d,%d)",msglen,nbget) ;
165            return -1 ;
166        } else {
167            retcode = recv(sock,buffer,sizeof(buffer),0) ;
168            if ( retcode < 0 ) {
169                bbftpd_log(BBFTPD_ERR,"Discard message : Receive error : MSG (%d,%d) : %s",msglen,nbget,strerror(errno)) ;
170                return -1 ;
171            } else if ( retcode == 0 ) {
172                bbftpd_log(BBFTPD_ERR,"Discard message : Connexion breaks") ;
173                return -1 ;
174            } else {
175                nbget = nbget + retcode ;
176            }
177        }
178    }
179    return(0) ;
180}
181       
182int writemessage(int sock,char *buffer,int msglen,int to) 
183{
184    int    nbsent ;
185    int    retcode ;
186    int        nfds ;
187    fd_set    selectmask ; /* Select mask */
188    struct timeval    wait_timer;
189
190    nbsent = 0 ;
191
192    // DEBUG
193    // Do a checksum of the message and log it.
194    int i, c;
195    c = 0;
196    for (i = 0; i < msglen; i++) {
197      c += (int)buffer[i];
198    }
199    bbftpd_log(LOG_DEBUG, "writemessage: %d, chksum: %d", msglen, c);
200
201
202/*
203** start the writing loop
204*/
205    while ( nbsent < msglen ) {
206        nfds = sysconf(_SC_OPEN_MAX) ;
207        FD_ZERO(&selectmask) ;
208        FD_SET(sock,&selectmask) ;
209        wait_timer.tv_sec  = to ;
210        wait_timer.tv_usec = 0 ;
211        if ( (retcode = select(nfds,0,&selectmask,0,&wait_timer) ) == -1 ) {
212            /*
213            ** Select error
214            */
215            bbftpd_log(BBFTPD_ERR,"Write message : Select error : MSG (%d,%d)",msglen,nbsent) ;
216            return -1 ;
217        } else if ( retcode == 0 ) {
218            bbftpd_log(BBFTPD_ERR,"Write message : Time out : MSG (%d,%d)",msglen,nbsent) ;
219            return -1 ;
220        } else {
221            retcode = write(sock,&buffer[nbsent],msglen-nbsent) ;
222            if ( retcode < 0 ) {
223                bbftpd_log(BBFTPD_ERR,"Write message : write error : MSG (%d,%d) : %s",msglen,nbsent,strerror(errno)) ;
224                return -1 ;
225            } else if ( retcode == 0 ) {
226                bbftpd_log(BBFTPD_ERR,"Write message : Connexion breaks") ;
227                return -1 ;
228            } else {
229                nbsent = nbsent + retcode ;
230            }
231        }
232    }
233    return(0) ;
234}
235
236void reply(int n, char *str)
237{
238    struct message    *mess ;
239    int    lentosend ;
240    char buf[MINMESSLEN] ;
241   
242    mess = (struct message *) buf ;
243    mess->code = n ;
244#ifndef WORDS_BIGENDIAN
245    mess->msglen = ntohl(strlen(str)) ;
246#else
247    mess->msglen = strlen(str) ;
248#endif
249    if ( writemessage(outcontrolsock,buf,MINMESSLEN,sendcontrolto) < 0 ) {
250        bbftpd_log(BBFTPD_ERR,"Error on reply") ;
251        clean_child() ;
252        exit(1) ;
253    }
254    lentosend = strlen(str) ;
255    if ( writemessage(outcontrolsock,str,lentosend,sendcontrolto) < 0 ) {
256        bbftpd_log(BBFTPD_ERR,"Error on reply") ;
257        clean_child() ;
258        exit(1) ;
259    }
260}
261 
Note: See TracBrowser for help on using the repository browser.