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

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

Overhalled the logging facility, packaging it so that it is
simmilar to bbftpd_private_auth. When compiling non-embedded bbftp
you can activate what is called "private-logging" with the
--enable-private-logging switch. As a result both the test_embedded.py
and test_bbftpd.py test scripts can be run without access to syslog.

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 <errno.h>
48
49#include <bbftpd_private_log.h>
50#if TIME_WITH_SYS_TIME
51# include <sys/time.h>
52# include <time.h>
53#else
54# if HAVE_SYS_TIME_H
55#  include <sys/time.h>
56# else
57#  include <time.h>
58# endif
59#endif
60#include <unistd.h>
61#include <utime.h>
62#if HAVE_STRING_H
63# include <string.h>
64#endif
65
66#include <netinet/in.h>
67#include <common.h>
68#include <daemon.h>
69#include <daemon_proto.h>
70#include <structures.h>
71
72extern int outcontrolsock ;
73extern  int     sendcontrolto ;
74
75int readmessage(int sock,char *buffer,int msglen,int to) 
76{
77    int    nbget ;
78    int    retcode ;
79    int        nfds ;
80    fd_set    selectmask ; /* Select mask */
81    struct timeval    wait_timer;
82
83    nbget = 0 ;
84/*
85** start the reading loop
86*/
87    while ( nbget < msglen ) {
88        nfds = sysconf(_SC_OPEN_MAX) ;
89        FD_ZERO(&selectmask) ;
90        FD_SET(sock,&selectmask) ;
91        wait_timer.tv_sec  = to ;
92        wait_timer.tv_usec = 0 ;
93        if ( (retcode = select(nfds,&selectmask,0,0,&wait_timer) ) == -1 ) {
94            /*
95            ** Select error
96            */
97            bbftpd_log(BBFTPD_ERR,"Read message : Select error : MSG (%d,%d)",msglen,nbget) ;
98            return -1 ;
99        } else if ( retcode == 0 ) {
100            bbftpd_log(BBFTPD_ERR,"Read message : Time out : MSG (%d,%d)",msglen,nbget) ;
101            return -1 ;
102        } else {
103            retcode = read(sock,&buffer[nbget],msglen-nbget) ;
104            if ( retcode < 0 ) {
105                bbftpd_log(BBFTPD_ERR,"Read message : Receive error : MSG (%d,%d) : %s",msglen,nbget,strerror(errno)) ;
106                return -1 ;
107            } else if ( retcode == 0 ) {
108                bbftpd_log(BBFTPD_ERR,"Read message : Connexion breaks") ;
109                return -1 ;
110            } else {
111                nbget = nbget + retcode ;
112            }
113        }
114    }
115    return(0) ;
116}
117
118int discardmessage(int sock,int msglen,int to) 
119{
120    int    nbget ;
121    int    retcode ;
122    int        nfds ;
123    fd_set    selectmask ; /* Select mask */
124    struct timeval    wait_timer;
125    char buffer[256] ;
126   
127    /*
128    ** We are going to read buflen by buflen till the message
129    ** is exhausted
130    */
131   
132    nbget = 0 ;
133    while ( nbget < msglen ) {
134        nfds = sysconf(_SC_OPEN_MAX) ;
135        FD_ZERO(&selectmask) ;
136        FD_SET(sock,&selectmask) ;
137        wait_timer.tv_sec  = to ;
138        wait_timer.tv_usec = 0 ;
139        if ( (retcode = select(nfds,&selectmask,0,0,&wait_timer) ) == -1 ) {
140            /*
141            ** Select error
142            */
143            bbftpd_log(BBFTPD_ERR,"Discard message : Select error : MSG (%d,%d)",msglen,nbget) ;
144            return -1 ;
145        } else if ( retcode == 0 ) {
146            bbftpd_log(BBFTPD_ERR,"Discard message : Time out : MSG (%d,%d)",msglen,nbget) ;
147            return -1 ;
148        } else {
149            retcode = recv(sock,buffer,sizeof(buffer),0) ;
150            if ( retcode < 0 ) {
151                bbftpd_log(BBFTPD_ERR,"Discard message : Receive error : MSG (%d,%d) : %s",msglen,nbget,strerror(errno)) ;
152                return -1 ;
153            } else if ( retcode == 0 ) {
154                bbftpd_log(BBFTPD_ERR,"Discard message : Connexion breaks") ;
155                return -1 ;
156            } else {
157                nbget = nbget + retcode ;
158            }
159        }
160    }
161    return(0) ;
162}
163       
164int writemessage(int sock,char *buffer,int msglen,int to) 
165{
166    int    nbsent ;
167    int    retcode ;
168    int        nfds ;
169    fd_set    selectmask ; /* Select mask */
170    struct timeval    wait_timer;
171
172    nbsent = 0 ;
173/*
174** start the writing loop
175*/
176    while ( nbsent < msglen ) {
177        nfds = sysconf(_SC_OPEN_MAX) ;
178        FD_ZERO(&selectmask) ;
179        FD_SET(sock,&selectmask) ;
180        wait_timer.tv_sec  = to ;
181        wait_timer.tv_usec = 0 ;
182        if ( (retcode = select(nfds,0,&selectmask,0,&wait_timer) ) == -1 ) {
183            /*
184            ** Select error
185            */
186            bbftpd_log(BBFTPD_ERR,"Write message : Select error : MSG (%d,%d)",msglen,nbsent) ;
187            return -1 ;
188        } else if ( retcode == 0 ) {
189            bbftpd_log(BBFTPD_ERR,"Write message : Time out : MSG (%d,%d)",msglen,nbsent) ;
190            return -1 ;
191        } else {
192            retcode = write(sock,&buffer[nbsent],msglen-nbsent) ;
193            if ( retcode < 0 ) {
194                bbftpd_log(BBFTPD_ERR,"Write message : write error : MSG (%d,%d) : %s",msglen,nbsent,strerror(errno)) ;
195                return -1 ;
196            } else if ( retcode == 0 ) {
197                bbftpd_log(BBFTPD_ERR,"Write message : Connexion breaks") ;
198                return -1 ;
199            } else {
200                nbsent = nbsent + retcode ;
201            }
202        }
203    }
204    return(0) ;
205}
206
207void reply(int n, char *str)
208{
209    struct message    *mess ;
210    int    lentosend ;
211    char buf[MINMESSLEN] ;
212   
213    mess = (struct message *) buf ;
214    mess->code = n ;
215#ifndef WORDS_BIGENDIAN
216    mess->msglen = ntohl(strlen(str)) ;
217#else
218    mess->msglen = strlen(str) ;
219#endif
220    if ( writemessage(outcontrolsock,buf,MINMESSLEN,sendcontrolto) < 0 ) {
221        bbftpd_log(BBFTPD_ERR,"Error on reply") ;
222        clean_child() ;
223        exit(1) ;
224    }
225    lentosend = strlen(str) ;
226    if ( writemessage(outcontrolsock,str,lentosend,sendcontrolto) < 0 ) {
227        bbftpd_log(BBFTPD_ERR,"Error on reply") ;
228        clean_child() ;
229        exit(1) ;
230    }
231}
232 
Note: See TracBrowser for help on using the repository browser.