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

Reply via email to