This email list is read-only. Emails sent to this list will be discarded
----------------------------------
ChangeLog | 12 +-
moblin-system-daemon/datetime/datetime.c | 365 +++++++++++++++++++++++------
moblin-system-daemon/datetime/datetime.h | 9 +
moblin-system-daemon/moblin-system-tool.c | 360 ++++-------------------------
4 files changed, 353 insertions(+), 393 deletions(-)
New commits:
commit 88b578a47edfae8b52e7e498cf09285a9e935ed8
Author: Lilli Szafranski <[EMAIL PROTECTED]>
Date: Fri Aug 8 11:13:50 2008 -0700
Added better error catching, logging, and memory management. Tested
get/set_time and get_timezone against moblin-system-tool.
Diff in this email is a maximum of 400 lines.
diff --git a/ChangeLog b/ChangeLog
index dbad335..0b410d4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,12 +1,12 @@
moblin-settings (2.10)
- * Merged everything into moblin-system-daemon from moblin-user-daemon
- * upgraded the install.sh and uninstall.sh scripts to be able to install
- the moblin-system-daemon and moblin-kernel-modules services on debian,
- redhat, and unknown machines. Debian uses update-rc.d, Redhat uses
- chkconfig, and unknown systems are done manually.
+ * Tested and fixed get_time, set_time, and get_timezone. Added better
+ memory management, error checking, and messaging. Still need to test
+ get_all_timezones and set_timezone with the moblin-system-tool, add
+ gerror processing, and write a unit-test script test to run on
+ datetime code.
- -- Todd Brandt <[EMAIL PROTECTED]> Mon Aug 4 21:41:34 PDT 2008
+ -- Lilli Szafranski <[EMAIL PROTECTED]> Fri Aug 8 10:16:39 PDT 2008
moblin-settings (2.09)
diff --git a/moblin-system-daemon/datetime/datetime.c
b/moblin-system-daemon/datetime/datetime.c
index cb3e5c0..17244e4 100644
--- a/moblin-system-daemon/datetime/datetime.c
+++ b/moblin-system-daemon/datetime/datetime.c
@@ -2,6 +2,7 @@
#include <stdlib.h>
#include <string.h>
#include "moblin-system-dbus.h"
+#include <oobs/oobs.h>
// lilli
#include <sys/time.h>
@@ -10,48 +11,160 @@
#include <unistd.h>
#include <sys/stat.h>
+// Bitmask values for get_all_timezones options.
#define TZ_ALL 16 // 0b00010000
#define TZ_CODE 8 // 0b00001000
#define TZ_LATLON 4 // 0b00000100
#define TZ_NAME 2 // 0b00000010
#define TZ_COMMENT 1 // 0b00000001
-#define AVG_LINE_LEN 50 // This will be the average length per timezone
line in the /usr/share/zoneinfo/zone.tab file
- // on an Ubuntu Hardy dist as
of 7/28/08. Used to approx the length of the array of zones
+#define AVG_LINE_LEN 40 // Using a Perl script, I found the average
length
+ // per line in the
/usr/share/zoneinfo/zone.tab file
+ // was about 43 characters.
The best optimize memory
+ // allocation for the
get_all_timezones array of char*s
+ // I will divide the length of
the file in characters
+ // by the line length to get an
approx of the number of
+ // timezones so not to allocate
way too many or too few
+ // char**s
+// These are valid on most machines except for older
+// versions of RedHat, I believe...
+// TODO: add preproc directives to check for this
+#define LOCAL_INFO_DIR "/usr/share/zoneinfo/"
+#define ETC_LOCAL_DIR "/etc/localtime"
+#define FILE_ZONE_TAB "/usr/share/zoneinfo/zone.tab"
+
// end lilli
extern GQuark error_quark;
+gboolean __verify_time_input(const gint year, const gint month, const gint
day,
+ const gint hour, const
gint minute, const gint second,
+ char** errorMsg)
+{
+
+ if( INT_MAX <= 2147483647 )
+ {
+ PRINTF("test\n");
+
+ if( ( (year < 100) && (year >= 38) ) || (year >= 2038) )
+ {
+ *errorMsg = "32-bit Linux machines do not support
time/dates past\n\t03:14:07 GMT Tuesday, January 19, 2038.";
+ return FALSE;
+ }
+
+ if( ( (year < 100) && (year >= 35) ) || (year >= 2035) )
+ {
+ *errorMsg = "You are within three years of 03:14:07 GMT
Tuesday, January 19, 2038.\n\tGet a 64-bit device.";
+ return FALSE;
+ }
+ }
+
+ if( (month > 12) || (month < 1) )
+ {
+ *errorMsg = "Month must be between 1 and 12.";
+ return FALSE;
+ }
+
+ if( (day > 31) && (day < 1) )
+ {
+ *errorMsg = "Day must be between 1 and 29 if it's February.";
+ return FALSE;
+ }
+
+ if( (hour > 23) || (hour < 0) )
+ {
+ *errorMsg = "Hour must be between 0 and 23";
+ return FALSE;
+ }
+
+ if( (minute > 59) || (minute < 0) )
+ {
+ *errorMsg = "Minute must be between 0 and 59";
+ return FALSE;
+ }
+
+ if( (second > 61) || (second < 0) )
+ {
+ *errorMsg = "Second must be between 0 and 61";
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
gboolean
system_daemon_set_time(MoblinSystemServer * server,
const gint year, const gint month, const gint day,
const gint hour, const gint minute, const gint second,
GError **error)
{
+ PRINTF("[system_daemon_set_time]:\n\tyear=%d, month=%d,
day=%d\n\thour=%d, minute=%d, second=%d\n",
+ year, month, day, hour, minute, second);
+
+ char* errorMsg = NULL;
+ if(!__verify_time_input(year, month, day, hour, minute, second,
&errorMsg))
+ {
+ // TODO: set GError error here
+ PRINTF("[system_daemon_set_time] __verify_time_input
failed:\n\t%s\n", errorMsg);
+ return FALSE;
+ }
+
int retVal = 0;
- struct timeval* timev;
+ struct timeval* timev = (struct timeval*)malloc(sizeof(struct timeval));
+ if(!timev)
+ {
+ // TODO: set GError error here
+ PRINTF("[system_daemon_set_time] malloc failed:\n\tstruct
timeval* timev = NULL\n");
+
+ return FALSE;
+ }
+ memset(timev, 0, sizeof(struct timeval));
+
struct timezone* timez = NULL;
- struct tm* time;
+ struct tm* time = (struct tm*)malloc(sizeof(struct tm));
+ if(!time)
+ {
+ // TODO: set GError error here
+ PRINTF("[system_daemon_set_time] malloc failed:\n\tstruct tm*
time = NULL\n");
+
+ free(timev);
+ timev = NULL;
+
+ return FALSE;
+ }
+ memset(time, 0, sizeof(struct tm));
+ time->tm_isdst = -1;
time->tm_sec = second;
time->tm_min = minute;
time->tm_hour = hour;
time->tm_mday = day;
- time->tm_mon = month;
- time->tm_year = year;
+ time->tm_mon = month - 1;
+
+ if( (year < 100) && (year > -1) )
+ time->tm_year = year + 2000 - 1900;
+ else
+ time->tm_year = year - 1900;
// Getting the seconds since the Epoch from the time structure
timev->tv_sec = mktime(time);
- if(timev->tv_sec == -1)
+ if(timev->tv_sec == (time_t)(-1))
{
// TODO: set GError error here
- PRINTF("mktime() failed.\n");
+ PRINTF("[system_daemon_set_time] mktime failed:\n\tLikely that
your input is not valid.\n");// errno= %s\n"), strerror(errno));
+
+ free(timev);
+ timev = NULL;
+
+ free(time);
+ time = NULL;
+
return FALSE;
}
- PRINTF("mktime() successful.\n");
+ PRINTF("[system_daemon_set_time] mktime successful:\n\tepoch = %d\n",
timev->tv_sec);
// This function does not support milliseconds
timev->tv_usec = 0;
@@ -60,13 +173,25 @@ system_daemon_set_time(MoblinSystemServer * server,
if(retVal)
{
// TODO: set GError error here
- PRINTF("settimeofday() failed: errno= %s\n", strerror(errno));
- return FALSE;
+ PRINTF("[system_daemon_set_time] settimeofday failed:\n\t%s\n",
strerror(errno));
+
+ free(timev);
+ timev = NULL;
+
+ free(time);
+ time = NULL;
+
+ return FALSE;
}
- PRINTF("settimeofday() was successful.\n");
+ PRINTF("[system_daemon_set_time] settimeofday successful:\n\ttime =
%s\n", asctime (time) );
+
+ free(timev);
+ timev = NULL;
- PRINTF ( "The time and date was set to: %s", asctime (time) );
+ free(time);
+ time = NULL;
+ PRINTF("[system_daemon_set_time] end\n");
return TRUE;
}
@@ -76,6 +201,8 @@ system_daemon_get_time(MoblinSystemServer * server,
gint *hour, gint *minute, gint *second,
GError **error)
{
+ PRINTF("[system_daemon_get_time] start\n");
+
int retVal = 0;
struct timeval timev;
@@ -87,21 +214,23 @@ system_daemon_get_time(MoblinSystemServer * server,
if(retVal)
{
// TODO: set GError error here
- PRINTF("gettimeofday() failed: errno= %s\n", strerror(errno));
- return FALSE;
+ PRINTF("[system_daemon_get_time] gettimeofday failed:\n\t%s\n",
strerror(errno));
+
+ return FALSE;
}
- PRINTF("gettimeofday() successful.\n");
+ PRINTF("[system_daemon_get_time] gettimeofday successful:\n\tepoch =
%d\n", timev.tv_sec);
getTime = localtime(&timev.tv_sec);
if(getTime == NULL)
{
// TODO: set GError error here
- PRINTF("localtime() failed.\n");
+ PRINTF("[system_daemon_get_time] localtime failed.\n");
+
return FALSE;
}
- PRINTF ( "The current time and date is: %s", asctime (getTime) );
+ PRINTF ( "[system_daemon_get_time] localtime successful:\n\ttime =
%s\n", asctime (getTime) );
*year = (gint)(getTime->tm_year + 1900);
*month = (gint)(getTime->tm_mon + 1);
@@ -109,18 +238,22 @@ system_daemon_get_time(MoblinSystemServer * server,
*hour = (gint)(getTime->tm_hour);
*minute = (gint)(getTime->tm_min);
*second = (gint)(getTime->tm_sec);
-
+
+ PRINTF("[system_daemon_get_time] end\n");
return TRUE;
}
+
gboolean
system_daemon_get_all_timezones(MoblinSystemServer * server,
gchar ***tz_list, int options, GError **error)
{
+ PRINTF("[system_daemon_get_all_timezones] start\n\toptions=%d\n",
options);
int optionsBitMask = 8; // 0b00001000
- FILE* pFile;
+ FILE* pFile = NULL;
long fileLen;
- char* buffer;
+
+ char* buffer = NULL;
char* tok;
@@ -140,43 +273,78 @@ system_daemon_get_all_timezones(MoblinSystemServer *
server,
options = TZ_NAME;
}
- pFile = fopen("/usr/share/zoneinfo/zone.tab", "r");
+ pFile = fopen(FILE_ZONE_TAB, "r");
if(pFile == NULL)
{
- PRINTF("Error opening file. errno = %s\n", strerror(errno));
+ PRINTF("[system_daemon_get_all_timezones] fopen
failed:\n\t%s\n", strerror(errno));
+
+ fclose(pFile);
+ pFile = NULL;
+
return FALSE;
}
+ PRINTF("[system_daemon_get_all_timezones] fopen successful:\n\t%s\n",
strerror(errno));
fseek(pFile, 0, SEEK_END);
fileLen = ftell(pFile);
rewind(pFile);
- PRINTF("length of file: %d\n", (int)fileLen);
+ //PRINTF("length of file: %d\n", fileLen);
if(fileLen == 0)
{
- PRINTF("Error seeking length.\n");
+ PRINTF("[system_daemon_get_all_timezones] fseek/ftell
failed:\n\t%s\n", strerror(errno));
+
+ fclose(pFile);
+ pFile = NULL;
+
return FALSE;
}
+ PRINTF("[system_daemon_get_all_timezones] fseek/ftell
successful:\n\tfile length = %d\n", fileLen);
- PRINTF("allocating buffer and zones\n");
+ //PRINTF("allocating buffer and zones\n");
buffer = (char*)malloc(sizeof(char) * fileLen);
+ if(!buffer)
+ {
+ PRINTF("[system_daemon_get_all_timezones] malloc
failed:\n\tchar* buffer == NULL\n");
+
+ fclose(pFile);
+ pFile = NULL;
+
+ return FALSE;
+ }
memset(buffer, '\0', fileLen);
arrLen = approxLines = fileLen/AVG_LINE_LEN;
*tz_list = (char**)malloc(sizeof(char*) * approxLines);
- memset(*tz_list, '\0', approxLines);
-
- if(tz_list == NULL || buffer == NULL)
+ if(!*tz_list)
{
- PRINTF("Memory error. errno = %s\n", strerror(errno));
- return FALSE;
- }
+ PRINTF("[system_daemon_get_all_timezones] malloc
failed:\n\tchar** tz_list == NULL\n");
+ free(buffer);
+ buffer = NULL;
+
+ fclose(pFile);
+ pFile = NULL;
+
+ return FALSE;
+ }
+ memset(*tz_list, '\0', approxLines);
+
if (fread (buffer, sizeof(char), fileLen, pFile) != fileLen)
{
- PRINTF("Reading error. errno = %s\n", strerror(errno));
+ PRINTF("[system_daemon_get_all_timezones] fread
failed:\n\t%s\n", strerror(errno));
+
+ free(buffer);
+ buffer = NULL;
+
+ free(*tz_list);
+ *tz_list = NULL;
+
+ fclose(pFile);
+ pFile = NULL;
+
return FALSE;
}
@@ -185,7 +353,7 @@ system_daemon_get_all_timezones(MoblinSystemServer * server,
{
optionsBitMask = 8; // 0b00001000
- PRINTF("tok = \t\"%s\"\n", tok);
+ //PRINTF("tok = \t\"%s\"\n", tok);
if(tok[0] != '#')
{
orig = origIter = tok;//(char*)malloc(sizeof(char) *
(strlen(tok)+2));
@@ -226,12 +394,25 @@ system_daemon_get_all_timezones(MoblinSystemServer *
server,
_______________________________________________
Commits mailing list
[email protected]
https://www.moblin.org/mailman/listinfo/commits