EzDoum

찾기
처음으로 | 찾기 | 아카이브 | 글 올리기 | 링크 | 자료실 | 통계 | 연락처 | 자유게시판
이지도움 특집
전체보기
네트워크
TI OMAP35x
TI DaVinci
Analog Blackfin
RobotWar2005
임베디드!
캐쉬의 모든것
메모리 할당 알고리즘
CPU 파이프라이닝
자료구조(Tree)
금융

Login
이름

암호

기억하기


사용자 등록

현재 접속중인 등록 사용자는 0명, 익명 사용자는 2명 입니다.
전체 등록 사용자: 751명

마지막 답장
·libcurl + fuse 조합으로 되는게 많네. (1)
·Linux Ftrace에 관해 (3)
·Android MTP ( Media Transfer Protocol ) (1)
·Lighttpd에 인증을 digest 사용시 IE 오동작 문제? (1)
·Dtrace에 관해 (1)

최근글
·OpenSSL and multi-threads (0)
·ARM 환경에서 OpenCL 사용 (0)
·IoT용 WIFI 모듈 비교 ( MCU ) 클래스 (0)
·Glances - 리눅스 여러 가지 항목을 한 화면에서 모니터링 (0)
·plugin 방식의 로그 분석기 (0)

뜨거운 감자
·나는 인터렉티브한 환경에서 역어셈블 한다. (12)
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)
·ASP.NET의 데이터 그리드와 사용자 컨트롤 (7)
·DHTML Editing Control (7)

가장 많이 읽은 글
·[Cache] 2-way Set-Associative 방식이란 무엇일까? (2)
·멀티쓰레드(Pthread) 프로그래밍
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·Sorting Algorithm Animation (2)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)

zoneinfo 파일 덤프
글쓴이: EzDoum 글쓴날: 2008년 11월 17일 오전 11:43
리눅스



dst 관련 문제를 깔끔하게 해결해 줄 zoneinfo 파일 덤프 예제이다
glibc가 제공하는 dst관련 함수는 local zone 설정을 바꿔야만 확인 가능하다. 때문에 zone 변경없이 다른 타임zone의 DST여부나 GMT로 부터 offset을 계산하기가 쉽지 않다. 직접 zone파일 보고 판단하는 함수를 만들어야 한다.

zoneinfo 참고 자료
http://www.ezdoum.com/stories.php?story=08/10/28/2768225

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. struct tzhead {
  7.         char    tzh_magic[4];          /* TZ_MAGIC */
  8.         char    tzh_version[1];      /* '\0' or '2' as of 2005 */
  9.         char    tzh_reserved[15];      /* reserved--must be zero */
  10.         char    tzh_ttisgmtcnt[4];    /* coded number of trans. time flags */
  11.         char    tzh_ttisstdcnt[4];    /* coded number of trans. time flags */
  12.         char    tzh_leapcnt[4];      /* coded number of leap seconds */
  13.         char    tzh_timecnt[4];      /* coded number of transition times */
  14.         char    tzh_typecnt[4];      /* coded number of local time types */
  15.         char    tzh_charcnt[4];      /* coded number of abbr. chars */
  16. };
  17.  
  18. static char *progname;
  19.  
  20. static long long
  21. detzcode64(codep)
  22. const char * const        codep;
  23. {
  24.         register long long        result;
  25.         register int        i;
  26.  
  27.         result = (codep[0] & 0x80) ? ~0L : 0L;
  28.  
  29.         for (i = 0; i < 8; ++i)
  30.                 result = result * 256 + (codep[i] & 0xff);
  31.  
  32.         return result;
  33. }
  34.  
  35. static long long
  36. detzcode(codep)
  37. const char * const        codep;
  38. {
  39.         register long   result;
  40.         register int    i;
  41.  
  42.         result = (codep[0] & 0x80) ? ~0L : 0L;
  43.         for (i = 0; i < 4; ++i)
  44.                 result = (result << 8) | (codep[i] & 0xff);
  45.         return result;
  46. }
  47.  
  48. static void
  49. wild2exit(cp, dp)
  50. {
  51.         fprintf(stderr, "%s: wild result %s %s\n", progname, cp, dp);
  52.         exit(1);
  53. }
  54.  
  55. static void
  56. tz_dump_out(filename)
  57. char *  filename;
  58. {
  59.         FILE *    fp;
  60.         struct tzhead   tzh;
  61.         long long       ll;
  62.         char        c;
  63.         int               i;
  64.         int               pass;
  65.         long        ttisgmtcnt;
  66.         long        ttisstdcnt;
  67.         long        leapcnt;
  68.         long        timecnt;
  69.         long        typecnt;
  70.         long        charcnt;
  71.         char        buf[8];
  72.  
  73.         struct tm          tm;
  74.  
  75.         fp = fopen(filename, "r");
  76.        
  77.         if (fp == NULL)
  78.                 wild2exit("result opening", filename);
  79.                
  80.         for (pass = 1; pass <= 2; ++pass) {
  81.  
  82.                 if (fread(&tzh, sizeof tzh, 1, fp) != 1)
  83.                         wild2exit("result reading", filename);
  84.        
  85.                 printf("%s\tversion\t", filename);
  86.        
  87.                 c = tzh.tzh_version[0];
  88.                
  89.                 if (isascii(c) && isprint(c))
  90.                         putchar(c);
  91.                 else   
  92.                         printf("\\%o", c);
  93.        
  94.                 putchar('\n');
  95.        
  96.                 ttisgmtcnt      = detzcode(tzh.tzh_ttisgmtcnt );
  97.                 ttisstdcnt      = detzcode(tzh.tzh_ttisstdcnt );
  98.                 leapcnt  = detzcode(tzh.tzh_leapcnt              );
  99.                 timecnt  = detzcode(tzh.tzh_timecnt              );
  100.                 typecnt  = detzcode(tzh.tzh_typecnt              );
  101.                 charcnt  = detzcode(tzh.tzh_charcnt              );
  102.        
  103.                 printf("%s\tttisgmtcnt\t%ld\n", filename, ttisgmtcnt);
  104.                 printf("%s\tttisstdcnt\t%ld\n", filename, ttisstdcnt);
  105.                 printf("%s\tleapcnt\t%ld\n", filename, leapcnt);
  106.                 printf("%s\ttimecnt\t%ld\n", filename, timecnt);
  107.                 printf("%s\ttypecnt\t%ld\n", filename, typecnt);
  108.                 printf("%s\tcharcnt\t%ld\n", filename, charcnt);
  109.        
  110.                 for (i = 0; i < timecnt; ++i) {
  111.                         time_t  l;
  112.                         if (fread(buf, pass * 4, 1, fp) != 1)
  113.                                 wild2exit("result reading", filename);
  114.                                
  115.                         ll = (pass == 1) ? detzcode(buf) : detzcode64(buf);
  116.                         {
  117.                                 time_t  l;
  118.                                 l = ll;
  119.                                 tm = *gmtime(&l);
  120.                         }
  121.                         l = ll;   
  122.                         printf("%s\ttime[%3d]\t%08x\t%s", filename, i, l, asctime(&tm));
  123.                 }
  124.                
  125.                 for (i = 0; i < timecnt; ++i) {
  126.                         if (fread(buf, 1, 1, fp) != 1)
  127.                                 wild2exit("result reading", filename);
  128.  
  129.                         printf("%s\ttype[%d]\t%d\n", filename, i, buf[0]);
  130.                 }
  131.                
  132.                 for (i = 0; i < typecnt; ++i) {
  133.                         long    l;
  134.  
  135.                         if (fread(buf, 4, 1, fp) != 1)
  136.                                 wild2exit("result reading", filename);
  137.                         l = detzcode(buf);
  138.                         printf("%s\ttype[%d].offset\t%ld\n", filename, i, l);
  139.                         if (fread(buf, 1, 1, fp) != 1)
  140.                                 wild2exit("result reading", filename);
  141.                         printf("%s\ttype[%d].isdst\t%ld\n", filename, i, buf[0]);
  142.                         if (fread(buf, 1, 1, fp) != 1)
  143.                                 wild2exit("result reading", filename);
  144.                         printf("%s\ttype[%d].abbrind\t%ld\n",filename, i, buf[0]);
  145.                 }
  146.                
  147.                 for (i = 0; i < charcnt; ++i) {
  148.                         if (fread(buf, 1, 1, fp) != 1)
  149.                                 wild2exit("result reading", filename);
  150.                         printf("%s\tabbr[%d]\t", filename, i);
  151.                         if (isascii(buf[0]) && isprint(buf[0]))
  152.                                 printf("%c", buf[0]);
  153.                         else if (buf[0] == '\0')
  154.                                 printf("\\0");
  155.                         else    printf("\%03o", buf[0]);
  156.                         printf("\n");
  157.                 }
  158.                
  159.                 for (i = 0; i < ttisstdcnt; ++i) {
  160.                         if (fread(buf, 1, 1, fp) != 1)
  161.                                 wild2exit("result reading", filename);
  162.                         printf("%s\tisstd[%d]\t%d\n",
  163.                                 filename, i, buf[0]);
  164.                 }
  165.                
  166.                 for (i = 0; i < ttisgmtcnt; ++i) {
  167.  
  168.                         if (fread(buf, 1, 1, fp) != 1)
  169.                                 wild2exit("result reading", filename);
  170.                                
  171.                         printf("%s\tisgmt[%d]\t%d\n",
  172.                                 filename, i, buf[0]);
  173.                 }
  174.                
  175.                 if (tzh.tzh_version[0] != '2')
  176.                         break;
  177.         }
  178.        
  179.         if (fclose(fp) != 0) {
  180.                 fprintf(stderr, "%s: wild result closing %s\n",
  181.                         progname, filename);
  182.                 exit(1);
  183.         }
  184. }
  185.  
  186. int
  187. main(argc, argv)
  188. int      argc;
  189. char *  argv[];
  190. {
  191.         int      i;
  192.  
  193.         progname = argv[0];
  194.         for (i = 1; i < argc; ++i)
  195.                 tz_dump_out(argv[i]);
  196.                
  197.         exit(0);
  198. }
  199.  
  200.  


[분류: 리눅스 인쇄용 페이지 본문 email로 보내기 ]

<  극사실주의적으로 소규모 식당 외식업 망하는 과정 | BootupTimeReductionHowto  >

답장 쓰기
글을 올리시려면 로그인 (사용자 등록) 하셔야 합니다.

검색
Google

분류
·공지 (6)
·인터넷 (87)
·하드웨어 (260)
·C/C++ (65)
·어셈블리 (7)
·리눅스 (136)
·리눅스 커널 (67)
·윈도우즈 (25)
·데이터베이스 (20)
·보안 (16)
·.NET (25)
·그래픽 (13)
·책소개 (42)
·호기심 천국 (80)
·잡담 (111)
·사랑 (3)

전체 본문수: 963
전체 답장수: 525


분류 : 리눅스
최근글
최근글
가장 많이 읽은 글
·멀티쓰레드(Pthread) 프로그래밍 (0)
뜨거운 감자
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)

EzDoum투표
이지도움 어때요?
이게 뭐야. 다시 안올란다. --;
아이 좋아라~ +_+;
관심없다.
먼가는 있는거 같은데 뭐하는 곳이지?
기타 (자유게시판에 글로 남겨 주세요)
[ 결과 | 투표 ]

랜덤 링크
http://kldp.net


 Home ^ BACK TO TOP ^ EzDoum - 도움이 필요하세요~??
 Powered by KorWeblog 1.5.8 Copyleft © 2001 EzDoum, 관리자: EzDoum