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

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

Eliminated all "implicit declaration" warnings from "python setup.py
build"

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