diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-07-06 18:04:32 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-07-06 18:04:32 +0200 |
commit | a7f89980e5b3f4b9a74c70dbc5ffe8aabd28be28 (patch) | |
tree | 41c4deec1fdfbafd7821b4ca7a9772ac0abd92f5 /util/iseltime.c |
Imported Upstream version 2.9.3upstream/2.9.3
Diffstat (limited to 'util/iseltime.c')
-rw-r--r-- | util/iseltime.c | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/util/iseltime.c b/util/iseltime.c new file mode 100644 index 0000000..2562202 --- /dev/null +++ b/util/iseltime.c @@ -0,0 +1,260 @@ +/* + * iseltime.c + * + * Author: Andy Cress arcress at users.sourceforge.net + * + * 05/11/09 Andy Cress v1.0 - created + * 07/23/10 Andy Cress v1.1 - always show System time also + * 08/20/10 Andy Cress v1.2 - show/set RTC time also if Linux + */ +/*M* +Copyright (c) 2013, Andy Cress +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + a.. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + b.. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *M*/ +#ifdef WIN32 +#include <windows.h> +#include <stdio.h> +#include "getopt.h" +#elif defined(EFI) + // EFI: defined (EFI32) || defined (EFI64) || defined(EFIX64) + #ifndef NULL + #define NULL 0 + #endif + #include <types.h> + #include <libdbg.h> + #include <unistd.h> + #include <errno.h> +#elif defined(DOS) + #include <dos.h> + #include <stdio.h> + #include <stdlib.h> + #include <string.h> + #include "getopt.h" +#else +/* Linux, Solaris, BSD */ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#if defined(HPUX) +/* getopt is defined in stdio.h */ +#elif defined(MACOS) +/* getopt is defined in unistd.h */ +#include <unistd.h> +#else +#include <getopt.h> +#endif +#endif +#include <time.h> +#include <string.h> +#include "ipmicmd.h" + +#define GET_SELTIME 0x48 +#define SET_SELTIME 0x49 +/* + * Global variables + */ +static char * progver = "2.93"; +static char * progname = "iseltime"; +static char fdebug = 0; +static char fset = 0; +static uchar ipmi_maj = 0; +static uchar ipmi_min = 0; + +static int get_sel_time(uchar *rdata, int rlen) +{ + uchar idata[4]; + uchar ccode; + int ret; + ret = ipmi_cmdraw(GET_SELTIME, NETFN_STOR, BMC_SA, PUBLIC_BUS, BMC_LUN, + idata, 0, rdata, &rlen, &ccode, fdebug); + if (ret == 0 && ccode != 0) ret = ccode; + return(ret); +} /*end get_sel_time()*/ + +static int set_sel_time(time_t newtime) +{ + uchar idata[4]; + uchar rdata[16]; + int rlen = 8; + int ret; + uchar ccode; + + idata[0] = (uchar)(newtime & 0x00ff); + idata[1] = (uchar)((newtime >> 8) & 0x00ff); + idata[2] = (uchar)((newtime >> 16) & 0x00ff); + idata[3] = (uchar)((newtime >> 24) & 0x00ff); + ret = ipmi_cmdraw(SET_SELTIME, NETFN_STOR, BMC_SA, PUBLIC_BUS, BMC_LUN, + idata, 4, rdata, &rlen, &ccode, fdebug); + if (ret == 0 && ccode != 0) ret = ccode; + return(ret); +} /*end set_sel_time()*/ + +time_t utc2local(time_t t) +{ + struct tm * tm_tmp; + int gt_year,gt_yday,gt_hour,lt_year,lt_yday,lt_hour; + int delta_hour; + time_t lt; + + //modify UTC time to local time expressed in number of seconds from 1/1/70 0:0:0 1970 GMT + // check for dst? + tm_tmp=gmtime(&t); + gt_year=tm_tmp->tm_year; + gt_yday=tm_tmp->tm_yday; + gt_hour=tm_tmp->tm_hour; + tm_tmp=localtime(&t); + lt_year=tm_tmp->tm_year; + lt_yday=tm_tmp->tm_yday; + lt_hour=tm_tmp->tm_hour; + delta_hour=lt_hour - gt_hour; + if ( (lt_year > gt_year) || ((lt_year == gt_year) && (lt_yday > gt_yday)) ) + delta_hour += 24; + if ( (lt_year < gt_year) || ((lt_year == gt_year) && (lt_yday < gt_yday)) ) + delta_hour -= 24; + if (fdebug) printf("utc2local: delta_hour = %d\n",delta_hour); + lt = t + (delta_hour * 60 * 60); + return(lt); +} + +#define TIMESTR_SZ 30 +void show_time(time_t etime) +{ + char buf[TIMESTR_SZ]; + int bufsz = TIMESTR_SZ; + time_t t; + + strcpy(buf,"00/00/00 00:00:00"); + t = utc2local(etime); + strftime(buf,bufsz, "%x %H:%M:%S", gmtime(&t)); /*or "%x %T"*/ + printf("%s\n",buf); + return; +} + +#ifdef METACOMMAND +int i_iseltime(int argc, char **argv) +#else +#ifdef WIN32 +int __cdecl +#else +int +#endif +main(int argc, char **argv) +#endif +{ + int rv = 0; + uchar devrec[20]; + uchar timebuf[4]; + time_t ltime1, ltime2, ltime3; + int c; + +#if defined (EFI) + InitializeLib(_LIBC_EFIImageHandle, _LIBC_EFISystemTable); +#else + printf("%s ver %s\n", progname,progver); +#endif + + while ( (c = getopt( argc, argv,"sT:V:J:EYF:P:N:R:U:x?")) != EOF ) + switch(c) { + case 's': fset = 1; break; /* read only */ + case 'x': fdebug = 1; break; /* debug messages */ + case 'N': /* nodename */ + case 'U': /* remote username */ + case 'P': /* remote password */ + case 'R': /* remote password */ + case 'E': /* get password from IPMI_PASSWORD environment var */ + case 'F': /* force driver type */ + case 'T': /* auth type */ + case 'J': /* cipher suite */ + case 'V': /* priv level */ + case 'Y': /* prompt for remote password */ + parse_lan_options(c,optarg,fdebug); + break; + default: + printf("Usage: %s [-sx -NUPRETVF]\n", progname); + printf(" where -s Set SEL time (usually once a day)\n"); + printf(" -x show eXtra debug messages\n"); + print_lan_opt_usage(); + exit(1); + } + + rv = ipmi_getdeviceid(devrec,16,fdebug); + if (rv != 0) { + show_outcome(progname,rv); + ipmi_close_(); + exit(rv); + } else { + ipmi_maj = devrec[4] & 0x0f; + ipmi_min = devrec[4] >> 4; +#ifndef EFI + printf("-- BMC version %x.%x, IPMI version %d.%d \n", + devrec[2], devrec[3], ipmi_maj, ipmi_min); +#endif + } + + rv = get_sel_time(&timebuf[0],4); + if (rv != 0) { + printf("get_sel_time error: ret = %x\n",rv); + ipmi_close_(); + exit(1); + } + time(<ime2); + printf("Current System time: "); show_time(ltime2); + ltime1 = timebuf[0] + (timebuf[1] << 8) + (timebuf[2] << 16) + + (timebuf[3] << 24); + printf("Current SEL time: "); show_time(ltime1); + + // if (fdebug) ltime3 = utc2local(ltime1); + + if (fset == 1) { + /* get current time */ + time(<ime2); + rv = set_sel_time(ltime2); + printf("Setting SEL time to System Time: ret = %x\n",rv); + if (rv != 0) printf("set_sel_time error: ret = %x\n",rv); + else { /*successful*/ + rv = get_sel_time(timebuf,8); + if (rv != 0) printf("get_sel_time error: ret = %x\n",rv); + else { + ltime3 = timebuf[0] + (timebuf[1] << 8) + (timebuf[2] << 16) + + (timebuf[3] << 24); + printf("New SEL time: "); show_time(ltime3); + } + } + } +#ifdef LINUX + if (is_remote() == 0) { + c = system("echo \"Current RTC time: `hwclock`\""); + if (fset == 1) { + c = system("hwclock --systohc"); + printf("Copying System Time to RTC: ret = %d\n",c); + } + } +#endif + ipmi_close_(); + show_outcome(progname,rv); + exit (rv); +} /* end main()*/ + +/* end iseltime.c */ |