名前
fmtmsg - 整形されたエラーメッセージを表示する
書式
#include <fmtmsg.h>
int fmtmsg(long classification, const char *label,
int severity, const char *text,
const char *action, const char *tag);
説明
この関数は、引き数で記述されたメッセージを、 classification 引き数で指定されたデバイス上に表示する。 stderr に書き出されるメッセージのフォーマットは、 MSGVERB 環境変数に依存する。
label 引き数はメッセージの発生源を識別する。 この文字列はコロンで区切られた 2 つの部分から構成されていなければならない。 1 つ目の部分は 10 文字以内でなければならず、 2 つ目の部分は 14 文字以内でなければならない。
text 引き数にはエラー条件を記述する。
action 引き数にはエラーから回復するために利用可能なステップを記述する。 これが表示される場合、"TO FIX: " が前に付く。
tag 引き数はより多くの情報を見つけるためのオンラインドキュメントへの参照である。 これは label 値とユニークな識別番号を含んでいるべきである。
ダミー引き数
各引き数にはダミーの値を入れることができる。 ダミーの classification 値 MM_NULLMC (0L) は出力を何も指定しない。そのため何も表示されない。 ダミーの severity 値 NO_SEV (0) は重大度 (severity) が与えられていないことを表す。 値 MM_NULLLBL, MM_NULLTXT, MM_NULLACT, MM_NULLTAG は ((char *) 0) と空文字列の別名であり、 MM_NULLSEV は NO_SEV の別名である。
classification 引き数
classification 引き数は 4 種類の情報を記述する値の和である。
最初の値は出力チャンネルを定義する。
MM_PRINT | stderr に出力する。 |
MM_CONSOLE | システムコンソールに出力する。 |
MM_PRINT | MM_CONSOLE | |
両方に出力する。 | |
2 番目の値はエラーの発生源である: | |
MM_HARD | ハードウェアエラーが起こった。 |
MM_FIRM | ファームウェアエラーが起こった。 |
MM_SOFT | ソフトウェアエラーが起こった。 |
3 番目の値は問題の検知を行ったものをエンコードする: | |
MM_APPL | アプリケーションによって検知された。 |
MM_UTIL | ユーティリティによって検知された。 |
MM_OPSYS | オペレーティングシステムによって検知された。 |
4 番目の値は問題の重大度を表す: | |
MM_RECOVER | 回復可能なエラーである。 |
MM_NRECOV | 回復不可能なエラーである。 |
severity 引き数
severity 引き数は以下の 1 つの値をとることができる。
MM_NOSEV | 重大度は表示されない。 |
MM_HALT | この値は HALT として表示される。 |
MM_ERROR | この値は ERROR として表示される。 |
MM_WARNING | この値は WARNING として表示される。 |
MM_INFO | この値は INFO として表示される。 |
返り値
関数は 4 つの値を返す:
MM_OK | 全てがうまくいった。 |
MM_NOTOK | 完全に失敗した。 |
MM_NOMSG | stderr に書き込むときにエラーが起こった。 |
MM_NOCON | コンソールに書き込むときにエラーが起こった。 |
環境変数
環境変数 MSGVERB ("message verbosity") は stderr への出力の一部を抑制するのに使うことができる。 (コンソールへの出力には影響しない。) この変数が定義されて、NULL でなく、 コロンで区切られた有効なキーワードのリストである場合、 キーワードに対応するメッセージの一部のみが表示される。 有効なキーワードは "label", "severity", "text", "action", "tag" である。
環境変数 SEV_LEVEL は新しい重大度レベルを導入するのに使用できる。 デフォルトでは、上記の 5 つの重大度レベルのみが利用可能である。 他の数値の場合、 fmtmsg() は何も表示しない。 fmtmsg() を初めて呼び出す前に、ユーザが SEV_LEVEL を
SEV_LEVEL=[description[:description[:...]]]
のような形式でプロセスの環境に設定すると、 fmtmsg() は (標準のレベル 0-4 に加えて) level に指定された値も受け付け、 そのようなレベルの問題が発生すると指定された printstring を表示する。 各 description は
severity-keyword,level,printstring
という形式である。
severity-keyword 部は fmtmsg() に使用されないが、存在しなければならない。 level 部は数値を文字列で表したものである。 数値は 4 より大きい値でなければならない。 この値は fmtmsg() の severity 引き数で使用されなければならず、この重大度を選択する。 前もって宣言された重大度を上書きすることはできない。 printstring は、 この重大度のメッセージが fmtmsg() によって生成された場合に表示される文字列である。
準拠
関数 fmtmsg() と addseverity(3) と環境変数 MSGVERB と SEV_LEVEL は System V に由来している。 関数 fmtmsg() と環境変数 MSGVERB は POSIX.1-2001 に記述されている。
注意
System V と Unixware の man ページには、 「これらの関数は "pfmt() と addsev()" または "pfmt(), vpfmt(), lfmt(), vlfmt()" で置き換えられており、 将来は削除される予定である」と書かれている。
例
#include <stdio.h>
#include <fmtmsg.h>
int
main(void)
{
long class = MM_PRINT | MM_SOFT | MM_OPSYS | MM_RECOVER;
int err;
err = fmtmsg(class, "util-linux:mount", MM_ERROR,
"unknown mount option", "See mount(8).",
"util-linux:mount:017");
switch(err) {
case MM_OK:
break;
case MM_NOTOK:
printf("Nothing printed\n");
break;
case MM_NOMSG:
printf("Nothing printed to stderr\n");
break;
case MM_NOCON:
printf("No console output\n");
break;
default:
printf("Unknown error from fmtmsg()\n");
}
exit(EXIT_SUCCESS);
}
出力は util-linux:mount: ERROR: unknown mount option TO FIX: See mount(8). util-linux:mount:017 のようになり、 MSGVERB=text:action; export MSGVERB を実行した後では unknown mount option TO FIX: See mount(8). となる。