Mercurial > noffle
annotate src/util.c @ 493:4d3a1597813a noffle
[svn] updated FSF address
author | godisch |
---|---|
date | Sun, 16 Apr 2006 07:20:58 +0100 |
parents | 95697d7c97a1 |
children |
rev | line source |
---|---|
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
1 /* |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
2 util.c |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
3 |
463
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
4 $Id: util.c 608 2003-07-23 09:31:01Z bears $ |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
5 */ |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
6 |
45
32ba1198c6fa
[svn] * Makefile.in, configure, configure.in, docs/Makefile.in, src/Makefile.in:
uh1763
parents:
43
diff
changeset
|
7 #if HAVE_CONFIG_H |
32ba1198c6fa
[svn] * Makefile.in, configure, configure.in, docs/Makefile.in, src/Makefile.in:
uh1763
parents:
43
diff
changeset
|
8 #include <config.h> |
32ba1198c6fa
[svn] * Makefile.in, configure, configure.in, docs/Makefile.in, src/Makefile.in:
uh1763
parents:
43
diff
changeset
|
9 #endif |
32ba1198c6fa
[svn] * Makefile.in, configure, configure.in, docs/Makefile.in, src/Makefile.in:
uh1763
parents:
43
diff
changeset
|
10 |
54
125d79c9e586
[svn] * src/client.c, src/configfile.c, src/content.c, src/control.c,
uh1763
parents:
45
diff
changeset
|
11 #if TIME_WITH_SYS_TIME |
125d79c9e586
[svn] * src/client.c, src/configfile.c, src/content.c, src/control.c,
uh1763
parents:
45
diff
changeset
|
12 #include <sys/time.h> |
125d79c9e586
[svn] * src/client.c, src/configfile.c, src/content.c, src/control.c,
uh1763
parents:
45
diff
changeset
|
13 #include <time.h> |
125d79c9e586
[svn] * src/client.c, src/configfile.c, src/content.c, src/control.c,
uh1763
parents:
45
diff
changeset
|
14 #else |
125d79c9e586
[svn] * src/client.c, src/configfile.c, src/content.c, src/control.c,
uh1763
parents:
45
diff
changeset
|
15 #if HAVE_SYS_TIME_H |
125d79c9e586
[svn] * src/client.c, src/configfile.c, src/content.c, src/control.c,
uh1763
parents:
45
diff
changeset
|
16 #include <sys/time.h> |
125d79c9e586
[svn] * src/client.c, src/configfile.c, src/content.c, src/control.c,
uh1763
parents:
45
diff
changeset
|
17 #else |
125d79c9e586
[svn] * src/client.c, src/configfile.c, src/content.c, src/control.c,
uh1763
parents:
45
diff
changeset
|
18 #include <time.h> |
125d79c9e586
[svn] * src/client.c, src/configfile.c, src/content.c, src/control.c,
uh1763
parents:
45
diff
changeset
|
19 #endif |
125d79c9e586
[svn] * src/client.c, src/configfile.c, src/content.c, src/control.c,
uh1763
parents:
45
diff
changeset
|
20 #endif |
125d79c9e586
[svn] * src/client.c, src/configfile.c, src/content.c, src/control.c,
uh1763
parents:
45
diff
changeset
|
21 |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
22 #include <errno.h> |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
23 #include <ctype.h> |
244
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
24 #include <netdb.h> |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
25 #include <sys/types.h> |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
26 #include <sys/stat.h> |
244
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
27 #include <sys/utsname.h> |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
28 #include <fcntl.h> |
91 | 29 #include <stdlib.h> |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
30 #include <unistd.h> |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
31 #include "configfile.h" |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
32 #include "log.h" |
197
24d4cd032da5
[svn] * AUTHORS,INSTALL,NEWS,README,TODO,docs/NOTES,src/client.c,src/protocol.c,
bears
parents:
186
diff
changeset
|
33 #include "portable.h" |
24d4cd032da5
[svn] * AUTHORS,INSTALL,NEWS,README,TODO,docs/NOTES,src/client.c,src/protocol.c,
bears
parents:
186
diff
changeset
|
34 #include "util.h" |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
35 #include "wildmat.h" |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
36 |
91 | 37 #if defined(UTIL_TEST) |
38 #define Log_err printf | |
39 #endif | |
40 | |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
41 static const char * |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
42 nextWhiteSpace( const char *p ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
43 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
44 while ( *p && ! isspace( *p ) ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
45 ++p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
46 return p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
47 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
48 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
49 static const char * |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
50 nextNonWhiteSpace( const char *p ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
51 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
52 while ( *p && isspace( *p ) ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
53 ++p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
54 return p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
55 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
56 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
57 const char * |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
58 Utl_restOfLn( const char *line, unsigned int token ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
59 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
60 unsigned int i; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
61 const char *p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
62 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
63 p = line; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
64 for ( i = 0; i < token; ++i ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
65 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
66 p = nextNonWhiteSpace( p ); |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
67 p = nextWhiteSpace( p ); |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
68 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
69 p = nextNonWhiteSpace( p ); |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
70 return p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
71 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
72 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
73 const char * |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
74 Utl_getLn( Str result, const char *pos ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
75 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
76 int len = 0; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
77 const char *p = pos; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
78 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
79 if ( ! p ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
80 return NULL; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
81 while ( *p != '\n' ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
82 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
83 if ( *p == '\0' ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
84 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
85 if ( len > 0 ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
86 Log_err( "Line not terminated by newline: '%s'", pos ); |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
87 return NULL; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
88 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
89 *(result++) = *(p++); |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
90 ++len; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
91 if ( len >= MAXCHAR - 1 ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
92 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
93 *result = '\0'; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
94 Log_err( "Utl_getLn: line too long: %s", result ); |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
95 return ++p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
96 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
97 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
98 *result = '\0'; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
99 return ++p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
100 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
101 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
102 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
103 const char * |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
104 Utl_ungetLn( const char *str, const char *p ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
105 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
106 if ( str == p ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
107 return FALSE; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
108 --p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
109 if ( *p != '\n' ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
110 { |
185
fed1334d766b
[svn] * src/client.c: Change variable only used on constant to 'const'.
bears
parents:
164
diff
changeset
|
111 Log_err( "Utl_ungetLn: not at beginning of line" ); |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
112 return NULL; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
113 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
114 --p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
115 while ( TRUE ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
116 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
117 if ( p == str ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
118 return p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
119 if ( *p == '\n' ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
120 return p + 1; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
121 --p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
122 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
123 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
124 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
125 const char * |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
126 Utl_getHeaderLn( Str result, const char *p ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
127 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
128 const char * res = Utl_getLn( result, p ); |
202 | 129 Bool not_too_long_header = TRUE; |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
130 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
131 /* Look for followon line if this isn't a blank line. */ |
109 | 132 if ( res != NULL && result[ 0 ] != '\0' && ! isspace( result[ 0 ] ) ) |
87 | 133 for(;;) |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
134 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
135 Str nextLine; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
136 const char *here; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
137 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
138 here = res; |
87 | 139 nextLine[ 0 ] = '\0'; |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
140 res = Utl_getLn( nextLine, res ); |
87 | 141 if ( res == NULL || nextLine[ 0 ] == '\0' |
109 | 142 || ! isspace( nextLine[ 0 ] ) ) |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
143 { |
87 | 144 res = here; |
145 break; | |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
146 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
147 else |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
148 { |
202 | 149 if ( not_too_long_header && |
150 ( MAXCHAR > ( strlen( result ) + strlen( nextLine ) + 1 ) ) ) | |
151 { | |
152 Utl_catStr( result, "\n" ); | |
153 Utl_catStr( result, nextLine ); | |
154 } | |
155 else | |
156 { | |
157 Log_err( "Utl_getHeaderLn: skipped continued header: %s", nextLine ); | |
158 not_too_long_header = FALSE; | |
159 /* Now let poor little noffle skip the header continuations. */ | |
160 /* We really need to up the size limit of headers much */ | |
161 /* higher than MAXCHAR = 2048. mliss */ | |
162 } | |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
163 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
164 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
165 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
166 return res; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
167 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
168 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
169 void |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
170 Utl_toLower( Str line ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
171 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
172 char *p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
173 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
174 p = line; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
175 while ( *p ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
176 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
177 *p = tolower( *p ); |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
178 ++p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
179 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
180 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
181 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
182 char * |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
183 Utl_stripWhiteSpace( char *line ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
184 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
185 char *p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
186 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
187 while ( isspace( *line ) ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
188 ++line; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
189 p = line + strlen( line ) - 1; |
240
fbff73fe5b40
[svn] * src/client.c: That wasn't a memory leak fixed on Feb 8th. That was a
bears
parents:
223
diff
changeset
|
190 while ( p >= line && isspace( *p ) ) |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
191 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
192 *p = '\0'; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
193 --p; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
194 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
195 return line; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
196 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
197 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
198 void |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
199 Utl_stripComment( char *line ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
200 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
201 for ( ; *line != '\0'; line++ ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
202 if ( *line =='#' ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
203 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
204 *line = '\0'; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
205 break; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
206 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
207 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
208 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
209 void |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
210 Utl_cpyStr( Str dst, const char *src ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
211 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
212 dst[ 0 ] = '\0'; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
213 strncat( dst, src, MAXCHAR ); |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
214 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
215 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
216 void |
59
e612b263934f
[svn] Changed some variable types and used some casts to avoid compiler
enz
parents:
54
diff
changeset
|
217 Utl_cpyStrN( Str dst, const char *src, int n ) |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
218 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
219 if ( n > MAXCHAR ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
220 n = MAXCHAR; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
221 dst[ 0 ] = '\0'; |
59
e612b263934f
[svn] Changed some variable types and used some casts to avoid compiler
enz
parents:
54
diff
changeset
|
222 strncat( dst, src, (size_t)n ); |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
223 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
224 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
225 void |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
226 Utl_catStr( Str dst, const char *src ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
227 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
228 strncat( dst, src, MAXCHAR - strlen( dst ) ); |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
229 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
230 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
231 void |
59
e612b263934f
[svn] Changed some variable types and used some casts to avoid compiler
enz
parents:
54
diff
changeset
|
232 Utl_catStrN( Str dst, const char *src, int n ) |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
233 { |
59
e612b263934f
[svn] Changed some variable types and used some casts to avoid compiler
enz
parents:
54
diff
changeset
|
234 size_t un; |
e612b263934f
[svn] Changed some variable types and used some casts to avoid compiler
enz
parents:
54
diff
changeset
|
235 |
e612b263934f
[svn] Changed some variable types and used some casts to avoid compiler
enz
parents:
54
diff
changeset
|
236 ASSERT( n >= 0 ); |
e612b263934f
[svn] Changed some variable types and used some casts to avoid compiler
enz
parents:
54
diff
changeset
|
237 un = (size_t)n; |
e612b263934f
[svn] Changed some variable types and used some casts to avoid compiler
enz
parents:
54
diff
changeset
|
238 if ( un > MAXCHAR - strlen( dst ) ) |
e612b263934f
[svn] Changed some variable types and used some casts to avoid compiler
enz
parents:
54
diff
changeset
|
239 un = MAXCHAR - strlen( dst ); |
e612b263934f
[svn] Changed some variable types and used some casts to avoid compiler
enz
parents:
54
diff
changeset
|
240 strncat( dst, src, un ); |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
241 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
242 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
243 void |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
244 Utl_stamp( Str file ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
245 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
246 FILE *f; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
247 time_t t; |
206 | 248 Str tmpfname; |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
249 |
206 | 250 snprintf( tmpfname, MAXCHAR, "%s/.#%d.stamp.update", |
251 Cfg_spoolDir(), (int) getpid() ); | |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
252 time( &t ); |
206 | 253 if ( ! ( f = fopen( tmpfname, "w" ) ) ) |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
254 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
255 Log_err( "Could not open %s for writing (%s)", |
206 | 256 tmpfname, strerror( errno ) ); |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
257 return; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
258 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
259 fprintf( f, "%lu\n", t ); |
223
ffb1848a39db
[svn] * src/util.c: Improve (correct) error detection when updating
bears
parents:
206
diff
changeset
|
260 if ( fclose( f ) != 0 ) |
206 | 261 { |
262 Log_err( "Error stamping into file %s: %s", | |
263 tmpfname, strerror( errno ) ); | |
264 | |
265 } | |
266 else | |
267 { | |
268 if ( rename( tmpfname, file ) < 0 ) | |
269 Log_err( "Rename of stamp file %s to %s failed: %s", | |
270 tmpfname, file, strerror( errno ) ); | |
271 } | |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
272 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
273 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
274 Bool |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
275 Utl_getStamp( time_t *result, Str file ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
276 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
277 FILE *f; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
278 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
279 if ( ! ( f = fopen( file, "r" ) ) ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
280 return FALSE; |
295
4426fde0a72c
[svn] * src/util.c: Add cast to deal with compiler warning.
bears
parents:
281
diff
changeset
|
281 if ( fscanf( f, "%lu", (unsigned long *) result ) != 1 ) |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
282 { |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
283 Log_err( "File %s corrupted", file ); |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
284 fclose( f ); |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
285 return FALSE; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
286 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
287 fclose( f ); |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
288 return TRUE; |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
289 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
290 |
91 | 291 static const char *DOTW[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", |
292 "Sat", NULL }; | |
293 static const char *MON[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", | |
294 "Aug", "Sep", "Oct", "Nov", "Dec", NULL }; | |
295 | |
127 | 296 /* |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
297 * Calculate the difference between local time and GMT at GMT time t. |
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
298 * |
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
299 * This is INN's 'always-works' method. It assumes the time differences |
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
300 * is < 24hrs. Sounds reasonable to me. It also assumes it can ignore seconds. |
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
301 * Returns localtime - GMT seconds. It will also trash the localtime/ |
127 | 302 * gmtime/etc. static buffer. |
279
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
303 * |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
304 * Do some basic caching by returning the previous result if the new request |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
305 * is in the same hour as the previous one. |
127 | 306 */ |
307 static int | |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
308 localTimeDiff( time_t t ) |
127 | 309 { |
310 struct tm local, gmt, *tm; | |
279
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
311 static time_t resHourStart = 0; |
127 | 312 static int res = 0; |
313 | |
279
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
314 if ( labs( t - resHourStart ) < 60 ) |
127 | 315 return res; |
279
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
316 |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
317 /* Calculating for new hour */ |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
318 resHourStart = ( t / 60 ) * 60; |
127 | 319 |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
320 tm = localtime( &t ); |
127 | 321 if ( tm == NULL ) |
322 return 0; | |
323 local = *tm; | |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
324 tm = gmtime( &t ); |
127 | 325 if ( tm == NULL ) |
326 return 0; | |
327 gmt = *tm; | |
328 | |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
329 res = local.tm_yday - gmt.tm_yday; |
127 | 330 if ( res < -1 ) |
331 res = -1; /* Year rollover? */ | |
332 else if ( res > 1 ) | |
333 res = 1; | |
334 | |
335 res *= 24; | |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
336 res += local.tm_hour - gmt.tm_hour; |
127 | 337 res *= 60; |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
338 res += local.tm_min - gmt.tm_min; |
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
339 res *= 60; |
127 | 340 |
341 return res; | |
342 } | |
343 | |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
344 time_t |
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
345 Utl_mktimeGMT( struct tm *t ) |
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
346 { |
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
347 #if HAVE_TIMEGM |
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
348 return timegm( t ); |
279
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
349 #else |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
350 /* This comment and implmentation is taken from Wget's mktime_from_utc(). |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
351 * We could |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
352 * |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
353 * Converts struct tm to time_t, assuming the data in tm is UTC rather |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
354 * than local timezone. |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
355 * |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
356 * mktime is similar but assumes struct tm, also known as the |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
357 * "broken-down" form of time, is in local time zone. mktime_from_utc |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
358 * uses mktime to make the conversion understanding that an offset |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
359 * will be introduced by the local time assumption. |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
360 * |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
361 * mktime_from_utc then measures the introduced offset by applying |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
362 * gmtime to the initial result and applying mktime to the resulting |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
363 * "broken-down" form. The difference between the two mktime results |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
364 * is the measured offset which is then subtracted from the initial |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
365 * mktime result to yield a calendar time which is the value returned. |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
366 * |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
367 * tm_isdst in struct tm is set to 0 to force mktime to introduce a |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
368 * consistent offset (the non DST offset) since tm and tm+o might be |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
369 * on opposite sides of a DST change. |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
370 * |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
371 * Some implementations of mktime return -1 for the nonexistent |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
372 * localtime hour at the beginning of DST. In this event, use |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
373 * mktime(tm - 1hr) + 3600. |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
374 * |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
375 * Schematically |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
376 * mktime(tm) --> t+o |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
377 * gmtime(t+o) --> tm+o |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
378 * mktime(tm+o) --> t+2o |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
379 * t+o - (t+2o - t+o) = t |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
380 * |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
381 * Note that glibc contains a function of the same purpose named |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
382 * `timegm' (reverse of gmtime). But obviously, it is not universally |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
383 * available, and unfortunately it is not straightforwardly |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
384 * extractable for use here. Perhaps configure should detect timegm |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
385 * and use it where available. |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
386 * |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
387 * Contributed by Roger Beeman <beeman@cisco.com>, with the help of |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
388 * Mark Baushke <mdb@cisco.com> and the rest of the Gurus at CISCO. |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
389 * Further improved by Roger with assistance from Edward J. Sabol |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
390 * based on input by Jamie Zawinski. |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
391 */ |
279
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
392 time_t tl, tb; |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
393 struct tm *tg; |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
394 |
279
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
395 tl = mktime (t); |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
396 if (tl == -1) |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
397 { |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
398 t->tm_hour--; |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
399 tl = mktime (t); |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
400 if (tl == -1) |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
401 return -1; /* can't deal with output from strptime */ |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
402 tl += 3600; |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
403 } |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
404 tg = gmtime (&tl); |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
405 tg->tm_isdst = 0; |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
406 tb = mktime (tg); |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
407 if (tb == -1) |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
408 { |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
409 tg->tm_hour--; |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
410 tb = mktime (tg); |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
411 if (tb == -1) |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
412 return -1; /* can't deal with output from gmtime */ |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
413 tb += 3600; |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
414 } |
49b452b667a6
[svn] * src/util.c: localTimeDiff() cached its value and recalculated it every
bears
parents:
271
diff
changeset
|
415 return (tl - (tb - tl)); |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
416 #endif |
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
417 } |
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
418 |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
419 void |
91 | 420 Utl_newsDate( time_t t, Str res ) |
421 { | |
127 | 422 struct tm *local; |
423 long tzdiff, hoffset, moffset; | |
424 | |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
425 tzdiff = localTimeDiff( t ) / 60; |
91 | 426 |
127 | 427 local = localtime( &t ); |
428 if ( local == NULL ) | |
429 { | |
430 Utl_cpyStr( res, "** localtime failure **" ); | |
431 return; | |
432 } | |
433 | |
91 | 434 hoffset = tzdiff / 60; |
435 moffset = tzdiff % 60; | |
127 | 436 if ( moffset < 0 ) |
437 moffset = - moffset; | |
91 | 438 |
127 | 439 sprintf( res, "%s, %d %s %4d %02d:%02d:%02d %+03ld%02ld", |
440 DOTW[local->tm_wday], local->tm_mday, | |
441 MON[local->tm_mon], local->tm_year + 1900, | |
442 local->tm_hour, local->tm_min, local->tm_sec, | |
91 | 443 hoffset, moffset ); |
444 } | |
445 | |
446 time_t | |
447 Utl_parseNewsDate( const char *s ) | |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
448 { |
91 | 449 struct tm tm; |
127 | 450 int wday, offset, tzoffset; |
91 | 451 char *p; |
452 time_t res; | |
453 | |
454 memset( &tm, 0, sizeof( tm ) ); | |
455 wday = -1; | |
127 | 456 tm.tm_isdst = -1; |
91 | 457 |
458 s = nextNonWhiteSpace( s ); | |
459 | |
460 /* Is this the day number, or a weekday? */ | |
461 if ( ! isdigit( *s ) ) | |
462 { | |
463 if ( strlen( s ) < 4 ) | |
464 return (time_t) -1; | |
465 | |
466 for ( wday = 0; DOTW[ wday ] != NULL; wday++ ) | |
186 | 467 if ( strncasecmp( DOTW[ wday ], s, 3 ) == 0 ) |
91 | 468 break; |
469 | |
470 if( DOTW[ wday ] == NULL || s[3] != ',' ) | |
471 return (time_t) -1; | |
472 | |
473 s += 4; | |
474 } | |
475 | |
476 /* Get the day number */ | |
477 tm.tm_mday = (int) strtol( s, &p, 10 ); | |
478 if ( p == s ) | |
479 return (time_t) -1; | |
480 s = p; | |
481 | |
482 /* Look for month name */ | |
483 s = nextNonWhiteSpace( s ); | |
484 if ( strlen( s ) < 4 ) | |
485 return (time_t) -1; | |
486 for ( tm.tm_mon = 0; MON[ tm.tm_mon ] != NULL; tm.tm_mon++ ) | |
186 | 487 if ( strncasecmp( MON[ tm.tm_mon ], s, 3 ) == 0 ) |
91 | 488 break; |
489 | |
490 if ( MON[ tm.tm_mon ] == NULL ) | |
491 return (time_t) -1; | |
492 s += 3; | |
493 | |
494 /* Year next */ | |
495 tm.tm_year = (int) strtol( s, &p, 10 ); | |
496 if ( p == s || ( tm.tm_year >= 100 && tm.tm_year < 1900 ) ) | |
497 return (time_t) -1; | |
498 if ( tm.tm_year >= 1900 ) | |
499 tm.tm_year -= 1900; | |
500 s = p; | |
501 | |
502 /* Hours */ | |
503 tm.tm_hour = (int) strtol( s, &p, 10 ); | |
504 if ( p == s || *p != ':' ) | |
505 return (time_t) -1; | |
506 s = ++p; | |
507 | |
508 /* Minutes */ | |
509 tm.tm_min = (int) strtol( s, &p, 10 ); | |
510 if ( p == s || ( *p != ':' && *p != ' ' ) ) | |
511 return (time_t) -1; | |
512 s = p; | |
513 | |
514 /* Seconds */ | |
515 if ( *s == ':' ) | |
516 { | |
517 s++; | |
518 tm.tm_sec = (int) strtol( s, &p, 10 ); | |
519 if ( p == s ) | |
520 return (time_t) -1; | |
521 s = p; | |
522 } | |
523 | |
524 /* GMT/UT or timezone offset */ | |
525 tzoffset = 0; | |
202 | 526 s = nextNonWhiteSpace( s ); |
186 | 527 if ( strncasecmp( s, "GMT", 3) == 0 ) |
91 | 528 s += 3; |
186 | 529 else if ( strncasecmp( s, "UT", 2 ) == 0 ) |
91 | 530 s += 2; |
531 else | |
532 { | |
127 | 533 offset = (int) strtol( s, &p, 10 ); |
202 | 534 if ( p == s ) |
535 return (time_t) -1; | |
91 | 536 s = p; |
127 | 537 tzoffset = ( offset / 100 ) * 60 + ( offset % 100 ); |
91 | 538 } |
539 | |
540 /* Check for following junk */ | |
541 if ( *s != '\0' && ! isspace( *s ) ) | |
542 return (time_t) -1; | |
543 | |
259
b660fadc1814
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
bears
parents:
244
diff
changeset
|
544 res = Utl_mktimeGMT( &tm ); |
91 | 545 if ( res == (time_t) -1 ) |
546 return res; | |
547 | |
548 if ( wday >= 0 && wday != tm.tm_wday ) | |
549 return (time_t) -1; | |
550 | |
127 | 551 /* And now adjust for tzoffset */ |
552 res -= tzoffset * 60; | |
553 | |
91 | 554 return res; |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
555 } |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
556 |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
557 void |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
558 Utl_allocAndCpy( char **dst, const char *src ) |
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
559 { |
281
5eece4dfd945
[svn] * src/log.c,src/log.h: Add Log_fatal() for reporting fatal errors
bears
parents:
279
diff
changeset
|
560 size_t len = strlen( src ); |
5eece4dfd945
[svn] * src/log.c,src/log.h: Add Log_fatal() for reporting fatal errors
bears
parents:
279
diff
changeset
|
561 if ( ! ( *dst = malloc( len + 1 ) ) ) |
5eece4dfd945
[svn] * src/log.c,src/log.h: Add Log_fatal() for reporting fatal errors
bears
parents:
279
diff
changeset
|
562 Log_fatal( "Cannot allocate string with length %lu", len ); |
5eece4dfd945
[svn] * src/log.c,src/log.h: Add Log_fatal() for reporting fatal errors
bears
parents:
279
diff
changeset
|
563 memcpy( *dst, src, len + 1 ); |
43
2842f50feb55
[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h,
uh1763
parents:
diff
changeset
|
564 } |
91 | 565 |
271
3477050e8d10
[svn] * src/client.c,src/fetch.c,src/lock.c.src/protocol.c,src/util.h,src/util.c:
bears
parents:
259
diff
changeset
|
566 SignalHandler |
3477050e8d10
[svn] * src/client.c,src/fetch.c,src/lock.c.src/protocol.c,src/util.h,src/util.c:
bears
parents:
259
diff
changeset
|
567 Utl_installSignalHandler( int sig, SignalHandler handler ) |
164
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
568 { |
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
569 struct sigaction act, oldAct; |
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
570 |
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
571 act.sa_handler = handler; |
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
572 sigemptyset( &act.sa_mask ); |
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
573 act.sa_flags = 0; |
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
574 if ( sig != SIGALRM ) |
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
575 act.sa_flags |= SA_RESTART; |
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
576 if ( sigaction( sig, &act, &oldAct ) < 0 ) |
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
577 return SIG_ERR; |
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
578 return oldAct.sa_handler; |
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
579 } |
94f2e5607772
[svn] * src/client.c,src/protocol.c,src/util.h,src/util.c: Common up
bears
parents:
127
diff
changeset
|
580 |
244
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
581 static Bool |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
582 getHostFQDN( Str result ) |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
583 { |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
584 struct hostent *myHostEnt; |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
585 struct utsname myName; |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
586 |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
587 if ( uname( &myName ) >= 0 |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
588 && ( myHostEnt = gethostbyname( myName.nodename ) ) ) |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
589 { |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
590 Utl_cpyStr( result, myHostEnt->h_name ); |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
591 return TRUE; |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
592 } |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
593 return FALSE; |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
594 } |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
595 |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
596 Bool |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
597 Utl_getFQDN( Str result ) |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
598 { |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
599 /* get hostname from Cfg-File */ |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
600 Utl_cpyStr( result, Cfg_hostnameMsgId() ); |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
601 if ( strlen( result ) != 0 ) |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
602 return TRUE; |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
603 return getHostFQDN( result ); |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
604 } |
4e69e9b722ae
[svn] * src/database.c,src/protocol.c,src/util.c,src/util.h: The latest IETF
bears
parents:
240
diff
changeset
|
605 |
463
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
606 Bool |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
607 Utl_createDir( const char *dir ) |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
608 { |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
609 struct stat st; |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
610 int err; |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
611 |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
612 err = stat( dir, &st ); |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
613 if ( err == 0 && S_ISDIR( st.st_mode ) ) |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
614 return TRUE; |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
615 |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
616 err = mkdir( dir, 0755 ); |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
617 if ( err != 0 ) |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
618 { |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
619 Log_dbg( LOG_DBG_NEWSBASE, "mkdir: %s", strerror( errno ) ); |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
620 return FALSE; |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
621 } |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
622 |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
623 return TRUE; |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
624 } |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
625 |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
626 |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
627 Bool |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
628 Utl_writeFile( const char *dirPrefix, const char *dir, |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
629 const char *file, const char *text) |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
630 { |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
631 Str dirPath; |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
632 Str filePath; |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
633 FILE *f; |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
634 |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
635 if ( dirPrefix != NULL ) |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
636 { |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
637 if ( ! Utl_createDir( dirPrefix ) ) |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
638 return FALSE; |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
639 snprintf( dirPath, MAXCHAR, "%s/%s", dirPrefix, dir ); |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
640 } |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
641 else |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
642 Utl_cpyStr( dirPath, dir ); |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
643 |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
644 if ( ! Utl_createDir( dirPath ) ) |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
645 return FALSE; |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
646 |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
647 snprintf( filePath, MAXCHAR, "%s/%s", dirPath, file); |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
648 |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
649 if ( ! ( f = fopen( filePath, "w" ) ) ) |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
650 { |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
651 Log_err( "Cannot open %s", filePath ); |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
652 return FALSE; |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
653 } |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
654 fprintf( f, "%s", text ); |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
655 fclose( f ); |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
656 return TRUE; |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
657 |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
658 } |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
659 |
95697d7c97a1
[svn] * src/outgoing.c,src/util.h,src/util.c: Create Utl_createDir() and
bears
parents:
295
diff
changeset
|
660 |
91 | 661 #if defined(UTIL_TEST) |
662 | |
663 /* Test code borrowed from wildmat.c. Yep, still uses gets(). */ | |
664 extern char *gets(); | |
665 | |
666 int | |
667 main() | |
668 { | |
669 Str line; | |
670 time_t t; | |
671 | |
672 printf( "Util date tester. Enter date to test.\n" ); | |
673 printf( "A blank line exits the program.\n" ); | |
674 | |
675 for ( ; ; ) | |
676 { | |
127 | 677 t = time( NULL ); |
678 Utl_newsDate( t, line ); | |
679 printf( "\n(%s) Enter date: ", line ); | |
91 | 680 (void) fflush( stdout ); |
681 if ( gets( line ) == NULL || line[0] == '\0' ) | |
682 break; | |
683 | |
684 t = Utl_parseNewsDate( line ); | |
685 if ( t == (time_t) -1 ) | |
686 printf( "Date parse failed\n" ); | |
687 else | |
688 { | |
689 Utl_newsDate( t, line ); | |
127 | 690 printf( "Utl_newsDate -> '%s'\n", line ); |
91 | 691 } |
692 } | |
693 | |
694 exit(0); | |
695 /* NOTREACHED */ | |
696 } | |
697 #endif |