[PHP-users 3857] [Patch] pgsql function

Yasuo Ohgaki php-users@php.gr.jp
Mon, 26 Nov 2001 14:54:09 +0900


This is a multi-part message in MIME format.
--------------090900000906090908020308
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

大垣です。

PHP+PostgreSQLの利用者は日本の方が多いので、こちらにもメールします。

PostgreSQLモジュールの非同期クエリー関数が必要だったのでパッチを作
りました。(PHP 4.2.0-dev用。4.1.0RCでは一部手動でパッチする必要あ
り。前に送ったパッチはlibpqの使い方を知らないと使えない+ゴミ処理を
していませんでしたが、今回のパッチはこれらの処理をしています)

このパッチで追加される関数は以下の通りです。

pg_send_query() - 非同期クエリーの送信
pg_get_result() - 非同期クエリー結果の取得
pg_is_busy() - 非同期クエリーを実行中か確認
pg_request_cancel - 実行中の非同期クエリーのキャンセル

pg_reset() - 現在の接続パラメータでDBに再接続 (エラーリカバリ用)
pg_status() - 接続状態の取得

使い方はテストスクリプトを参照してください。(output bufferをオフに
すると
非同期でクエリが実行されている事が確認できます)

備考:pg_send_query()を使って複数のクエリーを別々に送信する事はで
きません。だたし、複数のクエリーを一緒に送信して、pg_get_result()
で別々に結果を取得する事はできます。pg_get_result()を呼ぶ前に、
pg_is_busy()を使って取得可能な結果があるか確認しないと、
pg_get_result()はプロセスをブロックします。libpqにSSLを組み込んで
いると非同期に実行出来ない場合があります。Windowsではlibpqのコンパ
イル時にフラグを立ててコンパイルされていないと、プロセスはブロック
されます。

他に追加した方が良いlibpqがサポートする非同期関数、不具合があった
場合、変更した方が良い部分がある場合はメールをお願いします。

--
Yasuo Ohgaki


--------------090900000906090908020308
Content-Type: text/plain;
 name="pgsql_test.php"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="pgsql_test.php"

PD9waHAKLyoqCiAqIFBvc3RncmVTUUwgYXN5bmMgcXVlcnkgZnVuY3Rpb24gdGVzdCBzY3Jp
cHQuCiAqCiAqIFRoZXJlIGFyZSBudW1iZXIgb2YgcmVzdHJpY3Rpb25zIHRvIG1ha2UgYXN5
bmMgcXVlcnkgd29yay4KICogUmVmZXIgdG8gbGlicHEgbWFudWFsIGZvciBkZXRhaWxzLgog
KgogKiBwZ19zZW5kX3F1ZXJ5IGRvZXMgbm90IE11bHRpcGxlIHF1ZXJ5LCBob3dldmVyIHVz
ZXIKICogbWF5IHJldHJpdmUgcmVzdWx0IHNlcGFyYXRlbHkuCiAqCiAqIFRoaXMgc2NyaXB0
IGlzIGZvciBwaHAgYmluYXJ5LiBEaXNhYmxlIG91dHB1dCBidWZmZXJpbmcKICogdG8gc2Vl
IHRoZSBkaWZmZXJlbmNlLgogKgogKiB5YXN1b19vaGdha2lAeWFob28uY29tCiAqLwoKLyoq
KioqIENPTkZJRyAqKioqKiovCiR0YWJsZSA9ICdwZ3NxbF9hc3luY19mdW5jX3Rlc3QnOyAg
Ly8gVGVzdCB0YWJsZSBuYW1lIHRvIGNyZWF0ZQokbnVtcmVjID0gNTAwMDA7ICAgICAgICAg
ICAgICAgICAgIC8vIE51bWJlciBvZiByZWNvcmRzIHRvIGNyZWF0ZQokY29ubnN0ciA9ICdo
b3N0PWRldiBkYm5hbWU9eW9oZ2FraSB1c2VyPXlvaGdha2knOyAvLyBEYXRhYmFzZSB0byBj
b25uZWN0CgoKLyoqKioqKioqIHRlc3QgZnVuY2l0b25zICoqKioqKioqLwpmdW5jdGlvbiBj
cmVhdGVfdGVzdF90YWJsZSgkZGIpIAp7CglnbG9iYWwgJHRhYmxlOwkKCSRzcWw9IgpTRUxF
Q1QKCWEuYXR0bmFtZSwKCWEuYXR0bnVtLAoJdC50eXBuYW1lLAoJYS5hdHRsZW4sCglhLmF0
dHR5cG1vZCwKCWEuYXR0bm90TlVMTCwKCWEuYXR0aGFzZGVmCkZST00KCXBnX2NsYXNzIGFz
IGMsCglwZ19hdHRyaWJ1dGUgYSwKCXBnX3R5cGUgdApXSEVSRQoJYS5hdHRudW0gPiAwIEFO
RAoJYS5hdHRyZWxpZCA9IGMub2lkIEFORAoJYy5yZWxuYW1lID0gJyR0YWJsZScgQU5ECglh
LmF0dHR5cGlkID0gdC5vaWQKT1JERVIgQlkKCWEuYXR0bnVtOwoKIjsKCSRyZXMgPSBwZ19l
eGVjKCRkYiwkc3FsKTsKCWlmICghcGdfbnVtcm93cygkcmVzKSkgewoJCWVjaG8gIkNyZWF0
aW5nIHRlc3QgdGFibGUuLlxuIjsKCQkkc3FsID0gIkNSRUFURSBUQUJMRSAkdGFibGUgKHN0
ciB0ZXh0KTsiOwoJCWlmIChwZ19leGVjKCRkYiwkc3FsKSAhPT0gRkFMU0UpCgkJewoJCQkk
dmFsID0gJ0FzeW5jIHF1ZXJ5IGNhbiBpbXByb3ZlIGFwcGxpY2F0aW9uIHBlcmZvcm1hbmNl
IHNpZ25pZmljYW50bHkuIFBsZWFzZSB0ZXN0IGFuZCByZXBvcnQgYW55IGZhaWx1cmUgdG8g
eWFzdW9fb2hnYWtpQHlhaG9vLmNvbS4gVGhlcmUgYXJlIGNhc2VzIHRoYXQgYXN5bmMgcXVl
cnkgZG9lcyBub3Qgd29yayBhcyBleHBlY3RlZC4gUmVmZXIgdG8gbGlicHEgbWFudWFsIGZv
ciBkZXRhaWxzLiBJIGFsc28gaW1wbGVtZW50ZWQgZnVuY3Rpb25zIHRoYXQgSSBuZWVkIHBn
X3N0YXR1cygpIC0gcmV0dXJucyBjb25uZWN0aW9uIHN0YXV0cyBhbmQgcGdfcmVzZXQoKSAt
IHJlc2V0IGNvbm5lY3Rpb24uIChVc2VmdWwgd2hlbiBjb25uZWN0aW9uIGlzIGJyb2tlbiBm
b3Igc29tZSByZWFzb24gLSBtb3N0IGxpa2VseSBiYWNrZW5kIGlzIGRpZWQpJzsKCQkJZm9y
ICgkaT0wOyAkaSA8IDUwMDAwOyAkaSsrKSB7CgkJCQlwZ19leGVjKCRkYiwiSU5TRVJUIElO
VE8gJHRhYmxlIChzdHIpIFZBTFVFUyAoJyR2YWwnKTsiKTsKCQkJCWlmICghKCRpICUgMTAw
KSkgewoJCQkJCWVjaG8gJy4nOwoJCQkJfQoJCQl9CgkJCWVjaG8gIlxuIjsKCQkJJHZhbCA9
ICcgICAgIFhZWiAgICAgICAgICc7IC8vIFRvIG1ha2Ugc2VsZWN0IGFjdHVhbGx5IHJldHVy
biBhIHJvdy4gJ1hZWicgaXMgc2VhcmNoIHBhdHRlcm4uCgkJCXBnX2V4ZWMoJGRiLCJJTlNF
UlQgSU5UTyAkdGFibGUgKHN0cikgVkFMVUVTICgnJHZhbCcpOyIpOwoJCX0KCQllbHNlIHsK
CQkJZGllKCJFUlI6IEZhaWxlZCBjcmVhdGluZyB0ZXN0IHRhYmxlLiIucGdfZXJyb3JtZXNz
YWdlKCkuIlxuXG5cblxuXG5cbiIpOwoJCX0KCX0KCWVsc2UgewoJCWVjaG8gIlRlc3QgdGFi
bGUgZXhpc3RzXG4iOwoJfQp9CgpmdW5jdGlvbiBjaGVja19zdGF0dXMoJGRiKSAKewoJJHN0
YXR1cyA9IHBnX3N0YXR1cygkZGIpOwoKCXN3aXRjaCAoJHN0YXR1cykgewoJCWNhc2UgUEdT
UUxfQ09OTkVDVElPTl9PSzoKCQkJZWNobyAiU3RhdHVzOiBDb25uZWN0aW9uIGlzIHJlYWR5
XG4iOwoJCQlicmVhazsKCQljYXNlIFBHU1FMX0NPTk5FQ1RJT05fQkFEOgoJCQllY2hvICJT
dGF0dXM6IENvbm5lY3RpbiBpcyBCQURcbiI7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWVj
aG8gIlN0YXR1czogVW5rb253biAoJHN0YXR1cylcbiI7CgkJCWJyZWFrOwoJfQoJcmV0dXJu
ICRzdGF0dXM7Cn0KCmZ1bmN0aW9uIGV4ZWN1dGVfcXVlcnkoJGRiLCRhc3luYyA9IFRSVUUp
IAp7CglnbG9iYWwgJHRhYmxlOwoJZWNobyAiRXhlY3V0aW5nIHF1ZXJ5Li4iOwoJJHJldCA9
IG51bGw7Cgkkc3FsID0gIgpTRUxFQ1QgKiBGUk9NICR0YWJsZSBXSEVSRSBzdHIgbGlrZSAn
JVhZWiUnOwoiOwoJaWYgKCRhc3luYykgewoJCXJldHVybiBwZ19zZW5kX3F1ZXJ5KCRkYiwk
c3FsKTsKCX0KCWlmICghKCRyZXQgPSBwZ19leGVjKCRkYiwkc3FsKSkpIHsKCQllY2hvICJR
dWVyeSBmYWlsZWQuLlxuIjsKCX0KCXJldHVybiAkcmV0Owp9CgpmdW5jdGlvbiBjaGVja19y
ZXN1bHQoJHJlc3VsdCkgCnsKCWlmICghJHJlc3VsdCl7CgkJZWNobyAiQ2hlY2sgcmVzdWx0
OiBOR1xuIjsKCQlyZXR1cm4gZmFsc2U7Cgl9CgllY2hvICJDaGVjayByZXN1bHQ6IE9rXG4i
OwoJcmV0dXJuIHRydWU7Cn0KCgpmdW5jdGlvbiBkdW1wX3Jlc3VsdCgkcmVzdWx0KSAKewoJ
aWYgKGNoZWNrX3Jlc3VsdCgkcmVzdWx0KSkgewoJCSRjbnQgPSBwZ19udW1yb3dzKCRyZXN1
bHQpOwoJCWZvcigkaT0wOyAkaSA8ICRjbnQ7ICRpKyspIHsKCQkJJHJlYyA9IHBnX2ZldGNo
X2FycmF5KCRyZXN1bHQsJGksUEdTUUxfQVNTT0MpOwoJCQlwcmludF9yKCRyZWMpOwoJCX0K
CX0KfQoKLyoqKioqKioqICBNQUlOICoqKioqKioqKiovCiRkYiA9IHBnX2Nvbm5lY3QoJGNv
bm5zdHIpOwpjcmVhdGVfdGVzdF90YWJsZSgkZGIpOwoKLy8vLy8vLy8vLy8vLy8gbm9uYmxv
Y2tlZCBxdWVyeSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KZWNobyAiXG4gKioqIG5vbi1ibG9j
a2luZyBxZXVyeSAqKiogXG5cbiI7CgpjaGVja19zdGF0dXMoJGRiKTsKZXhlY3V0ZV9xdWVy
eSgkZGIpOwp3aGlsZSAocGdfaXNfYnVzeSgkZGIpKSAKewoJZWNobyAiLiI7CglzbGVlcCgx
KTsKfQplY2hvICJcbiI7CgokcmVzdWx0ID0gcGdfZ2V0X3Jlc3VsdCgkZGIpOwpkdW1wX3Jl
c3VsdCgkcmVzdWx0KTsKCi8vIFJFU0VUIGNvbm5lY3Rpb24KCmlmICghcGdfcmVzZXQoJGRi
KSkgCnsKCWRpZSgiRmFpbGVkIHRvIHJlc2V0IGNvbm5lY3Rpb24iKTsKfQoKLy8vLy8vLy8v
Ly8vLy8vIGJsb2NrZWQgcXVlcnkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwplY2hvICJc
biAqKiogYmxvY2tpbmcgcWV1cnkgKioqIFxuXG4iOwoKY2hlY2tfc3RhdHVzKCRkYik7CiRy
ZXN1bHQgPSBleGVjdXRlX3F1ZXJ5KCRkYiwgZmFsc2UpOwplY2hvICJcbiI7CgpkdW1wX3Jl
c3VsdCgkcmVzdWx0KTsKCj8+CgoKCgoKCgoKCgoKCg==
--------------090900000906090908020308
Content-Type: text/plain;
 name="pgsql_async.diff"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="pgsql_async.diff"

SW5kZXg6IHBnc3FsLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3JlcG9zaXRvcnkvcGhw
NC9leHQvcGdzcWwvcGdzcWwuYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4xMzAKZGlmZiAt
dSAtcjEuMTMwIHBnc3FsLmMKLS0tIHBnc3FsLmMJMTEgT2N0IDIwMDEgMjM6MzM6NDAgLTAw
MDAJMS4xMzAKKysrIHBnc3FsLmMJMjUgTm92IDIwMDEgMDk6MzU6MjIgLTAwMDAKQEAgLTk0
LDYgKzk0LDEyIEBACiAJUEhQX0ZBTElBUyhwZ19jbGllbnRlbmNvZGluZywJCXBnX2NsaWVu
dF9lbmNvZGluZywJCQlOVUxMKQogCVBIUF9GQUxJQVMocGdfc2V0Y2xpZW50ZW5jb2Rpbmcs
CXBnX3NldF9jbGllbnRfZW5jb2RpbmcsCU5VTEwpCiAjZW5kaWYKKwlQSFBfRkUocGdfcmVz
ZXQsCQkJCSBOVUxMKQorCVBIUF9GRShwZ19zdGF0dXMsCQkJCSBOVUxMKQorCVBIUF9GRShw
Z19zZW5kX3F1ZXJ5LAkJCSBOVUxMKQorCVBIUF9GRShwZ19yZXF1ZXN0X2NhbmNlbCwJCSBO
VUxMKQorCVBIUF9GRShwZ19nZXRfcmVzdWx0LAkJCSBOVUxMKQorCVBIUF9GRShwZ19pc19i
dXN5LAkJCQkgTlVMTCkKIAl7TlVMTCwgTlVMTCwgTlVMTH0KIH07CiAvKiB9fX0gKi8KQEAg
LTE0Nyw3ICsxNTMsMTcgQEAKIHN0YXRpYyB2b2lkIF9jbG9zZV9wZ3NxbF9saW5rKHplbmRf
cnNyY19saXN0X2VudHJ5ICpyc3JjIFRTUk1MU19EQykKIHsKIAlQR2Nvbm4gKmxpbmsgPSAo
UEdjb25uICopcnNyYy0+cHRyOworCVBHcmVzdWx0ICpyZXM7CiAKKwlQUXNldG5vbmJsb2Nr
aW5nKGxpbmssMSk7CisJaWYgKFBRaXNCdXN5KGxpbmspKSB7CisJCWlmICghUFFyZXF1ZXN0
Q2FuY2VsKGxpbmspKSB7CisJCQlwaHBfZXJyb3IoRV9XQVJOSU5HLCJQb3N0Z3JlU1FMOiBm
YWlsZWQgdG8gY2FuY2VsIHFldXJ5LiAlcyIsIFBRZXJyb3JNZXNzYWdlKGxpbmspKTsKKwkJ
fQorCX0KKwl3aGlsZSAoKHJlcyA9IFBRZ2V0UmVzdWx0KGxpbmspKSkgeworCQlQUWNsZWFy
KHJlcyk7CisJfQogCVBRZmluaXNoKGxpbmspOwogCVBHRyhudW1fbGlua3MpLS07CiB9CkBA
IC0xNTgsNyArMTc0LDE3IEBACiBzdGF0aWMgdm9pZCBfY2xvc2VfcGdzcWxfcGxpbmsoemVu
ZF9yc3JjX2xpc3RfZW50cnkgKnJzcmMgVFNSTUxTX0RDKQogewogCVBHY29ubiAqbGluayA9
IChQR2Nvbm4gKilyc3JjLT5wdHI7CisJUEdyZXN1bHQgKnJlczsKIAorCVBRc2V0bm9uYmxv
Y2tpbmcobGluaywxKTsKKwlpZiAoUFFpc0J1c3kobGluaykpIHsKKwkJaWYgKCFQUXJlcXVl
c3RDYW5jZWwobGluaykpIHsKKwkJCXBocF9lcnJvcihFX1dBUk5JTkcsIlBvc3RncmVTUUw6
IGZhaWxlZCB0byBjYW5jZWwgcWV1cnkuICVzIiwgUFFlcnJvck1lc3NhZ2UobGluaykpOwor
CQl9CisJfQorCXdoaWxlICgocmVzID0gUFFnZXRSZXN1bHQobGluaykpKSB7CisJCVBRY2xl
YXIocmVzKTsKKwl9CiAJUFFmaW5pc2gobGluayk7CiAJUEdHKG51bV9wZXJzaXN0ZW50KS0t
OwogCVBHRyhudW1fbGlua3MpLS07CkBAIC0xODcsMTIgKzIxMywyMiBAQAogc3RhdGljIGlu
dCBfcm9sbGJhY2tfdHJhbnNhY3Rpb25zKHplbmRfcnNyY19saXN0X2VudHJ5ICpyc3JjIFRT
Uk1MU19EQykKIHsKIAlQR2Nvbm4gKmxpbms7CisJUEdyZXN1bHQgKnJlczsKIAogCWlmICha
X1RZUEVfUChyc3JjKSAhPSBsZV9wbGluaykgCiAJCXJldHVybiAwOwogCiAJbGluayA9IChQ
R2Nvbm4gKikgcnNyYy0+cHRyOwogCQorCVBRc2V0bm9uYmxvY2tpbmcobGluaywxKTsKKwlp
ZiAoUFFpc0J1c3kobGluaykpIHsKKwkJaWYgKCFQUXJlcXVlc3RDYW5jZWwobGluaykpIHsK
KwkJCXBocF9lcnJvcihFX1dBUk5JTkcsIlBvc3RncmVTUUw6IGZhaWxlZCB0byBjYW5jZWwg
cWV1cnkuICVzIiwgUFFlcnJvck1lc3NhZ2UobGluaykpOworCQl9CisJfQorCXdoaWxlICgo
cmVzID0gUFFnZXRSZXN1bHQobGluaykpKSB7CisJCVBRY2xlYXIocmVzKTsKKwl9CiAJUEdH
KGlnbm9yZV9ub3RpY2VzKSA9IDE7CiAJUFFleGVjKGxpbmssIkJFR0lOO1JPTExCQUNLOyIp
OwogCVBHRyhpZ25vcmVfbm90aWNlcykgPSAwOwpAQCAtMjYyLDYgKzI5OCw5IEBACiAJUkVH
SVNURVJfTE9OR19DT05TVEFOVCgiUEdTUUxfTlVNIiwgUEdTUUxfTlVNLCBDT05TVF9DUyB8
IENPTlNUX1BFUlNJU1RFTlQpOwogCVJFR0lTVEVSX0xPTkdfQ09OU1RBTlQoIlBHU1FMX0JP
VEgiLCBQR1NRTF9CT1RILCBDT05TVF9DUyB8IENPTlNUX1BFUlNJU1RFTlQpOwogCisJUkVH
SVNURVJfTE9OR19DT05TVEFOVCgiUEdTUUxfQ09OTkVDVElPTl9CQUQiLCBDT05ORUNUSU9O
X0JBRCwgQ09OU1RfQ1MgfCBDT05TVF9QRVJTSVNURU5UKTsKKwlSRUdJU1RFUl9MT05HX0NP
TlNUQU5UKCJQR1NRTF9DT05ORUNUSU9OX09LIiwgQ09OTkVDVElPTl9PSywgQ09OU1RfQ1Mg
fCBDT05TVF9QRVJTSVNURU5UKTsKKwogCXJldHVybiBTVUNDRVNTOwogfQogLyogfX19ICov
CkBAIC03MTcsMTEgKzc1NiwxMiBAQAogewogCXp2YWwgKipxdWVyeSwgKipwZ3NxbF9saW5r
ID0gTlVMTDsKIAlpbnQgaWQgPSAtMTsKKwlpbnQgbGVmdG92ZXIgPSAwOwogCVBHY29ubiAq
cGdzcWw7CiAJUEdyZXN1bHQgKnBnc3FsX3Jlc3VsdDsKIAlFeGVjU3RhdHVzVHlwZSBzdGF0
dXM7CiAJcGdzcWxfcmVzdWx0X2hhbmRsZSAqcGdfcmVzdWx0OwotCisJCiAJc3dpdGNoKFpF
TkRfTlVNX0FSR1MoKSkgewogCQljYXNlIDE6CiAJCQlpZiAoemVuZF9nZXRfcGFyYW1ldGVy
c19leCgxLCAmcXVlcnkpPT1GQUlMVVJFKSB7CkBAIC03NDMsNiArNzgzLDE3IEBACiAJWkVO
RF9GRVRDSF9SRVNPVVJDRTIocGdzcWwsIFBHY29ubiAqLCBwZ3NxbF9saW5rLCBpZCwgIlBv
c3RncmVTUUwgbGluayIsIGxlX2xpbmssIGxlX3BsaW5rKTsKIAogCWNvbnZlcnRfdG9fc3Ry
aW5nX2V4KHF1ZXJ5KTsKKwlpZiAoUFFpc0J1c3kocGdzcWwpKSB7CisJCXBocF9lcnJvcihF
X05PVElDRSwiUG9zdGdyZVNRTDogQ2Fubm90IGV4ZWN1dGUgcXVlcnkgd2hpbGUgZXhlY3V0
aW5nIGFzeW5jIHF1ZXJ5LiIpOworCQlSRVRVUk5fRkFMU0U7CisJfQorCXdoaWxlICgocGdz
cWxfcmVzdWx0ID0gUFFnZXRSZXN1bHQocGdzcWwpKSkgeworCQlQUWNsZWFyKHBnc3FsX3Jl
c3VsdCk7CisJCWxlZnRvdmVyID0gMTsKKwl9CisJaWYgKGxlZnRvdmVyKSB7CisJCXBocF9l
cnJvcihFX1dBUk5JTkcsIlBvc3RncmVTUUw6IFRoZXJlIGFyZSByZXN1bHRzIG9uIHRoaXMg
Y29ubmVjdGlvbi4gVXNlIHBnX2dldF9yZXN1bHQoKSB0byBnZXQgcmVzdWx0cyIpOworCX0K
IAlwZ3NxbF9yZXN1bHQgPSBQUWV4ZWMocGdzcWwsIFpfU1RSVkFMX1BQKHF1ZXJ5KSk7CiAJ
CiAJaWYgKHBnc3FsX3Jlc3VsdCkgewpAQCAtNzUxLDcgKzgwMiw2IEBACiAJCXN0YXR1cyA9
IChFeGVjU3RhdHVzVHlwZSkgUFFzdGF0dXMocGdzcWwpOwogCX0KIAkKLQkKIAlzd2l0Y2gg
KHN0YXR1cykgewogCQljYXNlIFBHUkVTX0VNUFRZX1FVRVJZOgogCQljYXNlIFBHUkVTX0JB
RF9SRVNQT05TRToKQEAgLTE5NjIsNyArMjAxMiwyNDAgQEAKIH0KIC8qIH19fSAqLwogI2Vu
ZGlmCisKKworLyoge3t7IHByb3RvIGxvbmcgcGdfc3RhdHVzKHJlc291cmNlIGNvbm4pCisg
ICBHZXQgY29ubmVjdGlvbiBzdGF0dXMgKi8KK1BIUF9GVU5DVElPTihwZ19zdGF0dXMpCit7
CisJenZhbCAqKnBnc3FsX2xpbmsgPSBOVUxMOworCWludCBpZCA9IC0xOworCVBHY29ubiAq
cGdzcWw7CisKKwlzd2l0Y2goWkVORF9OVU1fQVJHUygpKSB7CisJCWNhc2UgMDoKKwkJCWlk
ID0gUEdHKGRlZmF1bHRfbGluayk7CisJCQlDSEVDS19ERUZBVUxUX0xJTksoaWQpOworCQkJ
YnJlYWs7CisJCWNhc2UgMToKKwkJCWlmICh6ZW5kX2dldF9wYXJhbWV0ZXJzX2V4KDEsICZw
Z3NxbF9saW5rKT09RkFJTFVSRSkgeworCQkJCVJFVFVSTl9GQUxTRTsKKwkJCX0KKwkJCWJy
ZWFrOworCQlkZWZhdWx0OgorCQkJV1JPTkdfUEFSQU1fQ09VTlQ7CisJCQlicmVhazsKKwl9
CisKKwlaRU5EX0ZFVENIX1JFU09VUkNFMihwZ3NxbCwgUEdjb25uICosIHBnc3FsX2xpbmss
IGlkLCAiUG9zdGdyZVNRTCBsaW5rIiwgbGVfbGluaywgbGVfcGxpbmspOworCVpfTFZBTF9Q
KHJldHVybl92YWx1ZSkgPSBQUXN0YXR1cyhwZ3NxbCk7CisJWl9UWVBFX1AocmV0dXJuX3Zh
bHVlKSA9IElTX0xPTkc7Cit9CisKKy8qIH19fSAqLworCisvKiB7e3sgcHJvdG8gYm9vbCBw
Z19yZXNldChyZXNvdXJjZSBjb25uKQorICAgUmVzZXQgY29ubmVjdGlvbiAqLworUEhQX0ZV
TkNUSU9OKHBnX3Jlc2V0KQoreworCXp2YWwgKipwZ3NxbF9saW5rID0gTlVMTDsKKwlpbnQg
aWQgPSAtMTsKKwlQR2Nvbm4gKnBnc3FsOworCisJc3dpdGNoKFpFTkRfTlVNX0FSR1MoKSkg
eworCQljYXNlIDA6CisJCQlpZCA9IFBHRyhkZWZhdWx0X2xpbmspOworCQkJQ0hFQ0tfREVG
QVVMVF9MSU5LKGlkKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAoemVuZF9nZXRf
cGFyYW1ldGVyc19leCgxLCAmcGdzcWxfbGluayk9PUZBSUxVUkUpIHsKKwkJCQlSRVRVUk5f
RkFMU0U7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVdST05HX1BBUkFNX0NP
VU5UOworCQkJYnJlYWs7CisJfQorCVpFTkRfRkVUQ0hfUkVTT1VSQ0UyKHBnc3FsLCBQR2Nv
bm4gKiwgcGdzcWxfbGluaywgaWQsICJQb3N0Z3JlU1FMIGxpbmsiLCBsZV9saW5rLCBsZV9w
bGluayk7CisJUFFyZXNldChwZ3NxbCk7CisJaWYgKFBRc3RhdHVzKHBnc3FsKSA9PSBDT05O
RUNUSU9OX0JBRCkgeworCQlSRVRVUk5fRkFMU0U7CisJfQorCVJFVFVSTl9UUlVFOworfQor
CisvKiB9fX0gKi8KKworLyogRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZm9yIGFzeW5jcm9u
b3VzIHF1ZXJ5CisgKiBSZXBvcnQgYnVncyB0byB5YXN1b19vaGdha2lAeWFob28uY29tCisg
Ki8gCisjZGVmaW5lIFBIUF9QR19BU1lOQ19JU19CVVNZCQkxCisjZGVmaW5lIFBIUF9QR19B
U1lOQ19SRVFVRVNUX0NBTkNFTCAyCisKKy8qIHt7eyBwaHBfcGdzcWxfZG9fYXN5bmMKKyAq
Lwordm9pZCBwaHBfcGdzcWxfZG9fYXN5bmMoSU5URVJOQUxfRlVOQ1RJT05fUEFSQU1FVEVS
UywgaW50IGVudHJ5X3R5cGUpIAoreworCXp2YWwgKipwZ3NxbF9saW5rID0gTlVMTDsKKwlp
bnQgaWQgPSAtMTsKKwlQR2Nvbm4gKnBnc3FsOworCVBHcmVzdWx0ICpwZ3NxbF9yZXN1bHQ7
CisKKwlzd2l0Y2goWkVORF9OVU1fQVJHUygpKSB7CisJCWNhc2UgMDoKKwkJCWlkID0gUEdH
KGRlZmF1bHRfbGluayk7CisJCQlDSEVDS19ERUZBVUxUX0xJTksoaWQpOworCQkJYnJlYWs7
CisJCWNhc2UgMToKKwkJCWlmICh6ZW5kX2dldF9wYXJhbWV0ZXJzX2V4KDEsICZwZ3NxbF9s
aW5rKT09RkFJTFVSRSkgeworCQkJCVJFVFVSTl9GQUxTRTsKKwkJCX0KKwkJCWJyZWFrOwor
CQlkZWZhdWx0OgorCQkJV1JPTkdfUEFSQU1fQ09VTlQ7CisJCQlicmVhazsKKwl9CisKKwla
RU5EX0ZFVENIX1JFU09VUkNFMihwZ3NxbCwgUEdjb25uICosIHBnc3FsX2xpbmssIGlkLCAi
UG9zdGdyZVNRTCBsaW5rIiwgbGVfbGluaywgbGVfcGxpbmspOworCisJc3dpdGNoKGVudHJ5
X3R5cGUpIHsKKwkJY2FzZSBQSFBfUEdfQVNZTkNfSVNfQlVTWToKKwkJCVBRY29uc3VtZUlu
cHV0KHBnc3FsKTsKKwkJCVpfTFZBTF9QKHJldHVybl92YWx1ZSkgPSBQUWlzQnVzeShwZ3Nx
bCk7CisJCQlaX1RZUEVfUChyZXR1cm5fdmFsdWUpID0gSVNfTE9ORzsKKwkJCWJyZWFrOwor
CQljYXNlIFBIUF9QR19BU1lOQ19SRVFVRVNUX0NBTkNFTDoKKwkJCVpfTFZBTF9QKHJldHVy
bl92YWx1ZSkgPSBQUXJlcXVlc3RDYW5jZWwocGdzcWwpOworCQkJWl9UWVBFX1AocmV0dXJu
X3ZhbHVlKSA9IElTX0xPTkc7CisJCQl3aGlsZSAoKHBnc3FsX3Jlc3VsdCA9IFBRZ2V0UmVz
dWx0KHBnc3FsKSkpIHsKKwkJCQlQUWNsZWFyKHBnc3FsX3Jlc3VsdCk7CisJCQl9CisJCQli
cmVhazsKKwkJZGVmYXVsdDoKKwkJCXBocF9lcnJvcihFX0VSUk9SLCJQZ3NxbCBtb2R1bGUg
ZXJyb3IuIFJlcG9ydCB0aGlzIGVycm9yIik7CisJCQlicmVhazsKKwl9CisJY29udmVydF90
b19ib29sZWFuX2V4KCZyZXR1cm5fdmFsdWUpOworfQorLyogfX19ICovCisKKy8qIHt7eyBw
cm90byBib29sIHBnX2FzeW5jX3JlcXVlc3RfY2FuY2VsKFtyZXNvdXJjZSBjb25uZWN0aW9u
XSkKKyAgIENhbmNlbCByZXF1ZXN0ICovCitQSFBfRlVOQ1RJT04ocGdfcmVxdWVzdF9jYW5j
ZWwpCit7CisJcGhwX3Bnc3FsX2RvX2FzeW5jKElOVEVSTkFMX0ZVTkNUSU9OX1BBUkFNX1BB
U1NUSFJVLCBQSFBfUEdfQVNZTkNfUkVRVUVTVF9DQU5DRUwpOworfQorLyogfX19ICovCisK
Ky8qIHt7eyBwcm90byBxdWVyeSBib29sIHBnX2lzYnVzeShbcmVzb3VyY2UgY29ubmVjdGlv
bl0pCisgICBHZXQgY29ubmVjdGlvbiBpcyBidXN5IG9yIG5vdCAqLworUEhQX0ZVTkNUSU9O
KHBnX2lzX2J1c3kpCit7CisJcGhwX3Bnc3FsX2RvX2FzeW5jKElOVEVSTkFMX0ZVTkNUSU9O
X1BBUkFNX1BBU1NUSFJVLCBQSFBfUEdfQVNZTkNfSVNfQlVTWSk7Cit9CisvKiB9fX0gKi8K
KworLyoge3t7IHByb3RvIGJvb2wgcGdfYXN5bmNfZXhlYyhbcmVzb3VyY2UgY29ubmVjdGlv
bl0sIHN0cmluZyBxZXVyeSkKKyAgIFNlbmQgYXN5bmNocm9ub3VzIHF1ZXJ5ICovCitQSFBf
RlVOQ1RJT04ocGdfc2VuZF9xdWVyeSkKK3sKKwl6dmFsICoqcXVlcnksICoqcGdzcWxfbGlu
ayA9IE5VTEw7CisJaW50IGlkID0gLTE7CisJUEdjb25uICpwZ3NxbDsKKwlQR3Jlc3VsdCAq
cmVzOworCWludCBsZWZ0b3ZlciA9IDA7CisKKwlzd2l0Y2goWkVORF9OVU1fQVJHUygpKSB7
CisJCWNhc2UgMToKKwkJCWlmICh6ZW5kX2dldF9wYXJhbWV0ZXJzX2V4KDEsICZxdWVyeSk9
PUZBSUxVUkUpIHsKKwkJCQlSRVRVUk5fRkFMU0U7CisJCQl9CisJCQlpZCA9IFBHRyhkZWZh
dWx0X2xpbmspOworCQkJQ0hFQ0tfREVGQVVMVF9MSU5LKGlkKTsKKwkJCWJyZWFrOworCQlj
YXNlIDI6CisJCQlpZiAoemVuZF9nZXRfcGFyYW1ldGVyc19leCgyLCAmcGdzcWxfbGluaywg
JnF1ZXJ5KT09RkFJTFVSRSkgeworCQkJCVJFVFVSTl9GQUxTRTsKKwkJCX0KKwkJCWJyZWFr
OworCQlkZWZhdWx0OgorCQkJV1JPTkdfUEFSQU1fQ09VTlQ7CisJCQlicmVhazsKKwl9CiAJ
CisJWkVORF9GRVRDSF9SRVNPVVJDRTIocGdzcWwsIFBHY29ubiAqLCBwZ3NxbF9saW5rLCBp
ZCwgIlBvc3RncmVTUUwgbGluayIsIGxlX2xpbmssIGxlX3BsaW5rKTsKKworCWNvbnZlcnRf
dG9fc3RyaW5nX2V4KHF1ZXJ5KTsKKwlpZiAoUFFzZXRub25ibG9ja2luZyhwZ3NxbCwgMSkp
IHsKKwkJcGhwX2Vycm9yKEVfTk9USUNFLCJQb3N0Z3JlU1FMOiBDYW5ub3Qgc2V0IGNvbm5l
Y3Rpb24gdG8gbm9uYmxvY2tpbmcgbW9kZSBpbiBwZ19zZW5kX3F1ZXJ5KCkiKTsKKwl9CisJ
aWYgKFBRaXNCdXN5KHBnc3FsKSkgeworCQlwaHBfZXJyb3IoRV9XQVJOSU5HLCJQb3N0Z3Jl
U1FMOiBDYW5ub3Qgc2VuZCBtdWx0aXBsZSBxdWVyeSB1c2luZyBwZ19zZW5kX3F1ZXJ5KCki
KTsKKwkJUkVUVVJOX0ZBTFNFOworCX0KKwl3aGlsZSAoKHJlcyA9IFBRZ2V0UmVzdWx0KHBn
c3FsKSkpIHsKKwkJUFFjbGVhcihyZXMpOworCQlsZWZ0b3ZlciA9IDE7CisJfQorCWlmIChs
ZWZ0b3ZlcikgeworCQlwaHBfZXJyb3IoRV9OT1RJQ0UsIlBvc3RncmVTUUw6IFRoZXJlIGFy
ZSByZXN1bHRzIG9uIHRoaXMgY29ubmVjdGlvbi4gQ2FsbCBwZ19nZXRfcmVzdWx0KCkgdW50
aWwgaXQgcmV0dXJucyBmYWxzZSIpOworCX0KKwlpZiAoIVBRc2VuZFF1ZXJ5KHBnc3FsLCBa
X1NUUlZBTF9QUChxdWVyeSkpKSB7CisJCVJFVFVSTl9GQUxTRTsKKwl9CisJaWYgKFBRc2V0
bm9uYmxvY2tpbmcocGdzcWwsIDApKSB7CisJCXBocF9lcnJvcihFX05PVElDRSwiUG9zdGdy
ZVNRTDogQ2Fubm90IHNldCBjb25uZWN0aW9uIHRvIGJsb2NraW5nIG1vZGUgaW4gcGdfc2Vu
ZF9xdWVyeSgpIik7CisJfQorCVJFVFVSTl9UUlVFOworfQorLyogfX19ICovCisKKworLyog
e3t7IHByb3RvIHF1ZXJ5IHJlc291Y2UgcGdfYXJ5bmNfcmVzdWx0KFtyZXNvdXJjZSBjb25u
ZWN0aW9uXSkKKyAgIEdldCBhc3luY2hyb25vdXMgcXVlcnkgcmVzdWx0ICovCitQSFBfRlVO
Q1RJT04ocGdfZ2V0X3Jlc3VsdCkKK3sKKwl6dmFsICoqcGdzcWxfbGluayA9IE5VTEw7CisJ
aW50IGlkID0gLTE7CisJUEdjb25uICpwZ3NxbDsKKwlQR3Jlc3VsdCAqcGdzcWxfcmVzdWx0
OworCXBnc3FsX3Jlc3VsdF9oYW5kbGUgKnBnX3Jlc3VsdDsKKworCXN3aXRjaChaRU5EX05V
TV9BUkdTKCkpIHsKKwkJY2FzZSAwOgorCQkJaWQgPSBQR0coZGVmYXVsdF9saW5rKTsKKwkJ
CUNIRUNLX0RFRkFVTFRfTElOSyhpZCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYg
KHplbmRfZ2V0X3BhcmFtZXRlcnNfZXgoMSwgJnBnc3FsX2xpbmspPT1GQUlMVVJFKSB7CisJ
CQkJUkVUVVJOX0ZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlXUk9O
R19QQVJBTV9DT1VOVDsKKwkJCWJyZWFrOworCX0KKworCVpFTkRfRkVUQ0hfUkVTT1VSQ0Uy
KHBnc3FsLCBQR2Nvbm4gKiwgcGdzcWxfbGluaywgaWQsICJQb3N0Z3JlU1FMIGxpbmsiLCBs
ZV9saW5rLCBsZV9wbGluayk7CisJaWYgKFBRc2V0bm9uYmxvY2tpbmcocGdzcWwsIDEpKSB7
CisJCXBocF9lcnJvcihFX05PVElDRSwiUG9zdGdyZVNRTDogQ2Fubm90IHNldCBjb25uZWN0
aW9uIHRvIG5vbmJsb2NraW5nIG1vZGUgaW4gcGdfZ2V0X3Jlc3VsdCgpIik7CisJfQorCXBn
c3FsX3Jlc3VsdCA9IFBRZ2V0UmVzdWx0KHBnc3FsKTsKKwlpZiAoIXBnc3FsX3Jlc3VsdCkg
eworCQkvKiBubyByZXN1bHQgKi8KKwkJUkVUVVJOX0ZBTFNFOworCX0KKwlpZiAoUFFzZXRu
b25ibG9ja2luZyhwZ3NxbCwgMCkpIHsKKwkJcGhwX2Vycm9yKEVfTk9USUNFLCJQb3N0Z3Jl
U1FMOiBDYW5ub3Qgc2V0IGNvbm5lY3Rpb24gdG8gYmxvY2tpbmcgbW9kZSBpbiBwZ19nZXRf
cmVzdWx0KCkiKTsKKwl9CisJcGdfcmVzdWx0ID0gKHBnc3FsX3Jlc3VsdF9oYW5kbGUgKikg
ZW1hbGxvYyhzaXplb2YocGdzcWxfcmVzdWx0X2hhbmRsZSkpOworCXBnX3Jlc3VsdC0+Y29u
biA9IHBnc3FsOworCXBnX3Jlc3VsdC0+cmVzdWx0ID0gcGdzcWxfcmVzdWx0OworCXBnX3Jl
c3VsdC0+cm93ID0gLTE7CisJWkVORF9SRUdJU1RFUl9SRVNPVVJDRShyZXR1cm5fdmFsdWUs
IHBnX3Jlc3VsdCwgbGVfcmVzdWx0KTsKK30KKy8qIH19fSAqLworCiAjZW5kaWYKIAogLyoK
SW5kZXg6IHBocF9wZ3NxbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9yZXBvc2l0b3J5
L3BocDQvZXh0L3Bnc3FsL3BocF9wZ3NxbC5oLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjMz
CmRpZmYgLXUgLXIxLjMzIHBocF9wZ3NxbC5oCi0tLSBwaHBfcGdzcWwuaAkyNiBTZXAgMjAw
MSAyMTo0NDo0OCAtMDAwMAkxLjMzCisrKyBwaHBfcGdzcWwuaAkyNSBOb3YgMjAwMSAwOToz
NToyMyAtMDAwMApAQCAtOTQsNiArOTQsMTIgQEAKIFBIUF9GVU5DVElPTihwZ19jbGllbnRf
ZW5jb2RpbmcpOwogUEhQX0ZVTkNUSU9OKHBnX3NldF9jbGllbnRfZW5jb2RpbmcpOwogI2Vu
ZGlmCitQSFBfRlVOQ1RJT04ocGdfcmVzZXQpOworUEhQX0ZVTkNUSU9OKHBnX3N0YXR1cyk7
CitQSFBfRlVOQ1RJT04ocGdfc2VuZF9xdWVyeSk7CitQSFBfRlVOQ1RJT04ocGdfcmVxdWVz
dF9jYW5jZWwpOworUEhQX0ZVTkNUSU9OKHBnX2dldF9yZXN1bHQpOworUEhQX0ZVTkNUSU9O
KHBnX2lzX2J1c3kpOwogCiB2b2lkIHBocF9wZ3NxbF9kb19jb25uZWN0KElOVEVSTkFMX0ZV
TkNUSU9OX1BBUkFNRVRFUlMsaW50IHBlcnNpc3RlbnQpOwogaW50IHBocF9wZ3NxbF9nZXRf
ZGVmYXVsdF9saW5rKElOVEVSTkFMX0ZVTkNUSU9OX1BBUkFNRVRFUlMpOwpAQCAtMTAyLDcg
KzEwOCw3IEBACiBjaGFyICpnZXRfZmllbGRfbmFtZShQR2Nvbm4gKnBnc3FsLCBPaWQgb2lk
LCBIYXNoVGFibGUgKmxpc3QpOwogdm9pZCBwaHBfcGdzcWxfZ2V0X2ZpZWxkX2luZm8oSU5U
RVJOQUxfRlVOQ1RJT05fUEFSQU1FVEVSUywgaW50IGVudHJ5X3R5cGUpOwogdm9pZCBwaHBf
cGdzcWxfZGF0YV9pbmZvKElOVEVSTkFMX0ZVTkNUSU9OX1BBUkFNRVRFUlMsIGludCBlbnRy
eV90eXBlKTsKLQordm9pZCBwaHBfcGdzcWxfZG9fYXN5bmMoSU5URVJOQUxfRlVOQ1RJT05f
UEFSQU1FVEVSUyxpbnQgZW50cnlfdHlwZSk7CiAKIHR5cGVkZWYgc3RydWN0IHBnTG9mcCB7
CiAgICAgICAgIFBHY29ubiAqY29ubjsK
--------------090900000906090908020308--

__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!  http://bb.yahoo.co.jp/