Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7039
  • 博文数量: 5
  • 博客积分: 195
  • 博客等级: 入伍新兵
  • 技术积分: 75
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-16 11:02
文章分类

全部博文(5)

文章存档

2012年(5)

我的朋友

分类: C/C++

2012-08-02 09:25:41


点击(此处)折叠或打开

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7. #include <unistd.h>
  8. #include <errno.h>
  9. #include <stdarg.h>
  10. #include <syslog.h>
  11. #include <string.h>
  12. #include <time.h>
  13. #include <sys/timeb.h>
  14. #include <netdb.h>

  15. /*************/
  16. /* 定数宣言 */
  17. /*************/
  18. #define BUFFER_SIZE 1024
  19. #define MAILTXT_SIZE 1024
  20. #define NAME_SIZE 100
  21. #define TIME_SIZE 30
  22. #define DESTSERV "localhost"

  23. /*******************/
  24. /* グローバル変数 */
  25. /*******************/

  26. /* プログラム名 */
  27. char *prgname = NULL;
  28. /* ログメッセージファイルパス */
  29. char *logmsgfiledir = NULL;
  30. /* 吖堀弗绁芝庭氓菼D */
  31. char *jobnetid = NULL;
  32. /* 吖堀弗绁諭D */
  33. char *jobid = NULL;
  34. /* 最上位吖堀弗绁芝庭氓菼D */
  35. char *topjobnetid = NULL;

  36. /**************************************************************************************/
  37. /* 関数名:main */
  38. /* 関数名称:メイン関数 */
  39. /* 機能概要:業務アプリケーション起動 */
  40. /* 引数 :(1)ログ+メッセージファイルパス */
  41. /* (2)ポート番号 */
  42. /* (3)送信電文(1個以上) */
  43. /* 戻り値 :(0)正常終了 */
  44. /* (1)異常終了 */
  45. /**************************************************************************************/
  46. int main(int argc, char *argv[])
  47. {
  48.     /* ソケット作成戻り値を格?span style="color:#0000CC;">{する変数 */
  49.     int sockfd ;
  50.     /* 送信電文の文字列長 */
  51.     int lenmail ;
  52.     /* ポート番号 */
  53.     int hostno ;
  54.     /* 戻り値を格?span style="color:#0000CC;">{する変数 */
  55.     int result ;
  56.     /* ソケットアドレス */
  57.     struct sockaddr_in address ;
  58.     /* アドレス*/
  59.     struct hostent *hostent;
  60.     /* 送信電文の8文字の数字文字列長*/
  61.     char strlenmail[8];
  62.     /* エラーログ出力関数に置換文字列 */
  63.     char *vaparmeter[10];
  64.     /* 送信電文 */
  65.     char mailtxt[MAILTXT_SIZE];
  66.     /* 要求電文送信 */
  67.     char tomailtxt[MAILTXT_SIZE];
  68.     /* 受信電文 */
  69.     char remailbuff[MAILTXT_SIZE];
  70.     /* 受信の戻り値 */
  71.     char remailcode[1];
  72.     /* メッセージ本文バッファ*/
  73.     char msgtxtbuff[BUFFER_SIZE];
  74.     /* メッセージ本文*/
  75.     char msgtxt[BUFFER_SIZE];
  76.     /* ホスト名*/
  77.     char hostname[NAME_SIZE];
  78.     /* ローカル変数の文字列*/
  79.     char strNo[NAME_SIZE];
  80.     /* エラー番号の文字列*/
  81.     char strerrNo[NAME_SIZE];

  82.     /* システム時間を取得する*/
  83.     time_t rawtime;
  84.     struct tm * timeinfo;
  85.     time ( &rawtime );
  86.     timeinfo = localtime ( &rawtime );
  87.     struct timeb tp;
  88.     ftime(&tp);
  89.     char strtime[TIME_SIZE];
  90.     /* システム時間がフォーマット「yyyy/MM/dd HH:mm:ss.SSS」に変換する*/
  91.     strftime ( strtime,TIME_SIZE,"%Y/%m/%d %H:%M:%S",timeinfo);
  92.     sprintf(strtime,"%s.%03d\n",strtime,tp.millitm);

  93.     /* 起動パラメタの0個目からプログラム名を取得する。 */
  94.     /* 取得したプログラム名をグローバル変数に設定する。*/
  95.     prgname=argv[0];

  96.     /* パラメタ取得 */
  97.     /* 起動パラメタ数が3以上であること*/
  98.     /* 上記でない場合*/
  99.     if ( 3>=argc ){

  100.        /* メッセージレベルが"ERR"固定*/
  101.        strcat(msgtxtbuff , "ERR");
  102.        strcat(msgtxtbuff , " ");

  103.        /* センタ情報が環境変数よりセンタ情報を取得する*/
  104.       strcat(msgtxtbuff , getenv("CENTER"));
  105.        strcat(msgtxtbuff , " ");

  106.        /* ホスト名が標準関数よりホスト名を取得する*/
  107.        gethostname(hostname, sizeof(hostname));
  108.        strcat(msgtxtbuff , hostname);
  109.        strcat(msgtxtbuff , " ");

  110.        /* 吖堀弗绁芝庭氓菼Dが環境変数より吖堀弗绁芝庭氓菼D情報を取得する*/
  111.        strcat(msgtxtbuff , getenv("JOBSCH_JOBNET"));
  112.        strcat(msgtxtbuff , "/");

  113.        /* 吖堀弗绁諭Dが環境変数より吖堀弗绁諭D情報を取得する*/
  114.        strcat(msgtxtbuff , getenv("JC_JOBID"));
  115.        strcat(msgtxtbuff , " ");

  116.        /* 出力日時がシステム時間を取得する*/
  117.        strcat(msgtxtbuff , strtime);
  118.        strcat(msgtxtbuff , " : ");
  119.     
  120.        /* メッセージカテゴリが"IFR"固定*/
  121.        strcat(msgtxtbuff , "IFR");
  122.        strcat(msgtxtbuff , " : : ");

  123.        /* メソッド名が関数名*/
  124.        strcat(msgtxtbuff , __func__);
  125.        strcat(msgtxtbuff , " : ");

  126.        /* メッセージIDが"BALCCBA803E"固定*/
  127.        strcat(msgtxtbuff , "BALCCBA803E");
  128.        strcat(msgtxtbuff , " : ");

  129.        /* メッセージ本文を作成する*/
  130.        sprintf(msgtxt,"The program will exit for the number of parameters is incorrect.(Number :%d)",argc-1);
  131.        /* メッセージ本文バッファを作成する*/
  132.        strcat(msgtxtbuff , msgtxt);
  133.        /* 作成したエラーログメッセージをパラメタとしエラーログ出力関数(内部)を呼び出*/
  134.        outputSysLog(msgtxtbuff);
  135.        /* リターンコード:1 */
  136.        exit(1);
  137.     }

  138.     /* 起動パラメタの1個目からログメッセージファイルパスを取得する。*/
  139.     /* 取得したログメッセージファイルパスをグローバル変数に設定する。*/
  140.     logmsgfiledir=argv[1];

  141.     /* 起動パラメタの2個目からポート番号を取得する。*/
  142.     hostno = atoi(argv[2]);
  143.     /* ポート番号が数値に変換できなかった場合 */
  144.     if ( hostno<=0 || hostno>65535 ) {

  145.       /* エラーログ出力関数に置換文字列 */
  146.       vaparmeter[0] = argv[2];
  147.       /* エラーログ出力関数呼び出しエラーログを出力し終了する。*/
  148.       outputErrLog(__func__,"BALCCBA804E",(char*)vaparmeter);
  149.       /* リターンコード:1 */
  150.       exit(1);
  151.     }

  152.     /* 送信電文作成*/
  153.     /* 空の送信電文バッファを用意する*/
  154.     memset(mailtxt , '\0' , MAILTXT_SIZE);

  155.     int i;
  156.     /* 起動パラメタの 3個目から最後のパラメタまで、次の処理を繰り返す*/
  157.     for(i=3;i<argc;i++)
  158.     {

  159.        /* パラメタが「JOBSCH_JOBNET=」で始ま*/
  160.        if( strncmp(argv[i],"JOBSCH_JOBNET=",14) == 0){

  161.           /* 既に吖堀弗绁芝庭氓菼D が NULLの場合*/
  162.           if( NULL == jobnetid ){
  163.               /* 当該項目の"="以降の値を取得する */
  164.               jobnetid=strtok(argv[i],"JOBSCH_JOBNET=");
  165.           }
  166.           else
  167.           /* 既に吖堀弗绁芝庭氓菼D が NULL ではなかった場合*/
  168.           {
  169.              /* エラーログ出力関数に置換文字列 */
  170.              vaparmeter[0] = "JOBSCH_JOBNET";
  171.              /* エラーログ出力関数呼び出しエラーログを出力し終了する。*/
  172.              outputErrLog(__func__,"BALCCBA805E",(char*)vaparmeter);
  173.              /* リターンコード:1 */
  174.              exit(1);
  175.           }
  176.        }

  177.        /* パラメタが「JC_JOBID=」で始ま*/
  178.        if( strncmp(argv[i],"JC_JOBID=",9) == 0){
  179.           /* 既に吖堀弗绁諭D が NULLの場合*/
  180.           if( NULL == jobid ){
  181.              /* 当該項目の"="以降の値を取得する */
  182.              jobid=strtok(argv[i],"JC_JOBID=");
  183.           }else
  184.           /* 既に吖堀弗绁諭D が NULL ではなかった場合*/
  185.           {
  186.              /* エラーログ出力関数に置換文字列 */
  187.              vaparmeter[0] = "JC_JOBID";
  188.              /* エラーログ出力関数呼び出しエラーログを出力し終了する。*/
  189.              outputErrLog(__func__,"BALCCBA805E",(char*)vaparmeter);
  190.              /* リターンコード:1 */
  191.              exit(1);
  192.           }
  193.        }

  194.        /* パラメタが「TOP_JOBSCH_JOBNET=」で始ま*/
  195.        if(strncmp(argv[i],"TOP_JOBSCH_JOBNET=",18) == 0){
  196.           /* 既に吖堀弗绁諭D が NULLの場合*/
  197.           if( NULL == topjobnetid ){
  198.              /* 当該項目の"="以降の値を取得する */
  199.              topjobnetid=strtok(argv[i],"TOP_JOBSCH_JOBNET=");
  200.           }else
  201.           /* 既に吖堀弗绁諭D が NULL ではなかった場合*/
  202.           {
  203.              /* エラーログ出力関数に置換文字列 */
  204.              vaparmeter[0] = "TOP_JOBSCH_JOBNET";
  205.              /* エラーログ出力関数呼び出しエラーログを出力し終了する。*/
  206.              outputErrLog(__func__,"BALCCBA805E",(char*)vaparmeter);
  207.              /* リターンコード:1 */
  208.              exit(1);
  209.           }
  210.        }

  211.        /* パラメタに "=" が含まれていない場合*/
  212.        if(strstr(argv[i],"=") == 0){
  213.           /* エラーログ出力関数に置換文字列 */
  214.           sprintf(strNo,"%d", i);
  215.           vaparmeter[0] = strNo;
  216.           vaparmeter[1] = argv[i];
  217.           /* エラーログ出力関数呼び出しエラーログを出力し終了する。*/
  218.           outputErrLog(__func__,"BALCCBA806E",(char*)vaparmeter);
  219.           /* リターンコード:1 */
  220.           exit(1);
  221.        }
  222.        /* 送信電文が NULL ではなかった場合*/
  223.        if( strlen(mailtxt) != 0 ){
  224.           strcat(mailtxt,"&");
  225.        }
  226.        /* 送信電文バッファにパラメタを追記する*/
  227.        strcat(mailtxt,argv[i]);
  228.     }

  229.     /*吖堀弗绁芝庭氓菼D または吖堀弗绁諭D または最上位吖堀弗绁芝庭氓菼DのいずれかがNULL だった場合*/
  230.     if( ( NULL == jobnetid ) || ( NULL == jobid ) || ( NULL == topjobnetid ) ){
  231.        /* エラーログ出力関数呼び出しエラーログを出力し終了する。*/
  232.        outputErrLog(__func__,"BALCCBA807E",(char*)vaparmeter);
  233.        /* リターンコード:1 */
  234.        exit(1);
  235.     }

  236.     /* ソケット作成(socket)*/
  237.     /* ソケット作成に失敗した場合*/
  238.     if (( sockfd = socket(AF_INET,SOCK_STREAM,0) ) <0 ) {

  239.       /* エラーログ出力関数に置換文字列 */
  240.       sprintf(strerrNo,"%d", errno);
  241.       vaparmeter[0] = strerrNo;
  242.       vaparmeter[1] = strerror(errno);
  243.       /* エラーログ出力関数呼び出しエラーログを出力し終了する。*/
  244.       outputErrLog(__func__ , "BALCCBA808E" , (char*)vaparmeter);
  245.       /* リターンコード:1 */
  246.       exit(1);
  247.     }

  248.     /* ソケットアドレス作成(sockaddr_in)*/
  249.     /* ソケットアドレスを0x00で初期化する */
  250.     memset( &address , 0x00 , sizeof(address) );
  251.     /* アドレスファミリー:AF_INET */
  252.     address.sin_family = AF_INET;
  253.     /* アドレス:"localhost"を指定して取得したIPアドレス*/
  254.     hostent = gethostbyname(DESTSERV);
  255.     bcopy(hostent->h_addr, &address.sin_addr, hostent->h_length);

  256.     /* ポート番号*/
  257.     address.sin_port = htons(hostno);

  258.     /* ソケットの接続(connect)*/
  259.     /* ソケットを接続する */
  260.     result = connect(sockfd , (struct sockaddr *)&address , sizeof(address));

  261.     /* ソケット接続に失敗した場合*/
  262.     if ( result == -1 ) {
  263.       /* エラーログ出力関数に置換文字列 */
  264.       vaparmeter[0] = argv[2];
  265.       sprintf(strerrNo,"%d", errno);
  266.       vaparmeter[1] = strerrNo;
  267.       vaparmeter[2] = strerror(errno);
  268.       /* エラーログ出力関数呼び出しエラーログを出力し終了する。*/
  269.       outputErrLog(__func__,"BALCCBA809E",(char*)vaparmeter);

  270.       /* リターンコード:1 */
  271.       exit(1);
  272.     }

  273.     /* 送信電文の文字列長を取得する */
  274.     lenmail=strlen(mailtxt);
  275.     /* 8文字の数字文字列にしたもの(%08d に相当)*/
  276.     sprintf(strlenmail,"%08d",lenmail);

  277.     /* 要求電文送信を作成*/
  278.     /* 空の送信電文バッファを用意する*/
  279.     memset(tomailtxt,0x00,sizeof(tomailtxt));
  280.     strcat(tomailtxt,strlenmail);
  281.     strcat(tomailtxt,mailtxt);
  282.     /* 要求電文送信(write)*/
  283.     result = write(sockfd,tomailtxt,strlen(tomailtxt));

  284.     /* 要求電文送信に失敗した場合*/
  285.     if ( result == -1 ) {
  286.       /* エラーログ出力関数に置換文字列 */
  287.       vaparmeter[0] = argv[2];
  288.       sprintf(strerrNo,"%d", errno);
  289.       vaparmeter[1] = strerrNo;
  290.       vaparmeter[2] = strerror(errno);
  291.       /* エラーログ出力関数呼び出しエラーログを出力し終了する。*/
  292.       outputErrLog(__func__,"BALCCBA810E",(char*)vaparmeter);
  293.       /* リターンコード:1 */
  294.       exit(1);
  295.     }

  296.     /* 応答電文受信(read)*/
  297.     result = read(sockfd,remailbuff,sizeof(remailbuff));
  298.     /* 応答電文受信に失敗した場合*/
  299.     if ( result == -1 ) {
  300.       /* エラーログ出力関数に置換文字列 */
  301.       vaparmeter[0] = argv[2];
  302.       sprintf(strerrNo,"%d", errno);
  303.       vaparmeter[1] = strerrNo;
  304.       vaparmeter[2] = strerror(errno);
  305.       /* エラーログ出力関数呼び出しエラーログを出力し終了する。*/
  306.       outputErrLog(__func__,"BALCCBA811E",(char*)vaparmeter);
  307.       /* リターンコード:1 */
  308.       exit(1);
  309.     }

  310.     /* データが数値文字列ではない場合*/
  311.     if( ((char*)remailbuff == '\0') || (strlen(remailbuff) != 8) ){
  312.         /* エラーログ出力関数に置換文字列 */
  313.         vaparmeter[0] = argv[2];
  314.         vaparmeter[1] = remailbuff;
  315.        /* エラーログ出力関数呼び出しエラーログを出力し終了する。*/
  316.        outputErrLog(__func__,"BALCCBA812E",(char*)vaparmeter);
  317.        /* リターンコード:1 */
  318.        exit(1);
  319.     }

  320.     /* ソケットクローズ(close)*/
  321.     close(sockfd);
  322.     /* 応答電文解析 */
  323.     /* 応答電文から"status="文字列を検索する */
  324.     if(strstr(remailbuff,"status=") == 0)
  325.     {
  326.       /* エラーログ出力関数に置換文字列 */
  327.       vaparmeter[0] = argv[2];
  328.       vaparmeter[1] = remailbuff;
  329.       /* エラーログ出力関数呼び出しエラーログを出力し終了する。*/
  330.       outputErrLog(__func__ , "BALCCBA812E" , (char*)vaparmeter);
  331.       /* リターンコード:1 */
  332.       exit(1);
  333.     }

  334.     /* 検索した位置から"status="の文字列サイズ後方の1文字を取得する */
  335.     strncpy( remailcode, strtok(remailbuff,"status="), 1);
  336.     result = atoi(remailcode);
  337.     /*exitコード返却(exit)*/
  338.     exit(result);
  339. }

  340. /**************************************************************************************/
  341. /* 関数名:outputErrLog */
  342. /* 関数名称:エラーログ出力関数 */
  343. /* 機能概要:syslogにエラーメッセージを出力する。 */
  344. /* 引数 :(1)関数名 */
  345. /* (2)メッセージID */
  346. /* (3)置換文字列(可変パラメタ) */
  347. /* 戻り値 :(0)正常終了 */
  348. /* (1)異常終了 */
  349. /**************************************************************************************/
  350. int outputErrLog (const char *funname,const char *msgid,char *vaparmeter)
  351. {

  352.     /* 戻り値を格?span style="color:#0000CC;">{する変数 */
  353.     int result ;
  354.     /* ログメッセージバッファ*/
  355.     char errorlogmsgbuff[BUFFER_SIZE ];

  356.     /* エラーログメッセージ作成*/
  357.     result = makeErrMsg(errorlogmsgbuff , funname , msgid , (char*)vaparmeter);
  358.     /* エラーログメッセージ作成の結果が「正常」の場合*/
  359.     if ( result == 0 ) {
  360.        /* エラーログ出力関数(内部)を呼び出し、エラーログを出力する*/
  361.        outputSysLog(errorlogmsgbuff);
  362.        /* 処理結果「正常」を返す*/
  363.        return 0;
  364.     }else
  365.     {
  366.        /* 処理結果「異常」を返す*/
  367.        return 1;
  368.        
  369.     }

  370. }

  371. /**************************************************************************************/
  372. /* 関数名:outputSysLog */
  373. /* 関数名称:エラーログ出力関数(内部) */
  374. /* 機能概要:syslogにエラーメッセージを出力する。 */
  375. /* 引数 :(1)エラーログメッセージ */
  376. /* 戻り値 :(0)正常終了 */
  377. /* (1)異常終了 */
  378. /**************************************************************************************/
  379. int outputSysLog(char *errorlogmsgbuff)
  380. {

  381.     /* オープン(openlog) */
  382.     openlog(prgname, LOG_CONS | LOG_PID, LOG_USER);
  383.     /* 書き込み(syslog)*/
  384.     syslog(LOG_ERR, errorlogmsgbuff);
  385.     /* クローズ(closelog)*/
  386.     closelog();
  387. }

  388. /**************************************************************************************/
  389. /* 関数名:makeErrMsg */
  390. /* 関数名称:エラーログメッセージ作成関数 */
  391. /* 機能概要:メッセージIDからメッセージ本文を取得し置換文字列を置き換える。 */
  392. /* また、システム情報を付加しエラーログメッセージ作成し返却する。 */
  393. /* 引数 :(1)ログメッセージバッファ */
  394. /* (2)関数名 */
  395. /* (3)メッセージID */
  396. /* (4)置換文字列(可変パラメタ) */
  397. /* 戻り値 :(0)正常終了 */
  398. /* (1)異常終了 */
  399. /**************************************************************************************/
  400. int makeErrMsg(char *errorlogmsgbuff , const char *funname,const char *msgid,char *vaparmeter)
  401. {

  402.     /* ログメッセージ本文バッファ*/
  403.     char logmsgtxtbuff[BUFFER_SIZE];
  404.     /* ホスト名*/
  405.     char hostname[NAME_SIZE];
  406.     /* 戻り値を格?span style="color:#0000CC;">{する変数 */
  407.     int result ;

  408.     /* システム時間を取得する*/
  409.     time_t rawtime;
  410.     struct tm * timeinfo;
  411.     time ( &rawtime );
  412.     timeinfo = localtime ( &rawtime );
  413.     struct timeb tp;
  414.     ftime(&tp);
  415.     char strtime[TIME_SIZE];
  416.     /* システム時間がフォーマット「yyyy/MM/dd HH:mm:ss.SSS」に変換する*/
  417.     strftime ( strtime,TIME_SIZE,"%Y/%m/%d %H:%M:%S",timeinfo);
  418.     sprintf(strtime,"%s.%03d\n",strtime,tp.millitm);

  419.     /* メッセージ本文作成*/
  420.     /* メッセージレベルが"ERR"固定*/
  421.     strcat(errorlogmsgbuff , "ERR");
  422.     strcat(errorlogmsgbuff , " ");
  423.     
  424.     /* センタ情報が環境変数よりセンタ情報を取得する*/
  425.     strcat(errorlogmsgbuff , getenv("CENTER"));
  426.     strcat(errorlogmsgbuff , " ");

  427.     /* ホスト名が標準関数よりホスト名を取得する*/
  428.     gethostname(hostname, sizeof(hostname));
  429.     strcat(errorlogmsgbuff , hostname);
  430.     strcat(errorlogmsgbuff , " ");

  431.     /* 吖堀弗绁芝庭氓菼Dが環境変数より吖堀弗绁芝庭氓菼D情報を取得する*/
  432.     strcat(errorlogmsgbuff , getenv("JOBSCH_JOBNET"));
  433.     strcat(errorlogmsgbuff , "/");

  434.     /* 吖堀弗绁諭Dが環境変数より吖堀弗绁諭D情報を取得する*/
  435.     strcat(errorlogmsgbuff , getenv("JC_JOBID"));
  436.     strcat(errorlogmsgbuff , " ");

  437.     /* 出力日時がシステム時間を取得する*/
  438.     strcat(errorlogmsgbuff ,strtime);
  439.     strcat(errorlogmsgbuff , " : ");

  440.     /* メッセージカテゴリが"IFR"固定*/
  441.     strcat(errorlogmsgbuff , "IFR");
  442.     strcat(errorlogmsgbuff , " : : ");

  443.     /* メソッド名がパラメタの関数名*/
  444.     strcat(errorlogmsgbuff , funname);
  445.     strcat(errorlogmsgbuff , " : ");

  446.     /* メッセージIDがパラメタのメッセージID*/
  447.     strcat(errorlogmsgbuff , msgid);
  448.     strcat(errorlogmsgbuff , " : ");

  449.     /* メッセージ本文取得を呼び出し、メッセージ本文を取得する*/
  450.     result = getMsg(logmsgtxtbuff,msgid,(char*)vaparmeter);
  451.     
  452.     /* 取得に失敗した場合*/
  453.     if ( result == 1 )
  454.     {
  455.       /* 処理結果「異常」を返す*/
  456.       return 1;
  457.     }else
  458.     {
  459.       /* ログメッセージバッファ(errorlogmsgbuff)を作成する*/
  460.       strcat(errorlogmsgbuff , logmsgtxtbuff);
  461.       /* 処理結果「正常」を返す*/
  462.       return 0;
  463.     }

  464. }
  465. /**************************************************************************************/
  466. /* 関数名:getMsg */
  467. /* 関数名称:メッセージ本文取得関数 */
  468. /* 機能概要:メッセージ本文構造体から指定されたメッセージ本文を取得し、 */
  469. /* 置換文字列を置き換えた結果のメッセージ本文を返す。 */
  470. /* 引数 :(1)メッセージ本文バッファ */
  471. /* (2)メッセージID */
  472. /* (3)置換文字列(可変パラメタ) */
  473. /* 戻り値 :(0)正常終了 */
  474. /* (1)異常終了 */
  475. /**************************************************************************************/
  476. int getMsg(char *logmsgtxtbuff ,const char *msgid,char *vaparmeter)
  477. {

  478.    /* メッセージ本文バッファ*/
  479.    char msgtxtbuff[BUFFER_SIZE ];
  480.    /* 戻り値を格?span style="color:#0000CC;">{する変数 */
  481.    int result ;

  482.    /* エラーログメッセージファイル読み込みからパラメタのメッセージIDに一致する*/
  483.    /* メッセージ本文を取得する*/
  484.    result = readErrMsgFile(msgtxtbuff,msgid);
  485.    
  486.    /* 取得に失敗した場合*/
  487.    if ( result == 1 )
  488.    {
  489.       /* 処理結果「異常」を返す*/
  490.       return 1;
  491.    }else
  492.    {
  493.       /* メッセージ本文に置換文字列を埋め込む*/
  494.       /* オーバーフローを防止する実装とすること(vsnprintfの利用など)*/
  495.       vsnprintf(logmsgtxtbuff, BUFFER_SIZE, msgtxtbuff, (char*)vaparmeter);
  496.       /* 処理結果「正常」を返す*/
  497.       return 0;
  498.    }
  499. }

  500. /**************************************************************************************/
  501. /* 関数名:readErrMsgFile */
  502. /* 関数名称:エラーログメッセージファイル読み込み関数 */
  503. /* 機能概要:エラーログメッセージファイルを読み込みメッセージ本文を返す。、 */
  504. /* 引数 :(1)メッセージ本文バッファ */
  505. /* (2)メッセージID */
  506. /* 戻り値 :(0)正常終了 */
  507. /* (1)異常終了 */
  508. /**************************************************************************************/
  509. int readErrMsgFile(char *msgtxtbuff ,const char *msgid)
  510. {

  511.    /* ホスト名*/
  512.    char hostname[NAME_SIZE];
  513.    /* エラーログメッセージファイル*/
  514.    FILE *msgfile;
  515.    char filelinetxt[BUFFER_SIZE];
  516.    char *tomsgid;
  517.    char msgtxt[BUFFER_SIZE];

  518.    /* システム時間を取得する*/
  519.    time_t rawtime;
  520.    struct tm * timeinfo;
  521.    time ( &rawtime );
  522.    timeinfo = localtime ( &rawtime );
  523.    struct timeb tp;
  524.    ftime(&tp);
  525.    char strtime[TIME_SIZE];
  526.    /* システム時間がフォーマット「yyyy/MM/dd HH:mm:ss.SSS」に変換する*/
  527.    strftime ( strtime,TIME_SIZE,"%Y/%m/%d %H:%M:%S",timeinfo);
  528.    sprintf(strtime,"%s.%03d\n",strtime,tp.millitm);

  529.    /* エラーログメッセージファイルを読み込みモードでオープンする*/
  530.    /* オープンに失敗した場合*/
  531.    if((msgfile=fopen(logmsgfiledir,"r"))==NULL)
  532.     {
  533.        /* メッセージレベルが"ERR"固定*/
  534.        strcat(msgtxtbuff , "ERR");
  535.        strcat(msgtxtbuff , " ");

  536.        /* センタ情報が環境変数よりセンタ情報を取得する*/
  537.        strcat(msgtxtbuff , getenv("CENTER"));
  538.        strcat(msgtxtbuff , " ");

  539.        /* ホスト名が標準関数よりホスト名を取得する*/
  540.        gethostname(hostname, sizeof(hostname));
  541.        strcat(msgtxtbuff , hostname);
  542.        strcat(msgtxtbuff , " ");

  543.        /* 吖堀弗绁芝庭氓菼Dが環境変数より吖堀弗绁芝庭氓菼D情報を取得する*/
  544.        strcat(msgtxtbuff , getenv("JOBSCH_JOBNET"));
  545.        strcat(msgtxtbuff , "/");

  546.        /* 吖堀弗绁諭Dが環境変数より吖堀弗绁諭D情報を取得する*/
  547.        strcat(msgtxtbuff , getenv("JC_JOBID"));
  548.        strcat(msgtxtbuff , " ");

  549.        /* 出力日時がシステム時間を取得する*/
  550.        strcat(msgtxtbuff , strtime);
  551.        strcat(msgtxtbuff , " : ");
  552.     
  553.        /* メッセージカテゴリが"IFR"固定*/
  554.        strcat(msgtxtbuff , "IFR");
  555.        strcat(msgtxtbuff , " : : ");

  556.        /* メソッド名が関数名*/
  557.        strcat(msgtxtbuff , __func__);
  558.        strcat(msgtxtbuff , " : ");

  559.        /* メッセージIDが"BALCCBA801E"固定*/
  560.        strcat(msgtxtbuff , "BALCCBA801E");
  561.        strcat(msgtxtbuff , " : ");

  562.        /* メッセージ本文を作成する*/
  563.        sprintf(msgtxt,"Message File is not found.(%s)",logmsgfiledir);
  564.        strcat(msgtxtbuff , msgtxt);
  565.        /* 作成したエラーログメッセージをパラメタとしエラーログ出力関数(内部)を呼び出*/
  566.        outputSysLog(msgtxtbuff);
  567.        /* 処理結果「異常」を返す*/
  568.        return 1;
  569.     }

  570.     /* 読み込み行数取得 */
  571.     while(!feof(msgfile))
  572.     {
  573.         /* 1行読み込む。*/
  574.         if(fgets(filelinetxt, BUFFER_SIZE, msgfile) != NULL)
  575.         {
  576.             /* 先頭文字が"#"で無い場合*/
  577.             if(strncmp(filelinetxt,"#",1) != 0)
  578.             {
  579.                 /* メッセージIDを取得する*/
  580.                 tomsgid = strtok(filelinetxt,",");
  581.                 /* メッセージIDがパラメタのメッセージIDと等しい場合*/
  582.                 if( 0 == strcmp(tomsgid , msgid) )
  583.                 {
  584.                     /* メッセージ本文バッファに取得したメッセージ本文を設定し呼び出し元に返す。*/
  585.                     strcat(msgtxtbuff,strtok(NULL,""));
  586.                     /* 処理結果「正常」を返す*/
  587.                     return 0;
  588.                 }
  589.             }
  590.         }
  591.     }

  592.     /* 最終行まで読み込み、メッセージ本文が取得できなかった場合*/
  593.     /* メッセージレベルが"ERR"固定*/
  594.     strcat(msgtxtbuff , "ERR");
  595.     strcat(msgtxtbuff , " ");

  596.     /* センタ情報が環境変数よりセンタ情報を取得する*/
  597.     strcat(msgtxtbuff , getenv("CENTER"));
  598.     strcat(msgtxtbuff , " ");

  599.     /* 吖堀弗绁芝庭氓菼Dが環境変数より吖堀弗绁芝庭氓菼D情報を取得する*/
  600.     strcat(msgtxtbuff , getenv("JOBSCH_JOBNET"));
  601.     strcat(msgtxtbuff , "/");

  602.     /* 吖堀弗绁諭Dが環境変数より吖堀弗绁諭D情報を取得する*/
  603.     strcat(msgtxtbuff , getenv("JC_JOBID"));
  604.     strcat(msgtxtbuff , " ");

  605.     /* ホスト名が標準関数よりホスト名を取得する*/
  606.     gethostname(hostname, sizeof(hostname));
  607.     strcat(msgtxtbuff , hostname);
  608.     strcat(msgtxtbuff , " ");

  609.     /* 出力日時がシステム時間を取得する*/
  610.     strcat(msgtxtbuff , strtime);
  611.     strcat(msgtxtbuff , " : ");

  612.     /* メッセージカテゴリが"IFR"固定*/
  613.     strcat(msgtxtbuff , "IFR");
  614.     strcat(msgtxtbuff , " : : ");

  615.     /* メソッド名が関数名*/
  616.     strcat(msgtxtbuff , __func__);
  617.     strcat(msgtxtbuff , " : ");

  618.     /* メッセージIDが"BALCCBA802E"固定*/
  619.     strcat(msgtxtbuff , "BALCCBA802E");
  620.     strcat(msgtxtbuff , " : ");

  621.     /* メッセージ本文を作成する*/
  622.     sprintf(msgtxt,"Message ID is not found.(%s)",(char*)msgid);
  623.     strcat(msgtxtbuff , msgtxt);

  624.     /* 作成したエラーログメッセージをパラメタとしエラーログ出力関数(内部)を呼び出*/
  625.     outputSysLog(msgtxtbuff);
  626.     /* 処理結果「異常」を返す*/
  627.     return 1;
  628. }

阅读(364) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~