ページの先頭行へ戻る
Interstage List Works V10.3.3 運用手引書
FUJITSU Software

E.2 ユーザ出口コマンドによる登録

Solaris版 List Worksでは、富士通ホスト帳票をファイル転送運用で登録する場合、ユーザ出口コマンド(listext) を利用することにより、パラメタファイルに設定した各印刷データの配信連携情報を利用して登録することができます。

ユーザ出口コマンドは以下の場合に作成します。

なお、ユーザ出口コマンドを登録すると、配信連携マスタファイルと配信連携定義ファイルで登録した情報は使用されません。ユーザ出口コマンドで指定するパラメタファイルおよび配信連携情報の情報が使用されます。

受信フォルダの振り分け定義を有効にしている場合は、ユーザ出口コマンドによる振り分けは無効となります。


ユーザ出口コマンドによる登録は、以下の手順で行います。


(1) listextコマンドのインタフェース

利用者が作成するユーザ出口コマンド(listext)の形式と、コマンドに渡される引数の内容について説明します。

形式

List Worksがユーザ出口コマンド(listext)を呼び出すときの、呼出し形式を以下に示します。

listext -tpath
        -apath
説明
-t

処理する印刷データのファイル名を、フルパスでpathに指定します。

-a

パラメタファイル名を、フルパスでpathに指定します。なお、パラメタファイルには、参照権と更新権が必要です。パラメタファイルは、帳票登録コマンド(lvrcvlst)の実行後に削除されます。

注意

  • パラメタファイル、および配信連携情報のインクルードファイルは、リスト管理サーバのインストール時に作成されます。

    これらファイルの詳細は、“インストールガイド”を参照してください。
  • オプション名と指定値の間に空白をあけないでください。


(2) パラメタファイル

パラメタファイルには、分割した印刷データのパス名と、それぞれの印刷データを登録するための配信連携情報のファイル名を設定します。リスト管理サーバは、パラメタファイルに設定した印刷データのパス名や配信連携情報を利用して印刷データの登録処理を行います。


パラメタファイルの形式

作成するパラメタファイルの形式を以下に示します。

印刷データの個数:

1個のファイルを複数の印刷データに分割した場合は、分割した印刷データの個数をバイナリで指定します。分解しない場合は1を指定します。

配信連携情報のパス名:

印刷データに付加する管理情報などを定義した配信連携情報のファイルのパス名をASCII コードで指定します。配信連携情報には、参照権が必要です。

印刷データのパス名:

印刷データの個数分必要です。1個のファイルを複数の印刷データに分割した場合は分割したファイルの数分作成します。分割しない場合は、1個分を作成します。

予備域:

NULLを指定します。

予約域:

NULLを指定します。


(3) 配信連携情報

配信連携情報には、印刷データを登録するための帳票情報や登録先を設定します。リスト管理サーバは、配信連携情報に設定した情報を利用して印刷データの登録処理を行います。


配信連携情報の形式

作成する配信連携情報の形式を以下に示します。

バージョンレベル:

List WorksのバージョンレベルをASCII コードで指定します。

例) V10.1の場合
  X'56313031'
ファイル長:

配信連携情報(ヘッダ部)長+配信連携情報数×配信連携情報(ボディ部)長

配信連携情報数:

配信連携情報の数をバイナリで指定します。1個のファイルを複数の印刷データに分割した場合は、分割した印刷データの個数を指定します。分割しない場合は1を指定します。

配信連携情報:

各情報の説明は、“E.1 配信連携定義による登録”を参照してください。

各情報のデータの型を以下に示します。なお、キャラクタの場合は左詰めで残りにはNULLを設定してください。

  管理簿ディレクトリ名        :キャラクタ(ASCII)
  削除種別                    :バイナリ
  帳票名                      :キャラクタ(ASCII)
  コメント                    :キャラクタ(ASCII)
  帳票作成者名                :キャラクタ(ASCII)
  帳票管理者名                :キャラクタ(ASCII)
  作成OS                      :バイナリ
  登録有効期間                :バイナリ
  文字間隔                    :バイナリ
  コード系                    :バイナリ
  ユーザアクセス権1           :バイナリ
  ユーザアクセス権2           :バイナリ
  ユーザ名1                   :キャラクタ(ASCII)
  グループ名1                 :キャラクタ(ASCII)
  ユーザ名2                   :キャラクタ(ASCII)
  グループ名2                 :キャラクタ(ASCII)
  用紙サイズ                  :バイナリ
  FCB名                       :キャラクタ(ASCII)
  印刷モード                  :バイナリ
  印刷禁止域                  :バイナリ
  とじしろ幅                  :バイナリ
  とじしろ方向                :バイナリ
  印刷開始原点X方向           :バイナリ
  印刷開始原点Y方向           :バイナリ
  先頭非表示ページ数          :バイナリ
  末尾非表示ページ数          :バイナリ
  オーバレイ名                :キャラクタ(ASCII)
  連続紙の横幅                :バイナリ
  抜き出し検索ファイルの作成  :バイナリ
  登録後印刷プリンタ名        :キャラクタ(ASCII)
予備域:

NULLを指定します。

予約域:

NULLを指定します。


注1:

ユーザアクセス権1は以下の形式で指定します。

    .... ...1 1... ....    List Worksが使用する情報です。必ず指定します。
    .... .... ..1. ....    グループ名1に帳票表示の権利を与える場合
    .... .... .... .1..    ほかの利用者に帳票表示の権利を与える場合
    .... .... ...1 ....    グループ名1に帳票管理の権利を与える場合
    .... .... .... ..1.    ほかの利用者に帳票管理の権利を与える場合
    XXXX XXX. .X.. X..X    リザーブ
注2:

ユーザアクセス権2は以下の形式で指定します。

    .... ...1 1.11 .11. List Worksが使用する情報です。必ず指定します。
    XXXX XXX. .X.. X..X リザーブ
注3:

ユーザ名2、グループ名2はList Worksが使用する情報です。

ユーザ名1、グループ名1と同一の値を設定してください。


(4) 使用例

ファイル名による振り分けの場合

配信連携情報を登録する場合のユーザ出口コマンドを示します。なお、印刷データはファイル名で振り分けて登録します。

/* Copyright 1997-2012 FUJITSU LIMITED */
/***************************************************************/
/* ユーザ出口ルーチンの例です. */
/* " E.1 配信連携定義による登録 "の */
/* 使用例にある配信連携定義ファイルと同様の機能を実現します. */
/***************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

/* 配信連携定義ファイルのヘッダ部の定義 */
typedef struct lvtrinf_head
{
  char              version_level[4];         /* バージョンレベル */
  long              file_length;              /* ファイル長 */
  short             num_of_body;              /* 配信連携情報数 */
  char              reserve1[2];
  char              reserve2[40];
  char              reserve3;
  char              reserve4[3];
  char              reserve5[24];
} LVTRINF_HEAD;

/* 配信連携定義ファイルのボディ部の定義 */
typedef struct lvtrinf_body
{
  char              reserve1[64];
  char              reserve2;
  char              reserve3[3];
  char              kanribo_dir[256];          /* 管理簿ディレクトリ名 */
  char              reserve4[2];
  char              del_type;                  /* 削除種別 */
  char              reserve5;
  char              title[40];                 /* 帳票名 */
  char              reserve6;
  char              reserve7[3];
  char              sub_title[40];             /* コメント */
  char              reserve8;
  char              reserve9[3];
  char              maker_name[16];            /* 帳票作成者名 */
  char              reserve10;
  char              reserve11[3];
  char              manager_name[16];          /* 帳票管理者名 */
  char              reserve12[2];
  char              os_name;                   /* 作成OS */
  char              reserve13;
  short             reg_limit;                 /* 登録有効期限 */
  char              char_par_inch;             /* 文字間隔 */
  char              code_type;                 /* コード系 */
  short             user_access1;              /* ユーザアクセス権1 */
  short             user_access2;              /* ユーザアクセス権2 */
  char              user_name[8];              /* ユーザ名1 */
  char              reserve14;
  char              reserve15[3];
  char              group_name[8];             /* グループ名1 */
  char              reserve16;
  char              reserve17[3];
  char              user_name2[8];             /* ユーザ名2 */
  char              reserve18;
  char              reserve19[3];
  char              group_name2[8];            /* グループ名2 */
  char              reserve20;
  char              reserve21[3];
  char              reserve22[32];
  char              reserve23;
  char              reserve24;
  short             shRvdpasz;                 /* 用紙サイズ */
  char              chRvdfcb[4];               /* FCB 名 */
  char              reserve25;
  char              reserve26;
  short             shRvdprmd;                 /* 印刷モード */
  short             shRvdnpra;                 /* 印刷禁止域 */
  short             shRvdbwdh;                 /* とじしろ幅 */
  short             shRvdbdic;                 /* とじしろ方向 */
  unsigned short    usRvdprsx;                 /* 印刷開始原点(X 方向) */
  unsigned short    usRvdprsy;                 /* 印刷開始原点(Y 方向) */
  short             shRvdsep1;                 /* 先頭非表示ページ数 */
  short             shRvdsep2;                 /* 末尾非表示ページ数 */
  char              reserve27[47];
  char              chRvdovl[4];               /* オーバレイ名 */
  char              reserve28[2];
  char              reserve29;
  short             LP_width;                  /* 連続紙の横幅 */
  char              Make_search_file;          /* 抜き出しファイルの作成 */
  char              reserve30[3];
  char              reserve31[67];
  char              reserve32[3];
  char              Printout[10];
  char              reserve33[58];
  char              reserve34;
  char              reserve35[3];
} LVTRINF_BODY;

/* パラメタファイルのヘッダ部の定義 */
typedef struct parm_head
{
  short             num_of_data;              /* 印刷データの個数 */
  char              reserve1[2];
  char              lvtrinf_path[256];        /* 配信連携情報のパス名 */
  char              reserve2;
  char              reserve3[3];
  char              reserve4[24];
} PARM_HEAD;

/* パラメタファイルのボディ部の定義 */
typedef struct parm_body
{
  char             data_path[256];           /* 印刷データのパス名 */
  char             reserve1;
  char             reserve2[3];
  char             reserve3[24];
} PARM_BODY;

main(argc,argv)
int argc ;
char **argv ;
{
  char            *spool_file_name;
  char            *parm_file_name;
  char            *get_addr;
  long             pattern_id;
  LVTRINF_HEAD    *lvtrinf_head_p;
  LVTRINF_BODY    *lvtrinf_body_p;
  PARM_HEAD       *parm_head_p;
  PARM_BODY       *parm_body_p;
  static char      lvtrinf_file_name[]="/var/tmp/lvtrinf";
  long             get_pattern_id();
  char            *get_area();
  void             set_lvtrinf_file();
  void             set_parm_file();
  void             make_lvtrinf_file();
  void             make_parm_file();

/* 印刷データのパス名の取り出し */
  spool_file_name=argv[1]+2;

/* パラメタファイルのパス名の取り出し */
  parm_file_name=argv[2]+2;

/* 印刷データのファイル名からどの登録パターンとなるかを判定する */
  pattern_id=get_pattern_id(spool_file_name);

/* 配信連携情報用とパラメタファイルの領域を獲得する */
  get_addr=get_area(&lvtrinf_head_p,&lvtrinf_body_p,
                    &parm_head_p,&parm_body_p);

/* 配信連携情報ファイルの領域に値を設定する */
  set_lvtrinf_file(lvtrinf_head_p,lvtrinf_body_p,pattern_id);

/* パラメタファイルの領域に値を設定する */
  set_parm_file(parm_head_p,parm_body_p,
                spool_file_name,lvtrinf_file_name);

/* 配信連携情報ファイルを作成する */
  make_lvtrinf_file(lvtrinf_file_name,lvtrinf_head_p);

/* パラメタファイルを作成する */
  make_parm_file(parm_file_name,parm_head_p);

/* 配信連携情報用とパラメタファイルの領域を解放する */
  free(get_addr);

  return(0);
}

long get_pattern_id(full_name)
  char         *full_name;
{
  long          ptn_id;
  long          full_name_len;
  char         *file_name;

  /* フルパス名の長さを求める */
  full_name_len = strlen(full_name);

  /* フルパス名の最終位置にポインタを設定する */
  file_name = full_name + full_name_len -1;

  /* ファイル名の後ろから"/"を探す */
  while(strncmp(file_name,"/",1) != 0)
 {
    file_name--;
  }
  /* 最後の"/"の次からがファイル名である */
  file_name++;

  if(strncmp(file_name,"ei",2) == 0)
 {
    /* 営業部門の印刷データである */
    if(strncmp(file_name+2,"1a",2) == 0)
        /* A 製品売上用のデータである */
        ptn_id = 0;
    else if(strncmp(file_name+2,"1b",2) == 0)
        /* B 製品売上用のデータである */
        ptn_id = 1;
    else if(strncmp(file_name+2,"2c",2) == 0)
        /* C 製品売上用のデータである */
        ptn_id = 2;
    else if(strncmp(file_name+2,"2d",2) == 0)
        /* D 製品売上用のデータである */
        ptn_id = 3;
    else
        /* その他用のデータである */
        ptn_id = 4;
  }
  else if(strncmp(file_name,"so",2) == 0)
 {
    /* 総務部門用の印刷データである */
    if(strncmp(file_name+2,"ss",2) == 0)
        /* 出張精算書用のデータである */
        ptn_id = 5;
    else if(strncmp(file_name+2,"sk",2) == 0)
        /* 給料明細書用のデータである */
        ptn_id = 6;
    else
        /* その他用のデータである */
        ptn_id = 7;
  }
  else
        /* その他用のデータである */
        ptn_id = 8;

  return(ptn_id);
  }

char *get_area(lv_head_p,lv_body_p,pr_head_p,pr_body_p)
  LVTRINF_HEAD     **lv_head_p;
  LVTRINF_BODY     **lv_body_p;
  PARM_HEAD        **pr_head_p;
  PARM_BODY        **pr_body_p;
 {
    long             getsize;
    char            *getaddr;

    /* 配信連携情報用とパラメタファイルの領域のサイズを求める */
    getsize=sizeof(LVTRINF_HEAD)+sizeof(LVTRINF_BODY)
           +sizeof(PARM_HEAD)+sizeof(PARM_BODY);

    /* 配信連携情報用とパラメタファイルの領域を獲獲する */
    getaddr=malloc(getsize);

    /* 獲得した領域をゼロクリアする */
    memset(getaddr,0x00,getsize);

    /* 配信連携情報ファイルのヘッダ部へのアドレスを設定する */
    *lv_head_p=(LVTRINF_HEAD *)getaddr;

    /* 配信連携情報ファイルのボディ部へのアドレスを設定する */
    *lv_body_p=(LVTRINF_BODY *)((char *)*lv_head_p+sizeof(LVTRINF_HEAD));

    /* パラメタファイルのヘッダ部へのアドレスを設定する */
    *pr_head_p=(PARM_HEAD *)((char *)*lv_body_p+sizeof(LVTRINF_BODY));

    /* パラメタファイルのボディ部へのアドレスを設定する */
    *pr_body_p=(PARM_BODY *)((char *)*pr_head_p+sizeof(PARM_HEAD));

return(getaddr);
}

void set_lvtrinf_file(lv_head_p,lv_body_p,ptn_id)
  LVTRINF_HEAD            *lv_head_p;
  LVTRINF_BODY            *lv_body_p;
  long ptn_id;
 {
    static char kanribo_dir[9][20]={"/home/eigyo/eigyo1",
                                     "/home/eigyo/eigyo1",
                                     "/home/eigyo/eigyo2",
                                     "/home/eigyo/eigyo2",
                                     "/home/eigyo/eigyo2",
                                     "/home/soumu/soumuka",
                                     "/home/soumu/soumuka",
                                     "/home/soumu/soumuka",
                                     "/home/other/any" };

    static char del_type[9]={0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x01};

    static char title[9][12]={"A 製品売上","B 製品売上","C 製品売上",
                           "D 製品売上","その他", "出張精算書",
                           "給料明細書","その他", "その他" };

    static char maker_name[9][12]={"帳票通夫","帳票通夫","帳票通夫",
                                    "帳票通夫","帳票通夫","帳票通子",
                                    "帳票通子","帳票通子","帳票太郎" };

    static short limit[9]={30,30,30,30,30,50,50,50,30};

    static char cpi[9]={0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x01};

    static char user_name[9][6]={"E0001","E0001","E0001",
                                  "E0001","E0001","S0001",
                                  "S0001","S0001","M0001"};

    static char group_name[9][8]={"eigyo","eigyo","eigyo",
                                   "eigyo","eigyo","soumu",
                                   "soumu","soumu","zensha"};

    static char Make_search_file[9]={0x01,0x01,0x01,0x01,
                                      0x00,0x00,0x00,0x00,0x00 };

    /* 配信連携情報ファイルのヘッダ部にバージョンレベルを設定する */
    strncpy(lv_head_p->version_level,"5010",4);

    /* 配信連携情報ファイルのヘッダ部にファイル長を設定する */
    lv_head_p->file_length=sizeof(LVTRINF_HEAD)+sizeof(LVTRINF_BODY);

    /* 配信連携情報ファイルのヘッダ部に配信連携情報数を設定する */
    lv_head_p->num_of_body=1;

    /* 配信連携情報ファイルのボディ部に管理簿ディレクトリ名を設定する*/
    strcpy(lv_body_p->kanribo_dir,kanribo_dir[ptn_id]);

    /* 配信連携情報ファイルのボディ部に削除種別を設定する */
    lv_body_p->del_type=del_type[ptn_id];

    /* 配信連携情報ファイルのボディ部に帳票名(主題)を設定する */
    strcpy(lv_body_p->title,title[ptn_id]);

    /* 配信連携情報ファイルのボディ部に帳票作成者名を設定する */
    strcpy(lv_body_p->maker_name,maker_name[ptn_id]);

    /* 配信連携情報ファイルのボディ部に帳票管理者名を設定する */
    strcpy(lv_body_p->manager_name,maker_name[ptn_id]);

    /* 配信連携情報ファイルのボディ部に登録有効期限を設定する */
    lv_body_p->reg_limit=limit[ptn_id];

    /* 配信連携情報ファイルのボディ部に文字間隔を設定する */
    lv_body_p->char_par_inch=cpi[ptn_id];

    /* 配信連携情報ファイルのユーザアクセス権1 を設定する */
    lv_body_p->user_access1=0x01a0;

    /* 配信連携情報ファイルのユーザアクセス権2 を設定する */
    lv_body_p->user_access2=0x01b6;

    /* 配信連携情報ファイルのボディ部にユーザ名1 を設定する */
    strcpy(lv_body_p->user_name,user_name[ptn_id]);

    /* 配信連携情報ファイルのボディ部にグループ名1 を設定する */
    strcpy(lv_body_p->group_name,group_name[ptn_id]);

    /* 配信連携情報ファイルのボディ部にユーザ名2 を設定する */
    strcpy(lv_body_p->user_name2,user_name[ptn_id]);

    /* 配信連携情報ファイルのボディ部にグループ名2 を設定する */
    strcpy(lv_body_p->group_name2,group_name[ptn_id]);

    /* 配信連携情報ファイルのボディ部に抜き出しファイルの作成情報を設定する */
    lv_body_p->Make_search_file=Make_search_file[ptn_id];

    return;
  }

void set_parm_file(pr_head_p,pr_body_p,spl_file_name,lv_file_name)
  PARM_HEAD         *pr_head_p;
  PARM_BODY         *pr_body_p;
  char              *spl_file_name;
  char              *lv_file_name;
 {
    /* パラメタファイルのヘッダ部に印刷データの個数を設定する */
    pr_head_p->num_of_data=1;

    /* パラメタファイルのヘッダ部に配信連携定義情報のパス名を設定する */
    strcpy(pr_head_p->lvtrinf_path,lv_file_name);

    /* パラメタファイルのボディ部に印刷データのパス名を設定する */
    strcpy(pr_body_p->data_path,spl_file_name);
    return;
  }

void make_lvtrinf_file(file_name,lv_head_p)
  char *file_name;
  LVTRINF_HEAD *lv_head_p;
 {
    long fid;

    /* 配信連携情報ファイルが存在するかどうかをチェックする */
    if(access(file_name,F_OK)==0)
    /* ファイルが存在しているため置換モードでオープンする */
        fid=open(file_name,O_RDWR|O_TRUNC);
    else
    /* ファイルが存在していないので新規作成モードでオープンする */
    fid=open(file_name,O_RDWR|O_CREAT);
    /* 配信連携情報ファイルにアクセス権を設定する */
    fchmod(fid,(mode_t)0007777);
    /* 配信連携情報ファイルに情報を書き込む */
    write(fid,lv_head_p,sizeof(LVTRINF_HEAD)+sizeof(LVTRINF_BODY));
    /* 配信連携情報ファイルをクローズする */
    close(fid);
    return;
  }

void make_parm_file(file_name,pr_head_p)
  char             *file_name;
  PARM_HEAD        *pr_head_p;
 {
    long fid;

    /* パラメタファイルをオープンする */
    fid=open(file_name,O_RDWR|O_CREAT);

    /* パラメタファイルにアクセス権を設定する */
    fchmod(fid,(mode_t)0007777);

    /* パラメタファイルに情報を書き込む */
    write(fid,pr_head_p,sizeof(PARM_HEAD)+sizeof(PARM_BODY));

    /* パラメタファイルをクローズする */
    close(fid);
    return;
  }