Subject: Adding scan_ufs (scan_ffs replacement, now with LFS support)
To: None <tech-userlevel@netbsd.org>
From: Juan RP <juan@xtrarom.org>
List: tech-userlevel
Date: 07/29/2005 15:02:29
This is a multi-part message in MIME format.

--Multipart=_Fri__29_Jul_2005_15_02_29_+0200_EjXBa0.tso1DO8LU
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit


Hi there!

Finally, I've added LFS support into the scan_ffs(8) program, but
now that it can detect both filesystems (FFS/LFS), I'd want to
import scan_ufs and remove the current scan_ffs.

An example of using scan_ufs:

[juan@Nocturno][~/scan_ufs]> ./scan_ufs -l -s 51199155 wd0 
Disk: Maxtor 6Y080M0 
Total sectors on disk: 160086528

#        size    offset fstype [fsize bsize cpg/sgs]
X:     132048  51199155 4.2BSD   1024  8192        0 # / [FFSv2]
X:   12288528  51856371 4.4LFS   1024  8192     6000 # /usr [LFSv2]
X:    1049328  64144899 4.4LFS   1024  8192      512 # /var [LFSv2]
X:   67936428  65194227 4.4LFS   1024  8192    33172 # /home [LFSv2]
[juan@Nocturno][~/scan_ufs]>



--Multipart=_Fri__29_Jul_2005_15_02_29_+0200_EjXBa0.tso1DO8LU
Content-Type: application/octet-stream;
 name="scan_ufs.c"
Content-Disposition: attachment;
 filename="scan_ufs.c"
Content-Transfer-Encoding: base64

LyoKICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBOZXRCU0QgRm91bmRhdGlvbiwgSW5jLgogKiBB
bGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3
YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBOZXRCU0QgRm91bmRhdGlvbgogKiBieSBKdWFuIFJvbWVy
byBQYXJkaW5lcy4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZl
YXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCiAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9s
bG93aW5nIGFja25vd2xlZGdlbWVudDoKICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29m
dHdhcmUgZGV2ZWxvcGVkIGJ5IEp1YW4gUm9tZXJvIFBhcmRpbmVzCiAqICAgICAgZm9yIHRoZSBO
ZXRCU0QgRm91bmRhdGlvbiwgSW5jLiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KICogNC4gTmVpdGhl
ciB0aGUgbmFtZSBvZiBUaGUgTmV0QlNEIEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
ICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCiAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgTkVUQlNEIEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9SUwogKiBgYEFTIElT
JycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQKICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OIE9SIENPTlRSSUJVVE9SUwogKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCiAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwogKiBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgogKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQogKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogKiBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KICovCgovKgogKiBDb3B5cmlnaHQgKGMpIDE5OTggTmlrbGFz
IEhhbGxxdmlzdCwgVG9iaWFzIFdlaW5nYXJ0bmVyCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAq
CiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAq
CiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5E
IEFOWSBFWFBSRVNTIE9SCiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKICogT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KICog
SU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULAogKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAogKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAogKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKICogVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICovCgov
KgogKiBDdXJyZW50bHkgaXQgY2FuIGRldGVjdDoKICogCW8gRkZTdjEgZnNpemUvYnNpemU6IDUx
Mi80MDk2LCAxMDI0LzgxOTIsIDIwNDgvMTYzODQuCiAqCW8gRkZTdjIgZnNpemUvYnNpemU6IDUx
Mi80MDk2LCAxMDI0LzgxOTIsIDIwNDgvMTYzODQsCiAqCSAgCQkgICAgIDQwOTYvMzI3NjgsIDgx
OTIvNjU1MzYuCiAqCW8gTEZTdlsxMl0gZnNpemUvYnNpemU6IDUxMi80MDk2LCAxMDI0LzgxOTIs
IDIwNDgvMTYzODQsCiAqCQkJCTQwOTYvMzI3NjgsIDgxOTIvNjU1MzYuCiAqCiAqIFRPRE86CiAq
CW8gRGV0ZWN0IEZGU3YxIHBhcnRpdGlvbnMgd2l0aCBmc2l6ZS9ic2l6ZSA+IDIwNDgvMTYzODQu
CiAqCiAqCS0tIHh0cmFlbWUgLS0KICovCiAKI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgojaWZuZGVm
IGxpbnQKX19SQ1NJRCgiJE5ldEJTRCQiKTsKI2VuZGlmIC8qIG5vdCBsaW50ICovCgojaW5jbHVk
ZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2luY2x1ZGUgPHN5cy9kaXNr
bGFiZWwuaD4KI2luY2x1ZGUgPHN5cy9ka2lvLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2lu
Y2x1ZGUgPHN5cy9mY250bC5oPgojaW5jbHVkZSA8c3lzL3F1ZXVlLmg+CiNpbmNsdWRlIDxzeXMv
bW91bnQuaD4KCiNpbmNsdWRlIDx1ZnMvdWZzL2Rpbm9kZS5oPgojaW5jbHVkZSA8dWZzL2xmcy9s
ZnMuaD4KI2luY2x1ZGUgPHVmcy9mZnMvZnMuaD4KCiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1
ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5j
bHVkZSA8ZXJyLmg+CiNpbmNsdWRlIDx1dGlsLmg+CgovKiBjb21tb24gc3RydWN0IGZvciBGRlMv
TEZTICovCnN0cnVjdCBzYmxvY2tpbmZvIHsKCXN0cnVjdCBsZnMJKmxmczsKCXN0cnVjdCBmcwkq
ZmZzOwoJdV9pbnQ2NF90CWxmc19vZmY7Cgl1X2ludDY0X3QJZmZzX29mZjsKCWNoYXIJCWxmc19w
YXRoW01BWE1OVExFTl07CgljaGFyCQlmZnNfcGF0aFtNQVhNTlRMRU5dOwp9IHNiaW5mbzsKCnN0
YXRpYyBkYWRkcl90CWJsaywgbGFzdGJsazsKCnN0YXRpYyBpbnQJZWZsYWcgPSAwOwpzdGF0aWMg
aW50CWZsYWdzID0gMDsKc3RhdGljIGludCAJc2JhZGRyID0gMDsgLyogY291bnRlciBmb3IgdGhl
IExGUyBzdXBlcmJsb2NrcyAqLwoKc3RhdGljIGNoYXIJZGV2aWNlW01BWFBBVEhMRU5dOwpzdGF0
aWMgY29uc3QgY2hhciAqZnN0eXBlc1tdID0geyAiTk9ORSIsICJGRlN2MSIsICJGRlN2MiIsICJM
RlMiIH07CgojZGVmaW5lIEZTVFlQRV9OT05FCTAKI2RlZmluZSBGU1RZUEVfRkZTVjEJMQojZGVm
aW5lIEZTVFlQRV9GRlNWMgkyCgojZGVmaW5lIFNCQ09VTlQJCTY0IC8qIG1heSBiZSBjaGFuZ2Vk
ICovCgovKiBUaGlzIGlzIG9ubHkgdXNlZnVsIGZvciBMRlMgKi8KCi8qIGZpcnN0IHNibG9jayBh
ZGRyZXNzIGNvbnRhaW5zIHRoZSBjb3JyZWN0IG9mZnNldCAqLwojZGVmaW5lIEZJUlNUX1NCTE9D
S19BRERSRVNTICAgIDEgCi8qIHNlY29uZCBhbmQgdGhpcmQgc2Jsb2NrIGFkZHJlc3MgY29udGFp
biBsZnNfZnNtbnRbTUFYTU5UTEVOXSAqLwojZGVmaW5lIFNFQ09ORF9TQkxPQ0tfQUREUkVTUyAg
IDIKLyogbGFzdCBzYmxvY2sgYWRkcmVzcyBpbiBhIExGUyBwYXJ0aXRpb24gKi8KI2RlZmluZSBN
QVhfU0JMT0NLX0FERFJFU1MgICAgICAxMAoKZW51bSB7IE5BREEsIFZFUkJPU0UsIExBQkVMUyB9
OwoKLyogRkZTIGZ1bmN0aW9ucyAqLwpzdGF0aWMgdm9pZAlmZnNfcHJpbnRwYXJ0KGludCwgaW50
LCBpbnQpOwpzdGF0aWMgdm9pZAlmZnNfc2NhbihpbnQpOwpzdGF0aWMgaW50CWZmc19jaGVja3Zl
cih2b2lkKTsKLyogTEZTIGZ1bmN0aW9ucyAqLwpzdGF0aWMgdm9pZAlsZnNfcHJpbnRwYXJ0KGlu
dCwgaW50LCBzdHJ1Y3Qgc2Jsb2NraW5mbyAqKTsKc3RhdGljIHZvaWQJbGZzX3NjYW4oaW50KTsK
LyogY29tbW9uIGZ1bmN0aW9ucyAqLwpzdGF0aWMgdm9pZAl1c2FnZSh2b2lkKSBfX2F0dHJpYnV0
ZV9fKChfX25vcmV0dXJuX18pKTsKc3RhdGljIGludAlzY2FuX2Rpc2soaW50LCBkYWRkcl90LCBk
YWRkcl90LCBpbnQpOwoKc3RhdGljIGludApmZnNfY2hlY2t2ZXIodm9pZCkKewoJc3dpdGNoIChz
YmluZm8uZmZzLT5mc19tYWdpYykgewoJCWNhc2UgRlNfVUZTMV9NQUdJQzoKCQljYXNlIEZTX1VG
UzFfTUFHSUNfU1dBUFBFRDoKCQkJc2JpbmZvLmZmcy0+ZnNfc2l6ZSA9IHNiaW5mby5mZnMtPmZz
X29sZF9zaXplOwoJCQlyZXR1cm4gRlNUWVBFX0ZGU1YxOwoJCWNhc2UgRlNfVUZTMl9NQUdJQzoK
CQljYXNlIEZTX1VGUzJfTUFHSUNfU1dBUFBFRDoKCQkJcmV0dXJuIEZTVFlQRV9GRlNWMjsKCQlk
ZWZhdWx0OgoJCQlyZXR1cm4gRlNUWVBFX05PTkU7Cgl9Cn0KCnN0YXRpYyB2b2lkCmZmc19wcmlu
dHBhcnQoaW50IGZsYWcsIGludCBmZnNpemUsIGludCBuKQp7CgkKCWludCBmc3R5cGUgPSBmZnNf
Y2hlY2t2ZXIoKTsKCglzd2l0Y2ggKGZsYWcpIHsKCWNhc2UgVkVSQk9TRToKCQkodm9pZClwcmlu
dGYoImJsb2NrOiAlIiBQUkl1NjQgIiBpZCAleCwleCBzaXplICUiIFBSSXU2NCAiXG4iLAoJCQli
bGsgKyAobiAvIDUxMiksCgkJCXNiaW5mby5mZnMtPmZzX2lkWzBdLAoJCQlzYmluZm8uZmZzLT5m
c19pZFsxXSwgc2JpbmZvLmZmcy0+ZnNfc2l6ZSk7CgkJYnJlYWs7CgljYXNlIExBQkVMUzoKCQko
dm9pZClwcmludGYoIlg6ICAlOSIgUFJJdTY0LAoJCQkodWludDY0X3QpKChvZmZfdClzYmluZm8u
ZmZzLT5mc19zaXplICoKCQkJc2JpbmZvLmZmcy0+ZnNfZnNpemUgLyA1MTIpKTsKCQlzd2l0Y2gg
KGZzdHlwZSkgewoJCWNhc2UgRlNUWVBFX0ZGU1YxOgoJCQkodm9pZClwcmludGYoIiAlOSIgUFJJ
dTY0LAoJCQkgICAgYmxrICsgKG4gLyA1MTIpIC0gKDIgKiBTQkxPQ0tTSVpFIC8gNTEyKSk7CgkJ
CWJyZWFrOwoJCWNhc2UgRlNUWVBFX0ZGU1YyOgoJCQkodm9pZClwcmludGYoIiAlOSIgUFJJdTY0
LAoJCQkgICAgYmxrICsgKG4gLyA1MTIpIC0gCgkJCSAgICAoZmZzaXplICogU0JMT0NLU0laRSAv
IDUxMiArIDEyOCkpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlicmVhazsKCQl9CgkJKHZvaWQp
cHJpbnRmKCIgNC4yQlNEICU2ZCAlNWQgJThkICMgJXMgWyVzXVxuIiwKCQkJc2JpbmZvLmZmcy0+
ZnNfZnNpemUsIHNiaW5mby5mZnMtPmZzX2JzaXplLAoJCQlzYmluZm8uZmZzLT5mc19vbGRfY3Bn
LCAKCQkJc2JpbmZvLmZmc19wYXRoLCBmc3R5cGVzW2ZzdHlwZV0pOwoJCWJyZWFrOwoJZGVmYXVs
dDoKCQlwcmludGYoIiVzICIsIGZzdHlwZXNbZnN0eXBlXSk7CgkJc3dpdGNoIChmc3R5cGUpIHsK
CQljYXNlIEZTVFlQRV9GRlNWMToKCQkJKHZvaWQpcHJpbnRmKCJhdCAlIiBQUkl1NjQsCgkJCSAg
ICBibGsgKyAobiAvIDUxMikgLSAoMiAqIFNCTE9DS1NJWkUgLyA1MTIpKTsKCQkJYnJlYWs7CgkJ
Y2FzZSBGU1RZUEVfRkZTVjI6CgkJCSh2b2lkKXByaW50ZigiYXQgJSIgUFJJdTY0LAoJCQkgICAg
YmxrICsgKG4gLyA1MTIpIC0KCQkJICAgIChmZnNpemUgKiBTQkxPQ0tTSVpFIC8gNTEyICsgMTI4
KSk7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJCX0KCQkodm9pZClwcmludGYoIiBz
aXplICUiIFBSSXU2NCAiLCBsYXN0IG1vdW50ZWQgb24gJXNcbiIsCgkJCSh1aW50NjRfdCkoKG9m
Zl90KXNiaW5mby5mZnMtPmZzX3NpemUgKgoJCQlzYmluZm8uZmZzLT5mc19mc2l6ZSAvIDUxMiks
IHNiaW5mby5mZnNfcGF0aCk7CgkJYnJlYWs7Cgl9Cn0KCnN0YXRpYyB2b2lkCmZmc19zY2FuKGlu
dCBuKQp7CglpbnQgZnN0eXBlID0gZmZzX2NoZWNrdmVyKCk7CglzaXplX3QgaTsKCgkvKiAKCSAq
IFhYWDoKCSAqIEl0IGNhbm5vdCBmaW5kIEZGU3YxIHBhcnRpdGlvbnMgd2l0aCBmc2l6ZS9ic2l6
ZSA+IDIwNDgvMTYzODQsCgkgKiBzYW1lIHByb2JsZW0gZm91bmQgaW4gdGhlIG9yaWdpbmFsIHBy
b2dyYW0gdGhhdCBjb21lcyBmcm9tCgkgKiBPcGVuQlNEIChzY2FuX2Zmcyg4KSkuCgkgKi8KCWlm
IChmbGFncyAmIFZFUkJPU0UpCgkJZmZzX3ByaW50cGFydChWRVJCT1NFLCBOQURBLCBuKTsKCXN3
aXRjaCAoZnN0eXBlKSB7CgljYXNlIEZTVFlQRV9GRlNWMToKCQlpZiAoKChibGsgKyAobiAvIDUx
MikpIC0gbGFzdGJsaykgPT0gKFNCTE9DS1NJWkUgLyA1MTIpKSB7CgkJCWlmIChmbGFncyAmIExB
QkVMUykKCQkJCWZmc19wcmludHBhcnQoTEFCRUxTLCBOQURBLCBuKTsKCQkJZWxzZQoJCQkJZmZz
X3ByaW50cGFydChOQURBLCBOQURBLCBuKTsKCQl9CgkJYnJlYWs7CgljYXNlIEZTVFlQRV9GRlNW
MjoKCQkvKgoJCSAqIFRoYXQgY2hlY2tzIGZvciBGRlN2MiBwYXJ0aXRpb25zIHdpdGggZnJhZ3Np
emUvYmxvY2tzaXplOgoJCSAqIDUxMi80MDk2LCAxMDI0LzgxOTIsIDIwNDgvMTYzODQsIDQwOTYv
MzI3NjggYW5kIDgxOTIvNjU1MzYuCgkJICogUmVhbGx5IGVub3VnaCBmb3Igbm93LgoJCSAqLwoJ
CWZvciAoaSA9IDE7IGkgPCAxNjsgaSA8PD0gMSkKCQkJaWYgKCgoYmxrICsgKG4gLyA1MTIpKSAt
IGxhc3RibGspID09CgkJCSAgICAoaSAqIFNCTE9DS1NJWkUgLyA1MTIpKSB7CgkJCQlpZiAoZmxh
Z3MgJiBMQUJFTFMpCgkJCQkJZmZzX3ByaW50cGFydChMQUJFTFMsIGksIG4pOwoJCQkJZWxzZQoJ
CQkJCWZmc19wcmludHBhcnQoTkFEQSwgaSwgbik7CgkJCX0KCQlicmVhazsKCX0KfQoKc3RhdGlj
IHZvaWQKbGZzX3ByaW50cGFydChpbnQgZmxhZywgaW50IG4sIHN0cnVjdCBzYmxvY2tpbmZvICpz
YmkpCnsKCWlmIChmbGFncyAmIFZFUkJPU0UpCiAgICAgICAgICAgICAgIAkodm9pZClwcmludGYo
ImJsb2NrOiAlIiBQUkl1NjQgIiBzaXplICUiIFBSSXUzMiAiXG4iLAogICAgICAgICAgICAgICAg
CWJsayArIChuIC8gNTEyKSwgc2JpLT5sZnMtPmxmc19zaXplKTsKCXN3aXRjaCAoZmxhZykgewoJ
Y2FzZSBMQUJFTFM6CgkJKHZvaWQpcHJpbnRmKCJYOiAgJTkiIFBSSXU2NCwKICAgICAgICAgICAg
ICAgCQkodWludDY0X3QpKChvZmZfdClzYmktPmxmcy0+bGZzX3NpemUgKgogICAgICAgICAgICAg
ICAJCXNiaS0+bGZzLT5sZnNfZnNpemUgLyA1MTIpKTsKCQkodm9pZClwcmludGYoIiAlOSIgUFJJ
dTY0LCBzYmktPmxmc19vZmYpOyAKCQkodm9pZClwcmludGYoIiA0LjRMRlMgJTZkICU1ZCAlOGQg
IyAlcyBbTEZTdiVkXVxuIiwKCQkJc2JpLT5sZnMtPmxmc19mc2l6ZSwgc2JpLT5sZnMtPmxmc19i
c2l6ZSwKCQkJc2JpLT5sZnMtPmxmc19uc2VnLCBzYmktPmxmc19wYXRoLCAKCQkJc2JpLT5sZnMt
Pmxmc192ZXJzaW9uKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJKHZvaWQpcHJpbnRmKCJMRlN2JWQg
Iiwgc2JpbmZvLmxmcy0+bGZzX3ZlcnNpb24pOwoJCSh2b2lkKXByaW50ZigiYXQgJSIgUFJJdTY0
LCBzYmluZm8ubGZzX29mZik7CgkJKHZvaWQpcHJpbnRmKCIgc2l6ZSAlIiBQUkl1NjQgIiwgbGFz
dCBtb3VudGVkIG9uICVzXG4iLAoJCQkodWludDY0X3QpKChvZmZfdClzYmluZm8ubGZzLT5sZnNf
c2l6ZSAqCgkJCXNiaW5mby5sZnMtPmxmc19mc2l6ZSAvIDUxMiksIHNiaW5mby5sZnNfcGF0aCk7
CgkJYnJlYWs7Cgl9Cn0KCnN0YXRpYyB2b2lkCmxmc19zY2FuKGludCBuKQp7CgkvKiBiYWNrdXAg
b2Zmc2V0ICovCglsYXN0YmxrID0gYmxrICsgKG4gLyA1MTIpIC0gKExGU19TQlBBRCAvIDUxMik7
CgkvKiBpbmNyZW1lbnQgY291bnRlciAqLwogICAgICAgICsrc2JhZGRyOwoKCXN3aXRjaCAoc2Jh
ZGRyKSB7CgkvKgoJICogZmlyc3Qgc3VwZXJibG9jayBjb250YWlucyB0aGUgcmlnaHQgb2Zmc2V0
LCBidXQgbGZzX2ZzbW50IGlzCgkgKiBlbXB0eS4uLiBhZm9ydHVuYXRlbHkgdGhlIG5leHQgc3Vw
ZXJibG9jayBhZGRyZXNzIGhhcyBpdC4KCSAqLwoJY2FzZSBGSVJTVF9TQkxPQ0tfQUREUkVTUzoK
CQkvKiBjb3B5IHBhcnRpdGlvbiBvZmZzZXQgKi8KCQlpZiAoc2JpbmZvLmxmc19vZmYgIT0gbGFz
dGJsaykKCQkJc2JpbmZvLmxmc19vZmYgPSBibGsgKyAobiAvIDUxMikgLSAoTEZTX1NCUEFEIC8g
NTEyKTsKCQlicmVhazsKCWNhc2UgU0VDT05EX1NCTE9DS19BRERSRVNTOgoJCS8qIGNvcHkgdGhl
IHBhdGggb2YgbGFzdCBtb3VudCAqLwoJCSh2b2lkKW1lbWNweShzYmluZm8ubGZzX3BhdGgsCgkJ
CXNiaW5mby5sZnMtPmxmc19mc21udCwgTUFYTU5UTEVOKTsKCQkvKiBwcmludCBub3cgdGhhdCB3
ZSBoYXZlIHRoZSBpbmZvICovCgkJaWYgKGZsYWdzICYgTEFCRUxTKQoJCQlsZnNfcHJpbnRwYXJ0
KExBQkVMUywgbiwgJnNiaW5mbyk7CgkJZWxzZQoJCQlsZnNfcHJpbnRwYXJ0KE5BREEsIG4sICZz
YmluZm8pOwoJCS8qIGNsZWFyIG91ciBzdHJ1Y3QgKi8KCQkodm9pZCltZW1zZXQoJnNiaW5mbywg
MCwgc2l6ZW9mKHNiaW5mbykpOwoJCWJyZWFrOwoJY2FzZSBNQVhfU0JMT0NLX0FERFJFU1M6CgkJ
LyoKCQkgKiByZXNldCB0aGUgY291bnRlciwgdGhpcyBpcyB0aGUgbGFzdCBzdXBlcmJsb2NrIGFk
ZHJlc3MsCgkJICogdGhlIG5leHQgb25lIHdpbGwgYmUgYW5vdGhlciBwYXJ0aXRpb24gbWF5YmUu
CgkJICovCgkJc2JhZGRyID0gMDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9Cn0KCnN0
YXRpYyBpbnQKc2Nhbl9kaXNrKGludCBmZCwgZGFkZHJfdCBiZWcsIGRhZGRyX3QgZW5kLCBpbnQg
ZmZsYWdzKQp7Cgl1X2ludDhfdCBidWZbU0JMT0NLU0laRSAqIFNCQ09VTlRdOwoJaW50IG4sIGZz
dHlwZTsKCgluID0gZnN0eXBlID0gMDsKCWxhc3RibGsgPSAtMTsKCgkvKiBjbGVhciBvdXIgc3Ry
dWN0IGJlZm9yZSB1c2luZyBpdCAqLwoJKHZvaWQpbWVtc2V0KCZzYmluZm8sIDAsIHNpemVvZihz
YmluZm8pKTsKCglpZiAoZmZsYWdzICYgTEFCRUxTKQoJCSh2b2lkKXByaW50ZigKCQkgICAgIiMg
ICAgICAgIHNpemUgICAgb2Zmc2V0IGZzdHlwZSBbZnNpemUgYnNpemUgY3BnL3Nnc11cbiIpOwoK
CWZvciAoYmxrID0gYmVnOyBibGsgPD0gKChlbmQgPCAwKSA/IGJsazogZW5kKTsKCQlibGsgKz0g
KFNCQ09VTlQgKiBTQkxPQ0tTSVpFIC8gNTEyKSkgewoJCSh2b2lkKW1lbXNldChidWYsIDAsIHNp
emVvZihidWYpKTsKCgkJaWYgKGxzZWVrKGZkLCAob2ZmX3QpYmxrICogNTEyLCBTRUVLX1NFVCkg
PT0gKG9mZl90KS0xKQoJCQllcnIoMSwgImxzZWVrIik7CgoJCWlmIChyZWFkKGZkLCBidWYsIHNp
emVvZihidWYpKSA9PSAtMSkKCQkJZXJyKDEsICJyZWFkIik7CgoJCWZvciAobiA9IDA7IG4gPCAo
U0JMT0NLU0laRSAqIFNCQ09VTlQpOyBuICs9IDUxMikgewoJCQlzYmluZm8uZmZzID0gKHN0cnVj
dCBmcyAqKSh2b2lkICopJmJ1ZltuXTsKCQkJc2JpbmZvLmxmcyA9IChzdHJ1Y3QgbGZzICopKHZv
aWQgKikmYnVmW25dOwoJCQlmc3R5cGUgPSBmZnNfY2hlY2t2ZXIoKTsKCQkJc3dpdGNoIChmc3R5
cGUpIHsKCQkJY2FzZSBGU1RZUEVfRkZTVjE6CgkJCWNhc2UgRlNUWVBFX0ZGU1YyOgoJCQkJZmZz
X3NjYW4obik7CgkJCQlsYXN0YmxrID0gYmxrICsgKG4gLyA1MTIpOwoJCQkJKHZvaWQpbWVtY3B5
KHNiaW5mby5mZnNfcGF0aCwKCQkJCQlzYmluZm8uZmZzLT5mc19mc21udCwgTUFYTU5UTEVOKTsK
CQkJCWJyZWFrOwoJCQljYXNlIEZTVFlQRV9OT05FOgoJCQkJLyogbWF5YmUgTEZTPyAqLwoJCQkJ
aWYgKHNiaW5mby5sZnMtPmxmc19tYWdpYyAhPSBMRlNfTUFHSUMpCgkJCQkJYnJlYWs7CgkJCQlp
ZiAoc2JpbmZvLmxmcy0+bGZzX21hZ2ljID09IExGU19NQUdJQykKCQkJCQlsZnNfc2NhbihuKTsK
CQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CglyZXR1cm4gRVhJ
VF9TVUNDRVNTOwp9CgoKc3RhdGljIHZvaWQKdXNhZ2Uodm9pZCkKewoJKHZvaWQpZnByaW50Zihz
dGRlcnIsCgkJIlVzYWdlOiAlcyBbLWx2XSBbLXMgc3RhcnRdIFstZSBlbmRdIGRldmljZVxuIiwg
Z2V0cHJvZ25hbWUoKSk7CglleGl0KEVYSVRfRkFJTFVSRSk7Cn0KCgppbnQKbWFpbihpbnQgYXJn
YywgY2hhciAqKmFyZ3YpCnsKCWludCBjaCwgZmQ7CglkYWRkcl90IGVuZCA9IC0xLCBiZWcgPSAw
OwoJc3RydWN0IGRpc2tsYWJlbCBkbDsKCglzZXRwcm9nbmFtZShhcmd2WzBdKTsKCgl3aGlsZSAo
KGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJlOmxzOnYiKSkgIT0gLTEpCgkJc3dpdGNoKGNoKSB7
CgkJY2FzZSAnZSc6CgkJCWVmbGFnID0gMTsKCQkJZW5kID0gYXRvaShvcHRhcmcpOwoJCQlicmVh
azsKCQljYXNlICdsJzoKCQkJZmxhZ3MgfD0gTEFCRUxTOwoJCQlicmVhazsKCQljYXNlICdzJzoK
CQkJYmVnID0gYXRvaShvcHRhcmcpOwoJCQlicmVhazsKCQljYXNlICd2JzoKCQkJZmxhZ3MgfD0g
VkVSQk9TRTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJdXNhZ2UoKTsKCQkJLyogTk9UUkVBQ0hF
RCAqLwoJCX0KCglhcmdjIC09IG9wdGluZDsKCWFyZ3YgKz0gb3B0aW5kOwoKCWlmIChhcmdjICE9
IDEpCgkJdXNhZ2UoKTsKCglmZCA9IG9wZW5kaXNrKGFyZ3ZbMF0sIE9fUkRPTkxZLCBkZXZpY2Us
IHNpemVvZihkZXZpY2UpLCAwKTsKCglpZiAoZmQgPT0gLTEpCgkJZXJyKDEsICJDYW5ub3Qgb3Bl
biBgJXMnIiwgZGV2aWNlKTsKCQkvKiBOT1RSRUFDSEVEICovCgoJaWYgKGlvY3RsKGZkLCBESU9D
R0RJTkZPLCAmZGwpID09IC0xKSB7CgkJd2FybigiQ291bGRuJ3QgcmV0cmlldmUgZGlza2xhYmVs
Iik7CgkJKHZvaWQpbWVtc2V0KCZkbCwgMCwgc2l6ZW9mKGRsKSk7CgkJZGwuZF9zZWNwZXJ1bml0
ID0gMHg3ZmZmZmZmZjsKCX0gZWxzZSB7CgkJKHZvaWQpcHJpbnRmKCJEaXNrOiAlc1xuIiwgZGwu
ZF90eXBlbmFtZSk7CgkJKHZvaWQpcHJpbnRmKCJUb3RhbCBzZWN0b3JzIG9uIGRpc2s6ICUiIFBS
SXUzMiAiXG5cbiIsCgkJICAgIGRsLmRfc2VjcGVydW5pdCk7Cgl9CgkKCWlmICghZWZsYWcpCgkJ
ZW5kID0gZGwuZF9zZWNwZXJ1bml0OyAvKiBkZWZhdWx0IHRvIG1heCBzZWN0b3JzICovCgoJcmV0
dXJuIHNjYW5fZGlzayhmZCwgYmVnLCBlbmQsIGZsYWdzKTsKfQo=

--Multipart=_Fri__29_Jul_2005_15_02_29_+0200_EjXBa0.tso1DO8LU--