source: TI05-delivery/trunk/src/bbftp-server-3.2.0/bbftpd/signals_routines.c @ 1392

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

More missing #includes exposed when compiling on easterly.

Line 
1/*
2 * bbftpd/signals_routines.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 signals_routines.c v 2.0.0 2000/12/14  - Replace files set_signals.c and
27                                          set_father_signals.c
28                    v 2.0.1 2001/04/23  - Correct indentation
29                    v 2.0.2 2001/05/04  - Correct include for RFIO
30 
31*****************************************************************************/
32#include <bbftpd.h>
33
34#include <stdio.h>
35
36#include <errno.h>
37#include <signal.h>
38#include <sys/wait.h>
39#include <bbftpd_private_log.h>
40#include <netinet/in.h>
41#include <sys/socket.h>
42#include <utime.h>
43#if HAVE_STRING_H
44# include <string.h>
45#endif
46
47#include <daemon.h>
48#include <daemon_proto.h>
49#include <status.h>
50#include <structures.h>
51
52/*#ifdef RFIO
53**#include <shift.h>
54**#endif
55*/
56/*
57** For V1 Protocol
58*/
59extern int  pid_child[MAXPORT] ;
60extern char currentfilename[MAXLENFILE];
61/*
62** For V1 and V2 Protocol
63*/
64extern int  flagsighup;
65extern int  childendinerror ;
66extern int  state ;
67extern int  killdone ;
68extern int  unlinkfile ;
69extern pid_t    fatherpid ;
70/*
71** For V2 protocol
72*/
73extern char *realfilename ;
74extern char *curfilename ;
75extern int  transferoption ;
76extern int  *mychildren ;
77extern int  nbpidchild ;
78extern char lastaccess[9] ;
79extern char lastmodif[9] ;
80extern int  filemode ;
81
82int checkendchild(status)
83    int status ;
84{
85   
86    if (WEXITSTATUS(status) == 0 ) {
87        if ( WIFSIGNALED(status) == 0 ) {
88            return(0) ;
89        } else {
90            /*
91            ** In order to differenciate signal and ernno we choose
92            ** to return ENOEXEC in case of signal
93            */
94            return(ENOEXEC) ;
95        }
96    } else {
97        return(WEXITSTATUS(status)) ;
98    }             
99}
100
101void in_sigchld_v1(sig) 
102int        sig ;
103{
104    int    pid ;
105    int    status ;
106    int    totpid ;
107    int i ;
108    char logmessage[256] ;
109    int    retcode ;
110   
111    /*
112    ** We are going to check if the process generating this
113    ** signal was not already detected as dead. This was causing
114    ** a send of a MSG_OK if all process have been dectected dead
115    ** througn the waitpid routine and the signal was pending.
116    ** If all processes have been detected dead before childendinerror
117    ** to 0, totpid also so we send a reply MSS_OK
118    */
119    totpid = 0 ;
120    for ( i=0 ; i< MAXPORT; i++) {
121        totpid = totpid + pid_child[i] ;
122    }
123    if ( totpid == 0 ) {
124        /*
125        ** All Ended
126        */
127        return ;
128    }
129    totpid = 0 ;
130/*
131** Check the status
132*/
133    for ( i=0 ; i< MAXPORT; i++) {
134        if ( pid_child[i] != 0 ) {
135            pid = waitpid(pid_child[i],&status,WNOHANG) ;
136            if ( pid == pid_child[i] ) {
137                /*
138                ** the process has ended
139                */
140                if ( (retcode = checkendchild(status)) != 0 ) {
141                    if ( childendinerror == 0 ) {
142                        childendinerror = 1 ;
143                        bbftpd_log(BBFTPD_ERR,"Child pid %d ends in error status %d",pid,retcode) ;
144                        if ( unlinkfile == 1 ) unlink(currentfilename) ;
145                        if (retcode == 255) {
146                            sprintf(logmessage,"Disk quota excedeed or No Space left on device") ;
147                            reply(MSG_BAD_NO_RETRY,logmessage) ;
148                        } else {
149                            if (retcode ==  ENOEXEC ) {
150                                sprintf(logmessage,"Interrupted by signal") ;
151                            } else {
152                                sprintf(logmessage,"%s",strerror(retcode)) ;
153                            }
154                            reply(MSG_BAD,logmessage) ;
155                        }
156                    } else {
157                        bbftpd_log(BBFTPD_ERR,"Child pid %d ends in error",pid) ;
158                    }
159                }
160                pid_child[i] = 0 ;
161            }   
162        }
163    }
164    for ( i=0 ; i< MAXPORT; i++) {
165        totpid = totpid + pid_child[i] ;
166    }
167    if ( totpid == 0 && childendinerror == 0 ) {
168        state = S_LOGGED ;
169        reply(MSG_OK,"OK") ;
170    } 
171    if ( childendinerror == 1 ) {
172        clean_child() ;
173    }
174    if (totpid == 0 ) {
175        state = S_LOGGED ;
176        unlinkfile = 0 ;
177        killdone = 0 ;
178        childendinerror = 0 ;
179    }
180}
181
182void in_sighup_v1(sig) 
183int        sig ;
184{
185    flagsighup = 1 ;
186}
187
188
189void in_sigterm_v1(sig) 
190int        sig ;
191{
192    if ( fatherpid == getpid() ) {
193        /*
194        ** We are in father
195        */
196        /*
197        ** Unlink the file if we are getting a file
198        */ 
199        if ( unlinkfile == 1 ) unlink(currentfilename) ;
200        clean_child() ;
201        exit(0) ;       /* BUG porting */
202    } else {
203        exit(EINTR) ;
204    }
205}
206
207
208int set_signals_v1() {
209    struct    sigaction    sga ;
210   
211    sga.sa_handler = SIG_IGN ;
212    sigemptyset(&(sga.sa_mask));
213    sga.sa_flags = 0   ;
214    if ( sigaction(SIGPIPE,&sga,0) < 0 ) {
215        bbftpd_log(BBFTPD_ERR,"Error sigaction SIGPIPE : %s",strerror(errno)) ;
216        return(-1) ;
217    }
218    sga.sa_handler = in_sigchld_v1 ;
219    sigemptyset(&(sga.sa_mask));
220    sga.sa_flags = 0  ;
221    if ( sigaction(SIGCHLD,&sga,0) < 0 ) {
222        bbftpd_log(BBFTPD_ERR,"Error sigaction SIGCHLD : %s",strerror(errno)) ;
223        return(-1) ;
224    }
225    sga.sa_handler = in_sighup_v1 ;
226    sigemptyset(&(sga.sa_mask));
227    sga.sa_flags = 0  ;
228    if ( sigaction(SIGHUP,&sga,0) < 0 ) {
229        bbftpd_log(BBFTPD_ERR,"Error sigaction SIGHUP : %s",strerror(errno)) ;
230        return(-1) ;
231    }
232    sga.sa_handler = in_sigterm_v1 ;
233    sigemptyset(&(sga.sa_mask));
234    sga.sa_flags = 0  ;
235    if ( sigaction(SIGTERM,&sga,0) < 0 ) {
236        bbftpd_log(BBFTPD_ERR,"Error sigaction SIGTERM : %s",strerror(errno)) ;
237        return(-1) ;
238    }
239    return 0 ;
240}
241
Note: See TracBrowser for help on using the repository browser.