高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technote 1111

Programmatic Mounting of AppleShare Volumes


目次

はじめに

AppleShare Clients 3.0 − 3.6.5

AppleShare Client 3.7

要約


の TECHNOTE では、PBVolumeMount 呼び出しを使って AppleShare ボリュームをマウントする方法について説明します。


はじめに
AppleShare Client では PBVolumeMount トラップをインプリメントし、デベロッパがプログラムによりボリュームをマウントすることを可能にします。PBVolumeMount 呼び出しを使ってボリュームをマウントする方法が 2 つ用意されています。AppleShare Client 3.7 では、PBVolumeMount 呼び出しに新しい機能が追加され、AppleTalk だけでなく TCP/IP 経由でサーバをマウントできるようになりました。

第 1 の方法は、ユーザによってマウントされているボリュームを再マウントしようとするときに最適です。再マウントしたいボリュームを識別し、GetVolMountInfoSize を呼び出して割り当てる必要のある Vol Mount Block のサイズを取得します。Vol Mount Block に対応するメモリを割り当て、GetVolMountInfo を呼び出して情報が書き込まれたブロックを取得します。ボリュームを再マウントするときは、それ以前に作成されている Vol Mount Block を使って PBVolumeMount を呼び出します。GetVolMountInfo はパスワード情報を返さないため、パスワードは別に格納しておく必要があります。Alias Manager では、この方法を使ってエイリアスからサーバボリュームをマウントします。

第 2 の方法では、独自の Vol Mount Block を作成し、フィールドに適切な情報を書き込んだ後、PBVolumeMount を呼び出すことが必要になります。この方法はより柔軟性が高いといえますが、それだけ処理は複雑になります。詳細については、MoreFiles Sample Code に含まれるコードを参考にすることをおすすめします (Referencesセクションを参照してください)。

コード例 #1: AppleShare Client のバージョンの検出


const   short   kASver_3_5      = 1;
const   short   kASver_3_6      = 2;
const   short   kASver_3_6_1    = 3;
const   short   kASver_3_6_2    = 4;
const   short   kASver_3_6_3    = 5;    // 3.6.3、3.6.4、3.6.5 を含む
const   short   kASver_3_7      = 6;    // 3.7.1 を含む
const   short   kASver_3_7_2    = 7;

short   ClientVersion(void)
{
    long    result;
    OSError theError = noErr;

    theError = Gestalt('afps',&result);
    if(!theError)
    {
        return(result & 0x0000ffff);
    }
    return 0;
}



AppleShare Clients 3.0 − 3.6.5
バージョン 3.7 よりも前の AppleShare Client は AppleTalk 経由でのみボリュームをマウントします。MoreFiles Sample Code には、PBVolumeMount() 呼び出しを使って、サーバ名とパスワードが指定されたボリュームをマウントする使用例が用意されています。互換性を最大限に維持するため、AFPVolMountInfo 構造体の UAMType には 1 (ゲストログインの場合) または 3 (パスワードを使ったログインの場合) を設定してください。



struct AFPVolMountInfo {
    short       length;               /* ロケーションデータの長さ (このフィールドそのものを含む) */
    VolumeType  media;                /* メディアのタイプ */
    short       flags;                /* メッセージ、再接続がないかどうかを指定するビット */
    SInt8       nbpInterval;          /* NBP Interval パラメータ (IM2, p.322 を参照) */
    SInt8       nbpCount;             /* NBP Interval パラメータ (IM2, p.322 を参照) */
    short       uamType;              /* ユーザ認証方法 */
    short       zoneNameOffset;       /* 構造体の先頭から Zone Name までの short で正のオフセット */
    short       serverNameOffset;     /* Pascal 文字列 Server Name までのオフセット */
    short       volNameOffset;        /* Pascal 文字列 Volume Name までのオフセット */
    short       userNameOffset;       /* Pascal 文字列 User Name までのオフセット */
    short       userPasswordOffset;   /* Pascal 文字列 User Password までのオフセット */
    short       volPasswordOffset;    /* Pascal 文字列 Volume Password までのオフセット */
    char        AFPData[176];         /* 可変長データが続く場合 */
};
typedef struct AFPVolMountInfo AFPVolMountInfo;



AppleShare Client 3.7
AppleShare Client 3.7 には、ボリュームのマウントを処理する上でいくつかの新機能が追加されています。

AFPXVolMountInfo を使った PBVolumeMount
次の定義を見れば、AFPXVolMountInfo 構造体が前述の AFPVolMountInfo 構造体の拡張であることがすぐにわかります。3 つの新しいフィールドと 2 つの新しいフラグビットを使用すると、デベロッパは TCP/IP や UAM をサポートするために必要な情報を指定できるようになります。もちろん 3.7 Client では、以前の AFPVolMountInfo 構造体もサポートされています。

次に、最新の Files.h に含まれる定義を示します。



/* AFPXVolMountInfo は新しい AFP ボリュームマウント情報レコードで、3.7 AppleShare Client を必要とする */

struct AFPXVolMountInfo {
    short         length;                 /* ロケーションデータの長さ (このフィールドそのものを含む) */
    VolumeType    media;                  /* メディアのタイプ */
    short         flags;                  /* メッセージ、再接続がないかどうかを指定するビット */
    SInt8         nbpInterval;            /* NBP Interval パラメータ (IM2, p.322 を参照) */
    SInt8         nbpCount;               /* NBP Interval パラメータ (IM2, p.322 を参照) */
    short         uamType;                /* ユーザ認証方法のタイプ */
    short         zoneNameOffset;         /* 構造体の先頭から Zone Name までの short で正のオフセット */
    short         serverNameOffset;       /* Pascal 文字列 Server Name までのオフセット */
    short         volNameOffset;          /* Pascal 文字列 Volume Name までのオフセット */
    short         userNameOffset;         /* Pascal 文字列 User Name までのオフセット */
    short         userPasswordOffset;     /* Pascal 文字列 User Password までのオフセット */
    short         volPasswordOffset;      /* Pascal 文字列 Volume Password までのオフセット */
    short         extendedFlags;          /* 拡張されたフラグワード */
    short         uamNameOffset;          /* Pascal 文字列 UAM Name までのオフセット */
    short         alternateAddressOffset; /* タグフォーマットの Alternate Addresses までのオフセット */
    char          AFPData[176];           /* 可変長データが続く場合 */
};
typedef struct AFPXVolMountInfo AFPXVolMountInfo;

typedef AFPXVolMountInfo *              AFPXVolMountInfoPtr;

/* ボリュームマウントフラグ */

enum {
    volMountNoLoginMsgFlagBit   = 0,         /* VolumeMount への入力: セットされている場合、ファイルシステムは */
    volMountNoLoginMsgFlagMask  = 0x0001,    /* ログインメッセージダイアログを表示しない */
    volMountExtendedFlagsBit    = 7,         /* VolumeMount への入力: セットされている場合、マウント情報は */
    volMountExtendedFlagsMask   = 0x0080,    /* 3.7 AppleShare Client に対応する AFPXVolMountInfo レコード */
    volMountInteractBit         = 15,        /* VolumeMount への入力: セットされている場合、ファイルシステムが */
    volMountInteractMask        = 0x8000,    /* ボリュームをマウントするためにユーザの操作を実行することが許可される */
    volMountChangedBit          = 14,        /* VoumeMount からの出力: セットされている場合、ボリュームはマウントされていたが、 */
    volMountChangedMask         = 0x4000,    /* ボリュームのマウント情報レコードは更新される必要がある */
    volMountFSReservedMask      = 0x00FF,    /* ビット 0-7 はそれぞれのファイルシステムが独自に使用するために定義されている */
    volMountSysReservedMask     = 0xFF00     /* ビット 8-15は Apple システムが使用するために予約されている */
};

enum {
    kAFPExtendedFlagsAlternateAddressMask = 1  /* AFPXVolMountInfo.extendedFlags のビットで、alternateAddressOffset が使用されていることを意味する */
};


 AFPXVolMountInfo

PBVolumeMount トラップの新機能を使用するためには、AFPXVolMountInfo 構造体のフラグワードで extendedFlagsBit をセットし、さらに新しい VMIB 定義を使用する必要があります。それぞれのオフセットフィールドは、構造体の先頭から問題のデータまでの 16 ビットオフセットを指定します。文字列フィールドを空のままにしておくには、オフセットが空白文字列を "ポイント" している必要があります。単純に offset = 0 のままにしておくことはできません。

AppleShare Client にログインダイアログを表示させるには、フラグワードの volMountInteractBit をセットします。セットされたビットを使って PBVolumeMount 呼び出しを実行する前に、A5 ワールドを保持していて、QuickDraw と Dialog Manager を初期化していることを確認してください。また、Apple 標準ではない UAM を使用する場合も、このビットをセットしておく必要があります。AppleShare Client 3.7.2 およびそれ以上の場合、AFPXVolMountInfo 構造体のボリューム名をブランクのままにしておくと、AppleShare Client はボリューム選択ウィンドウを表示し、ユーザはどのボリュームをマウントするか選択できるようになります。

uamNameOffset オフセットは、この接続で使用する UAM (User Authentication Module) を示す Pascal 文字列までのオフセットを指定します。また、uamType フィールドをセットする必要があります。UAM Name 文字列については後述します。

Alternate Address オフセットは、IP アドレスを含むタグデータのブロックまでのオフセットを指定します。このブロックはバージョンバイトとカウントバイトから始まり、その後には最大 255 のタグアドレスが続きます。フォーマットについては後述します。現在のバージョンバイトは 0x00 です。


IP アドレスへの接続
TCP/IP を介してサーバに接続するには、IP アドレスをアドレスタグにコピーし、そのアドレスタグを Alternate Address フィールドに置く必要があります。現在使用中の場合でもサーバ名が必要です。ゾーン名も指定すると、Client は TCP/IP 経由で接続できない場合に AppleTalk に戻ります。AppleTalk に戻る場合、Client はフラグワードの volMountChangedBit をセットすることになります。たとえば、アドレス 128.0.10.1 に対応する Alternate Address フィールドは次のようになります。

0x00 0x01 0x08 0x02 0x80 0x00 0x0A 0x01 0x02 0x24


Client はこのアドレスを使って、アドレス 128.0.10.1 によって示されるマシン上の TCP/IP ポート 548 経由でデフォルトの AFP に接続することになります。


アドレスに対応するタグデータ
新しいタグデータはアドレスフォーマットの変更に対応しています。これにより、クライアントはインタフェースに変更を加えることなく、IPv6 (IPNG) などの新しいアドレス指定の標準をサポートできるようになります。Alternate Address 領域の先頭バイトはバージョンバイトで、現在は 0 にセットされています。この後には、AFPAlternateAddress 構造体 (定義は以下に示します) が続きます。なぜバージョンバイトが AFPAlternateAddress 構造体に含まれていないのかといえば、AFPAlternateAddress 構造体が AFP 2.2 の ServerInfo リプライメッセージの中でも使用されるためです。

それぞれのデータ項目は、長さバイト、tagID バイト、および最大 254 バイトのデータから構成されます。つまり、| 長さ | タグ | 最大 254 バイトのデータ | ということです。

3.7 Client は次のようなタグを認識します。
長さ tagID 説明
0x06 0x01 基本的な IP アドレス。4 バイトでポート番号を含まない。
0x08 0x02 ポートを含む IP アドレス。4 バイトのアドレス、2 バイトのポート。


長さバイトは、長さバイトを含めたタグ全体の長さを指定します。すべてのフィールドはネットワークバイト順 (MSB が先頭) に並んでいます。

次に、最新の Files.h に含まれる定義を示します (これは、Universal Interfaces & Libraries v3.0.1 の一部です)。



enum {    /* AFPTagData.fType フィールドで使用する定数 */
    kAFPTagTypeIP        = 0x01,
    kAFPTagTypeIPPort    = 0x02,
    kAFPTagTypeDDP       = 0x03    /* 現在は未使用 */
};



enum {    /* AFPTagData.fLength フィールドで使用する定数 */
    kAFPTagLengthIP        = 0x06,
    kAFPTagLengthIPPort    = 0x08,
    kAFPTagLengthDDP       = 0x06
};

struct AFPTagData {
    UInt8    fLength;     /* fLength フィールドを含めたこのデータタグの長さ */
    UInt8    fType;
    UInt8    fData[1];    /* 可変長データ */
};
typedef struct AFPTagData AFPTagData;

struct AFPAlternateAddress {
    UInt8    fAddressCount;
    UInt8    fAddressList[1];    /* AFPTagData の実際に可変長パックされたセット */
};
typedef struct AFPAlternateAddress AFPAlternateAddress;



カスタム UAM を使ったボリュームのマウント
UAM は 1 つのセレクタをとる、シングルエントリポイントを含んだコードリソースです。UAM は 'uams' というタイプのファイルの中に含まれていて、AppleShare Client を拡張するために使用します。UAM を使用することで、AppleShare Client は標準とは異なる認証方式を使ったサードパーティのサーバに接続できるようになります。通常、UAM はパスワードおよびボリューム選択ダイアログを表示します。このため、VolMountInfo ブロックのフラグワードの中で volMountInteractBit がセットされていなければなりません。UAM はシステムフォルダのルートレベルにある“AppleShare フォルダ”に格納されます。

認証のためにサードパーティ UAM を使用するには、新しい VMIB 定義を使用し (フラグワードの extendedFlagsBit をセットして)、'uamg' id 0 リソース (UAM ファイルの) から uamType フィールドに UAM タイプを配置し、UAM Name を VMIB の uamNameOffset の位置に配置します。この後で PBVolumeMount() を呼び出してください。

PBVolumeMount 呼び出しを実行する前に、A5 ワールドを保持していて、InitGraf および InitDialogs を呼び出していることを確認してください。なお、サードパーティ UAM は、現在のところ (AppleShare Client 3.7.2 およびそれ以上では) AppleTalk のみを介した接続に制限されています。


UAMName
これは、UAM に対する AFP プロトコル名で、UAM ファイルに 'uamn' id 1 リソースとして格納されています。これは Pascal 文字列です。

注意
すべての構造体は 68k アラインでなければなりません。


要約
新しい PBVolumeMount インタフェースは、AppleShare ファイルサーバをマウントするためのさまざまなオプションをデベロッパに提供します。PBVolumeMount はログインおよびボリューム選択ダイアログを表示できます。また、セレクタを使って呼び出される AppleShare Client とまったく同じ方法でカスタム UAM を使用することもできます。さらに、AppleTalk または TCP/IP を使ってサーバに接続することもできます。


参考文献

更新日: 1997 年 10 月 31 日