comparison src/protocol.c @ 144:8b9366fc1361 noffle

[svn] Added timeout to Prt_getLn to avoid Noffle hanging if the connection breaks down during a fetch.
author enz
date Sat, 23 Sep 2000 11:40:35 +0100
parents 3c71e28c8eef
children 1c7303c71f66
comparison
equal deleted inserted replaced
143:7400a8e9d5ba 144:8b9366fc1361
1 /* 1 /*
2 protocol.c 2 protocol.c
3 3
4 $Id: protocol.c 183 2000-07-25 12:14:54Z bears $ 4 $Id: protocol.c 217 2000-09-23 10:40:35Z enz $
5 */ 5 */
6 6
7 #if HAVE_CONFIG_H 7 #if HAVE_CONFIG_H
8 #include <config.h> 8 #include <config.h>
9 #endif 9 #endif
10 10
11 #include <stdio.h> 11 #include <stdio.h>
12 #include <ctype.h> 12 #include <ctype.h>
13 #include <netdb.h> 13 #include <netdb.h>
14 #include <signal.h>
14 #include <sys/types.h> 15 #include <sys/types.h>
15 #include <sys/utsname.h> 16 #include <sys/utsname.h>
17 #include <unistd.h>
16 #include "common.h" 18 #include "common.h"
17 #include "dynamicstring.h" 19 #include "dynamicstring.h"
18 #include "log.h" 20 #include "log.h"
19 #include "over.h" 21 #include "over.h"
20 #include "util.h" 22 #include "util.h"
21 #include "protocol.h" 23 #include "protocol.h"
22 #include "portable.h" 24 #include "portable.h"
23 25
24 Bool 26 static void
25 Prt_getLn( Str line, FILE *f ) 27 readAlarm( int sig )
28 {
29 UNUSED( sig );
30
31 return;
32 }
33
34 static sig_t
35 installSignalHandler( int sig, sig_t handler )
36 {
37 struct sigaction act, oldAct;
38
39 act.sa_handler = handler;
40 sigemptyset( &act.sa_mask );
41 act.sa_flags = 0;
42 if ( sig == SIGALRM )
43 act.sa_flags |= SA_INTERRUPT;
44 else
45 act.sa_flags |= SA_RESTART;
46 if ( sigaction( sig, &act, &oldAct ) < 0 )
47 return SIG_ERR;
48 return oldAct.sa_handler;
49 }
50
51 Bool
52 Prt_getLn( Str line, FILE *f, int timeoutSeconds )
26 { 53 {
27 size_t len; 54 size_t len;
28 55 char *ret;
56 sig_t oldHandler = NULL;
57
58 if ( timeoutSeconds >= 0 )
59 {
60 oldHandler = installSignalHandler( SIGALRM, readAlarm );
61 if ( oldHandler == SIG_ERR )
62 {
63 Log_err( "Prt_getLn: signal failed." );
64 return FALSE;
65 }
66 if ( alarm( timeoutSeconds ) != 0 )
67 Log_err( "Prt_getLn: Alarm was already set." );
68 }
29 /* 69 /*
30 We also accept lines ending with "\n" instead of "\r\n", some 70 We also accept lines ending with "\n" instead of "\r\n", some
31 clients wrongly send such lines. 71 clients wrongly send such lines.
32 */ 72 */
33 if ( ! fgets( line, MAXCHAR, f ) ) 73 ret = fgets( line, MAXCHAR, f );
34 { 74 if ( timeoutSeconds >= 0 )
35 Log_dbg( "Prt_getLn failed" ); 75 {
76 alarm( 0 );
77 installSignalHandler( SIGALRM, oldHandler );
78 }
79 if ( ret == NULL )
36 return FALSE; 80 return FALSE;
37 }
38 len = strlen( line ); 81 len = strlen( line );
39 if ( line[ len - 1 ] == '\n' ) 82 if ( line[ len - 1 ] == '\n' )
40 { 83 {
41 line[ len - 1 ] = '\0'; 84 line[ len - 1 ] = '\0';
42 if ( line[ len - 2 ] == '\r' ) 85 if ( line[ len - 2 ] == '\r' )
45 Log_dbg( "[R] %s", line ); 88 Log_dbg( "[R] %s", line );
46 return TRUE; 89 return TRUE;
47 } 90 }
48 91
49 Bool 92 Bool
50 Prt_getTxtLn( Str line, Bool *err, FILE *f ) 93 Prt_getTxtLn( Str line, Bool *err, FILE *f, int timeoutSeconds )
51 { 94 {
52 Str buf; 95 Str buf;
53 96
54 if ( ! Prt_getLn( buf, f ) ) 97 if ( ! Prt_getLn( buf, f, timeoutSeconds ) )
55 { 98 {
56 Log_err( "Cannot get text line" ); 99 Log_err( "Cannot get text line" );
57 *err = TRUE; 100 *err = TRUE;
58 return FALSE; 101 return FALSE;
59 } 102 }