Ignore:
Timestamp:
Nov 4, 2007, 3:16:40 AM (16 years ago)
Author:
Bruno Cornec
Message:

Update to busybox 1.7.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.5/mindi-busybox/util-linux/hwclock.c

    r821 r1765  
    88*/
    99
    10 
    11 #include <sys/ioctl.h>
    1210#include <sys/utsname.h>
    13 #include <ctype.h>
    14 #include <fcntl.h>
    1511#include <getopt.h>
    16 #include <stdlib.h>
    17 #include <string.h>
    18 #include <syslog.h>
    19 #include <time.h>
    20 #include <unistd.h>
    21 #include "busybox.h"
     12#include "libbb.h"
    2213
    2314/* Copied from linux/rtc.h to eliminate the kernel dependency */
     
    4334#endif
    4435
     36static const char *rtcname;
     37
     38static int xopen_rtc(int flags)
     39{
     40    int rtc;
     41
     42    if (!rtcname) {
     43        rtc = open("/dev/rtc", flags);
     44        if (rtc >= 0)
     45            return rtc;
     46        rtc = open("/dev/rtc0", flags);
     47        if (rtc >= 0)
     48            return rtc;
     49        rtcname = "/dev/misc/rtc";
     50    }
     51    return xopen(rtcname, flags);
     52}
     53
    4554static time_t read_rtc(int utc)
    4655{
    47     int rtc;
    4856    struct tm tm;
    4957    char *oldtz = 0;
    5058    time_t t = 0;
    51 
    52     if (( rtc = open ( "/dev/rtc", O_RDONLY )) < 0 ) {
    53         if (( rtc = open ( "/dev/misc/rtc", O_RDONLY )) < 0 )
    54             bb_perror_msg_and_die ( "Could not access RTC" );
    55     }
    56     memset ( &tm, 0, sizeof( struct tm ));
    57     if ( ioctl ( rtc, RTC_RD_TIME, &tm ) < 0 )
    58         bb_perror_msg_and_die ( "Could not read time from RTC" );
     59    int rtc = xopen_rtc(O_RDONLY);
     60
     61    memset(&tm, 0, sizeof(struct tm));
     62    xioctl(rtc, RTC_RD_TIME, &tm);
    5963    tm.tm_isdst = -1; /* not known */
    6064
    61     close ( rtc );
    62 
    63     if ( utc ) {
    64         oldtz = getenv ( "TZ" );
    65         setenv ( "TZ", "UTC 0", 1 );
    66         tzset ( );
    67     }
    68 
    69     t = mktime ( &tm );
    70 
    71     if ( utc ) {
    72         if ( oldtz )
    73             setenv ( "TZ", oldtz, 1 );
    74         else
    75             unsetenv ( "TZ" );
    76         tzset ( );
     65    close(rtc);
     66
     67    if (utc) {
     68        oldtz = getenv("TZ");
     69        putenv((char*)"TZ=UTC0");
     70        tzset();
     71    }
     72
     73    t = mktime(&tm);
     74
     75    if (utc) {
     76        unsetenv("TZ");
     77        if (oldtz)
     78            putenv(oldtz - 3);
     79        tzset();
    7780    }
    7881    return t;
     
    8184static void write_rtc(time_t t, int utc)
    8285{
    83     int rtc;
    8486    struct tm tm;
    85 
    86     if (( rtc = open ( "/dev/rtc", O_WRONLY )) < 0 ) {
    87         if (( rtc = open ( "/dev/misc/rtc", O_WRONLY )) < 0 )
    88             bb_perror_msg_and_die ( "Could not access RTC" );
    89     }
    90 
    91     tm = *( utc ? gmtime ( &t ) : localtime ( &t ));
     87    int rtc = xopen_rtc(O_WRONLY);
     88
     89    tm = *(utc ? gmtime(&t) : localtime(&t));
    9290    tm.tm_isdst = 0;
    9391
    94     if ( ioctl ( rtc, RTC_SET_TIME, &tm ) < 0 )
    95         bb_perror_msg_and_die ( "Could not set the RTC time" );
    96 
    97     close ( rtc );
    98 }
    99 
    100 static int show_clock(int utc)
    101 {
    102     struct tm *ptm;
     92    xioctl(rtc, RTC_SET_TIME, &tm);
     93
     94    close(rtc);
     95}
     96
     97static void show_clock(int utc)
     98{
     99    //struct tm *ptm;
    103100    time_t t;
    104     RESERVE_CONFIG_BUFFER(buffer, 64);
    105 
    106     t = read_rtc ( utc );
    107     ptm = localtime ( &t );  /* Sets 'tzname[]' */
    108 
    109     safe_strncpy ( buffer, ctime ( &t ), 64);
    110     if ( buffer [0] )
    111         buffer [strlen ( buffer ) - 1] = 0;
    112 
    113     //printf ( "%s  %.6f seconds %s\n", buffer, 0.0, utc ? "" : ( ptm-> tm_isdst ? tzname [1] : tzname [0] ));
    114     printf ( "%s  %.6f seconds\n", buffer, 0.0 );
    115     RELEASE_CONFIG_BUFFER(buffer);
    116 
    117     return 0;
    118 }
    119 
    120 static int to_sys_clock(int utc)
    121 {
    122     struct timeval tv = { 0, 0 };
     101    char *cp;
     102
     103    t = read_rtc(utc);
     104    //ptm = localtime(&t);  /* Sets 'tzname[]' */
     105
     106    cp = ctime(&t);
     107    if (cp[0])
     108        cp[strlen(cp) - 1] = '\0';
     109
     110    //printf("%s  %.6f seconds %s\n", cp, 0.0, utc ? "" : (ptm->tm_isdst ? tzname[1] : tzname[0]));
     111    printf("%s  0.000000 seconds\n", cp);
     112}
     113
     114static void to_sys_clock(int utc)
     115{
     116    struct timeval tv;
    123117    const struct timezone tz = { timezone/60 - 60*daylight, 0 };
    124118
    125     tv.tv_sec = read_rtc ( utc );
    126 
    127     if ( settimeofday ( &tv, &tz ))
    128         bb_perror_msg_and_die ( "settimeofday() failed" );
    129 
    130     return 0;
    131 }
    132 
    133 static int from_sys_clock(int utc)
    134 {
    135     struct timeval tv = { 0, 0 };
    136     struct timezone tz = { 0, 0 };
    137 
    138     if ( gettimeofday ( &tv, &tz ))
    139         bb_perror_msg_and_die ( "gettimeofday() failed" );
    140 
    141     write_rtc ( tv.tv_sec, utc );
    142     return 0;
    143 }
    144 
    145 #ifdef CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS
     119    tv.tv_sec = read_rtc(utc);
     120    tv.tv_usec = 0;
     121    if (settimeofday(&tv, &tz))
     122        bb_perror_msg_and_die("settimeofday() failed");
     123}
     124
     125static void from_sys_clock(int utc)
     126{
     127    struct timeval tv;
     128
     129    gettimeofday(&tv, NULL);
     130    //if (gettimeofday(&tv, NULL))
     131    //  bb_perror_msg_and_die("gettimeofday() failed");
     132    write_rtc(tv.tv_sec, utc);
     133}
     134
     135#if ENABLE_FEATURE_HWCLOCK_ADJTIME_FHS
    146136# define ADJTIME_PATH "/var/lib/hwclock/adjtime"
    147137#else
     
    151141{
    152142    int utc = 0;
    153     FILE *f = fopen ( ADJTIME_PATH, "r" );
    154 
    155     if ( f ) {
     143    FILE *f = fopen(ADJTIME_PATH, "r");
     144
     145    if (f) {
    156146        RESERVE_CONFIG_BUFFER(buffer, 128);
    157147
    158         while ( fgets ( buffer, sizeof( buffer ), f )) {
    159             int len = strlen ( buffer );
    160 
    161             while ( len && isspace ( buffer [len - 1] ))
     148        while (fgets(buffer, sizeof(buffer), f)) {
     149            int len = strlen(buffer);
     150
     151            while (len && isspace(buffer[len - 1]))
    162152                len--;
    163153
    164             buffer [len] = 0;
    165 
    166             if ( strncmp ( buffer, "UTC", 3 ) == 0 ) {
     154            buffer[len] = 0;
     155
     156            if (strncmp(buffer, "UTC", 3) == 0) {
    167157                utc = 1;
    168158                break;
    169159            }
    170160        }
    171         fclose ( f );
     161        fclose(f);
    172162        RELEASE_CONFIG_BUFFER(buffer);
    173163    }
     
    175165}
    176166
    177 #define HWCLOCK_OPT_LOCALTIME   0x01
    178 #define HWCLOCK_OPT_UTC         0x02
    179 #define HWCLOCK_OPT_SHOW        0x04
    180 #define HWCLOCK_OPT_HCTOSYS     0x08
    181 #define HWCLOCK_OPT_SYSTOHC     0x10
    182 
    183 int hwclock_main ( int argc, char **argv )
    184 {
    185     unsigned long opt;
     167#define HWCLOCK_OPT_LOCALTIME   0x01
     168#define HWCLOCK_OPT_UTC         0x02
     169#define HWCLOCK_OPT_SHOW        0x04
     170#define HWCLOCK_OPT_HCTOSYS     0x08
     171#define HWCLOCK_OPT_SYSTOHC     0x10
     172#define HWCLOCK_OPT_RTCFILE     0x20
     173
     174int hwclock_main(int argc, char **argv);
     175int hwclock_main(int argc, char **argv)
     176{
     177    unsigned opt;
    186178    int utc;
    187179
    188180#if ENABLE_FEATURE_HWCLOCK_LONG_OPTIONS
    189 static const struct option hwclock_long_options[] = {
    190         { "localtime", 0, 0, 'l' },
    191         { "utc",       0, 0, 'u' },
    192         { "show",      0, 0, 'r' },
    193         { "hctosys",   0, 0, 's' },
    194         { "systohc",   0, 0, 'w' },
    195         { 0,           0, 0, 0 }
    196     };
    197     bb_applet_long_options = hwclock_long_options;
     181    static const char hwclock_longopts[] ALIGN1 =
     182        "localtime\0" No_argument "l"
     183        "utc\0"       No_argument "u"
     184        "show\0"      No_argument "r"
     185        "hctosys\0"   No_argument "s"
     186        "systohc\0"   No_argument "w"
     187        "file\0"      Required_argument "f"
     188        ;
     189    applet_long_options = hwclock_longopts;
    198190#endif
    199 
    200     bb_opt_complementally = "?:r--ws:w--rs:s--wr:l--u:u--l";
    201     opt = bb_getopt_ulflags(argc, argv, "lursw");
     191    opt_complementary = "r--ws:w--rs:s--wr:l--u:u--l";
     192    opt = getopt32(argv, "lurswf:", &rtcname);
    202193
    203194    /* If -u or -l wasn't given check if we are using utc */
     
    208199
    209200    if (opt & HWCLOCK_OPT_HCTOSYS) {
    210         return to_sys_clock ( utc );
    211     }
    212     else if (opt & HWCLOCK_OPT_SYSTOHC) {
    213         return from_sys_clock ( utc );
    214     } else {
    215         /* default HWCLOCK_OPT_SHOW */
    216         return show_clock ( utc );
    217     }
    218 }
     201        to_sys_clock(utc);
     202        return 0;
     203    }
     204    if (opt & HWCLOCK_OPT_SYSTOHC) {
     205        from_sys_clock(utc);
     206        return 0;
     207    }
     208    /* default HWCLOCK_OPT_SHOW */
     209    show_clock(utc);
     210    return 0;
     211}
Note: See TracChangeset for help on using the changeset viewer.