Mercurial > noffle
comparison src/server.c @ 259:b660fadc1814 noffle
[svn] * src/server.c,src/util.c,src/util.h: Recognise GMT/UTC on NNTP NEWGROUPS.
Do small reorg of some of the timezone sensitive code, and introduce
use of timegm(). An implementation is provided for systems without
timegm().
| author | bears |
|---|---|
| date | Wed, 26 Jun 2002 14:30:26 +0100 |
| parents | d70e9dd6b308 |
| children | 94b7962a0fbe |
comparison
equal
deleted
inserted
replaced
| 258:ebd9c98bbc7f | 259:b660fadc1814 |
|---|---|
| 1 /* | 1 /* |
| 2 server.c | 2 server.c |
| 3 | 3 |
| 4 $Id: server.c 372 2002-03-13 11:12:23Z mirkol $ | 4 $Id: server.c 391 2002-06-26 13:30:26Z bears $ |
| 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 |
| 813 doList( char *line, const Cmd *cmd ) | 813 doList( char *line, const Cmd *cmd ) |
| 814 { | 814 { |
| 815 Str s, arg; | 815 Str s, arg; |
| 816 const char *pat; | 816 const char *pat; |
| 817 | 817 |
| 818 if ( sscanf( line, "%s", s ) != 1 ) | 818 if ( sscanf( line, MAXCHAR_FMT, s ) != 1 ) |
| 819 doListActive( "*" ); | 819 doListActive( "*" ); |
| 820 else | 820 else |
| 821 { | 821 { |
| 822 Utl_toLower( s ); | 822 Utl_toLower( s ); |
| 823 strcpy( arg, Utl_restOfLn( line, 1 ) ); | 823 strcpy( arg, Utl_restOfLn( line, 1 ) ); |
| 872 | 872 |
| 873 putStat( STAT_READY_POST_ALLOW, "Ok" ); | 873 putStat( STAT_READY_POST_ALLOW, "Ok" ); |
| 874 return TRUE; | 874 return TRUE; |
| 875 } | 875 } |
| 876 | 876 |
| 877 /* Can return -1, if date is outside the range of time_t. */ | 877 /* |
| 878 * Given a time specification (local time or GMT), return a time_t. | |
| 879 */ | |
| 878 static time_t | 880 static time_t |
| 879 getTimeInSeconds( int year, int mon, int day, int hour, int min, int sec ) | 881 getTimeInSeconds( int year, int mon, int day, |
| 882 int hour, int min, int sec, | |
| 883 Bool timeIsGMT ) | |
| 880 { | 884 { |
| 881 struct tm t; | 885 struct tm t; |
| 882 time_t result; | 886 time_t result; |
| 883 | 887 |
| 884 ASSERT( year >= 1900 ); | 888 ASSERT( year >= 1900 ); |
| 897 t.tm_mon = mon - 1; | 901 t.tm_mon = mon - 1; |
| 898 t.tm_mday = day; | 902 t.tm_mday = day; |
| 899 t.tm_hour = hour; | 903 t.tm_hour = hour; |
| 900 t.tm_min = min; | 904 t.tm_min = min; |
| 901 t.tm_sec = sec; | 905 t.tm_sec = sec; |
| 902 result = mktime( &t ); | 906 t.tm_isdst = -1; |
| 907 result = timeIsGMT ? Utl_mktimeGMT( &t ) : mktime( &t ); | |
| 903 return result; | 908 return result; |
| 904 } | 909 } |
| 905 | 910 |
| 906 | 911 |
| 907 static Bool | 912 static Bool |
| 908 doNewgrps( char *arg, const Cmd *cmd ) | 913 doNewgrps( char *arg, const Cmd *cmd ) |
| 909 { | 914 { |
| 910 time_t t, now, lastUpdate, nextCentBegin; | 915 time_t t, now, lastUpdate; |
| 911 int year, mon, day, hour, min, sec, cent, len; | 916 int year, mon, day, hour, min, sec, len, fields, nowYear; |
| 912 const char *g; | 917 const char *g; |
| 913 Str date, timeofday, file; | 918 Str date, timeofday, file, utc; |
| 914 | 919 Bool timeIsGMT = FALSE; |
| 915 if ( sscanf( arg, "%s %s", date, timeofday ) != 2 ) | 920 struct tm *tm; |
| 921 | |
| 922 fields = sscanf( arg, MAXCHAR_FMT " " MAXCHAR_FMT " " MAXCHAR_FMT, | |
| 923 date, timeofday, utc ); | |
| 924 if ( fields == 3 ) | |
| 925 { | |
| 926 Utl_toLower( utc ); | |
| 927 if ( strcmp( utc, "gmt" ) != 0 && strcmp( utc, "utc" ) != 0 ) | |
| 928 { | |
| 929 putSyntax( cmd ); | |
| 930 return TRUE; | |
| 931 } | |
| 932 timeIsGMT = TRUE; | |
| 933 } | |
| 934 else if ( fields != 2 ) | |
| 916 { | 935 { |
| 917 putSyntax( cmd ); | 936 putSyntax( cmd ); |
| 918 return TRUE; | 937 return TRUE; |
| 919 } | 938 } |
| 920 len = strlen( date ); | 939 len = strlen( date ); |
| 924 if ( sscanf( date, "%2d%2d%2d", &year, &mon, &day ) != 3 ) | 943 if ( sscanf( date, "%2d%2d%2d", &year, &mon, &day ) != 3 ) |
| 925 { | 944 { |
| 926 putSyntax( cmd ); | 945 putSyntax( cmd ); |
| 927 return TRUE; | 946 return TRUE; |
| 928 } | 947 } |
| 929 now = time( NULL ); | 948 /* |
| 930 cent = 1900; | 949 * As per current IETF draft, year is this century if <= now, |
| 931 nextCentBegin = getTimeInSeconds( cent + 100, 1, 1, 0, 0, 0 ); | 950 * else last century. |
| 932 while ( nextCentBegin != (time_t)-1 && now != (time_t)-1 | 951 */ |
| 933 && now > nextCentBegin ) | 952 now = time( NULL ); |
| 934 { | 953 tm = timeIsGMT ? gmtime( &now ) : localtime( &now ); |
| 935 cent += 100; | 954 nowYear = tm->tm_year + 1900; |
| 936 nextCentBegin = getTimeInSeconds( cent + 100, 1, 1, 0, 0, 0 ); | 955 year += ( nowYear / 100 ) * 100; |
| 937 } | 956 if ( year % 100 > nowYear % 100 ) |
| 938 year += cent; | 957 year -= 100; |
| 939 break; | 958 break; |
| 940 case 8: | 959 case 8: |
| 941 if ( sscanf( date, "%4d%2d%2d", &year, &mon, &day ) != 3 ) | 960 if ( sscanf( date, "%4d%2d%2d", &year, &mon, &day ) != 3 ) |
| 942 { | 961 { |
| 943 putSyntax( cmd ); | 962 putSyntax( cmd ); |
| 959 { | 978 { |
| 960 putSyntax( cmd ); | 979 putSyntax( cmd ); |
| 961 return TRUE; | 980 return TRUE; |
| 962 } | 981 } |
| 963 snprintf( file, MAXCHAR, "%s/groupinfo.lastupdate", Cfg_spoolDir() ); | 982 snprintf( file, MAXCHAR, "%s/groupinfo.lastupdate", Cfg_spoolDir() ); |
| 964 t = getTimeInSeconds( year, mon, day, hour, min, sec ); | 983 t = getTimeInSeconds( year, mon, day, hour, min, sec, timeIsGMT ); |
| 965 | 984 |
| 966 if ( ! Utl_getStamp( &lastUpdate, file ) ) | 985 if ( ! Utl_getStamp( &lastUpdate, file ) ) |
| 967 { | 986 { |
| 968 /* Can't get stamp. Put out error message. */ | 987 /* Can't get stamp. Put out error message. */ |
| 969 putStat( STAT_PROGRAM_FAULT, "Server error reading %s", file ); | 988 putStat( STAT_PROGRAM_FAULT, "Server error reading %s", file ); |
| 970 return TRUE; | 989 return TRUE; |
| 971 } | 990 } |
| 972 | 991 |
| 973 putStat( STAT_NEW_GRP_FOLLOW, "New groups since %s", arg ); | 992 /* Show timestamp back as news format time for confirmation. */ |
| 993 Utl_newsDate( t, timeofday ); | |
| 994 | |
| 995 putStat( STAT_NEW_GRP_FOLLOW, "New groups since %s", timeofday ); | |
| 974 | 996 |
| 975 if ( t == (time_t)-1 || t <= lastUpdate ) | 997 if ( t == (time_t)-1 || t <= lastUpdate ) |
| 976 { | 998 { |
| 977 if ( Grp_firstGrp( &g ) ) | 999 if ( Grp_firstGrp( &g ) ) |
| 978 do | 1000 do |
| 1181 { | 1203 { |
| 1182 enum XhdrType what; | 1204 enum XhdrType what; |
| 1183 const char *p; | 1205 const char *p; |
| 1184 Str whatStr; | 1206 Str whatStr; |
| 1185 | 1207 |
| 1186 if ( sscanf( arg, "%s", whatStr ) != 1 ) | 1208 if ( sscanf( arg, MAXCHAR_FMT, whatStr ) != 1 ) |
| 1187 { | 1209 { |
| 1188 putSyntax( cmd ); | 1210 putSyntax( cmd ); |
| 1189 return TRUE; | 1211 return TRUE; |
| 1190 } | 1212 } |
| 1191 what = whatXhdrField( whatStr ); | 1213 what = whatXhdrField( whatStr ); |
| 1246 doXpat( char *arg, const Cmd *cmd ) | 1268 doXpat( char *arg, const Cmd *cmd ) |
| 1247 { | 1269 { |
| 1248 enum XhdrType what; | 1270 enum XhdrType what; |
| 1249 Str whatStr, articles, pat; | 1271 Str whatStr, articles, pat; |
| 1250 | 1272 |
| 1251 if ( sscanf( arg, "%s %s %s", whatStr, articles, pat ) != 3 ) | 1273 if ( sscanf( arg, MAXCHAR_FMT " " MAXCHAR_FMT " " MAXCHAR_FMT, |
| 1274 whatStr, articles, pat ) != 3 ) | |
| 1252 { | 1275 { |
| 1253 putSyntax( cmd ); | 1276 putSyntax( cmd ); |
| 1254 return TRUE; | 1277 return TRUE; |
| 1255 } | 1278 } |
| 1256 what = whatXhdrField( whatStr ); | 1279 what = whatXhdrField( whatStr ); |
| 1391 unsigned int i, n; | 1414 unsigned int i, n; |
| 1392 Cmd *c; | 1415 Cmd *c; |
| 1393 Str s, arg; | 1416 Str s, arg; |
| 1394 Bool ret; | 1417 Bool ret; |
| 1395 | 1418 |
| 1396 if ( sscanf( line, "%s", s ) == 1 ) | 1419 if ( sscanf( line, MAXCHAR_FMT, s ) == 1 ) |
| 1397 { | 1420 { |
| 1398 Utl_toLower( s ); | 1421 Utl_toLower( s ); |
| 1399 strcpy( arg, Utl_restOfLn( line, 1 ) ); | 1422 strcpy( arg, Utl_restOfLn( line, 1 ) ); |
| 1400 n = sizeof( commands ) / sizeof( commands[ 0 ] ); | 1423 n = sizeof( commands ) / sizeof( commands[ 0 ] ); |
| 1401 for ( i = 0, c = commands; i < n; ++i, ++c ) | 1424 for ( i = 0, c = commands; i < n; ++i, ++c ) |
