Compare commits
836 Commits
ZeroFourEi
...
1.1.4
Author | SHA1 | Date | |
---|---|---|---|
66e455534f | |||
9f8964bddd | |||
be867aca18 | |||
8f1412a348 | |||
b6cce50c8f | |||
0ffbf07634 | |||
c676f48ff4 | |||
920513356b | |||
9b21530532 | |||
bbfe2e7a6e | |||
136c3adf6c | |||
f04db99750 | |||
121b69159a | |||
be0d049ec5 | |||
de36d9b67f | |||
01c193c95b | |||
91b0a2aa8d | |||
9a616c30ac | |||
37a389c283 | |||
a1615087e9 | |||
adc3169e34 | |||
27c59a8f73 | |||
7df497747d | |||
076d5ad8b0 | |||
6cdbc1e680 | |||
c2fdd090cc | |||
73f9c94397 | |||
def75b5f34 | |||
bf011207da | |||
d9c18ad08d | |||
7cc669396e | |||
baf61c3aee | |||
44cdc02804 | |||
2d7ac24525 | |||
076d8d1eb8 | |||
8a67604efc | |||
9110f895d2 | |||
aac5928b92 | |||
d335e276a5 | |||
77e6101682 | |||
82a51f6c3f | |||
790850d4b1 | |||
7f1f7d16c4 | |||
6e6883c840 | |||
40b25b150f | |||
434fe78ee7 | |||
14a1af33f9 | |||
ada1b1114a | |||
daf7a078bd | |||
7a94e202f1 | |||
50bebf476d | |||
765e0c88cc | |||
8cecbc9aca | |||
21e5114e71 | |||
e532dcc7bc | |||
a9e1a6ffd6 | |||
1ef2ca5f2b | |||
d0b0684b47 | |||
019ca32721 | |||
fe1d451fe9 | |||
ffe287cd1e | |||
ed181cd4e4 | |||
92ef566e12 | |||
886388d919 | |||
ccde6bec7c | |||
846eec24d6 | |||
587987d019 | |||
2a5daec056 | |||
6bce4510d7 | |||
b418a57f01 | |||
eefda84832 | |||
54855eb89e | |||
feed351d0e | |||
73cfce131d | |||
c394fe3ea2 | |||
02a13e140f | |||
f33d3fedb3 | |||
8426577362 | |||
ff17e1e6dd | |||
392f6ba0a0 | |||
5b87ddb4cb | |||
ee260ecdee | |||
30d457a3fe | |||
92d0f9440c | |||
09cfd395d0 | |||
2f32e55e0f | |||
a481f41d1c | |||
b5a93f2de7 | |||
9d238f91e4 | |||
d3e0451631 | |||
e30bf90933 | |||
910b3511e5 | |||
12a24b169a | |||
cbc1a9723a | |||
364361e228 | |||
00fcf43a47 | |||
19daaa2b77 | |||
594b4a0ce3 | |||
d4c85696a8 | |||
2e6f3fb6fe | |||
18fee0eb2a | |||
08d46db86d | |||
506656f5e9 | |||
e1aa125c05 | |||
61c485fc10 | |||
ec37bd448c | |||
d6ddf8924c | |||
cca8143fb7 | |||
b6ff93b834 | |||
93dabe189e | |||
697b3c227d | |||
f79f3db3db | |||
63ce272077 | |||
4ca37c7255 | |||
b0eaa673fa | |||
8b95d59332 | |||
1d6d36488b | |||
0ad9ebf1a6 | |||
df87273ceb | |||
cbd20b1381 | |||
6fc4e161b0 | |||
d926357222 | |||
c4381dad52 | |||
3d68267083 | |||
bda34a1496 | |||
8b9cafefef | |||
96c3c3ddb3 | |||
805c43ac76 | |||
0ad0433554 | |||
7fd0fc3b77 | |||
0441eee147 | |||
072ba71c2d | |||
7918b6cd24 | |||
8cfd6308bb | |||
1466254129 | |||
0c8b8b86e5 | |||
cce878e51e | |||
90d62adfe7 | |||
1502f19b6c | |||
a68fb7847f | |||
6b0037001c | |||
3f58069723 | |||
53a2eb9c5b | |||
e0c75394a7 | |||
497cea0773 | |||
8a227d87e7 | |||
4e8175da49 | |||
9a9f294595 | |||
3a8f630e70 | |||
341f368e99 | |||
32290cbc05 | |||
26997b2e33 | |||
d80c454bbf | |||
d4822af890 | |||
d25886af9a | |||
4207cac165 | |||
e1ef1bd01e | |||
03f18b78d0 | |||
893f22611e | |||
3a6de23c66 | |||
c5caadac8b | |||
721dd08609 | |||
04697b8099 | |||
0db81a8545 | |||
9e7377c850 | |||
047955a1bb | |||
578097df1e | |||
86e16e949b | |||
321d9ae044 | |||
95ab0b811e | |||
03f55f8572 | |||
c808501c19 | |||
9c90c20734 | |||
1076ad2970 | |||
01d22b0390 | |||
2464eac517 | |||
03c417206d | |||
249f13b6ed | |||
8deeff4de8 | |||
ee56d3c86b | |||
7d2d5f7e3f | |||
a44ffcb6f5 | |||
53793b345e | |||
f6c8f28b97 | |||
fdccef6b53 | |||
d76591cc47 | |||
44904069a4 | |||
148af27ab9 | |||
6a8a32f96c | |||
dda797a82e | |||
e649703d1e | |||
d128826ad9 | |||
188f44b93a | |||
d25db0a6ef | |||
73090436d4 | |||
cf95cce64f | |||
e6ef2e456f | |||
a56e92b8c5 | |||
8d13cf71e6 | |||
73f0442b0d | |||
9b77004fbc | |||
cb8bbd6c53 | |||
4b44b023e9 | |||
2c0d8c90ab | |||
d30f7dbec6 | |||
d41b767ac0 | |||
73adaf89ee | |||
038b2023d8 | |||
fa31cb0df7 | |||
45cf24c6fa | |||
3c3e485ec9 | |||
14b32afd54 | |||
8a398c7233 | |||
2ee00d05a3 | |||
5d674abca7 | |||
c7a1e08afb | |||
5360404f82 | |||
f8a36b3fc9 | |||
8adba1d7c3 | |||
d2033fa31d | |||
ab7614756a | |||
ae5a98d905 | |||
0c785e1f3d | |||
0297b72137 | |||
1c9a35584a | |||
e4d18ca81e | |||
c8013f9844 | |||
611bbf8c5d | |||
43ab782677 | |||
4e822eb9c7 | |||
0cf025c018 | |||
701764f6d1 | |||
07a6b088d6 | |||
d388cf1c28 | |||
6e671c83e9 | |||
8befd096a7 | |||
e5236f5da8 | |||
1b235f5066 | |||
2269d57890 | |||
bf4e56a779 | |||
d417ba720e | |||
7b74d70074 | |||
e568763281 | |||
d18f3002af | |||
8a73fbcfde | |||
e832ab8610 | |||
bf6bcf6dda | |||
296c3d18bb | |||
04cff73883 | |||
e81c3f6222 | |||
fb527762ec | |||
c4739935cb | |||
7d4aac4a84 | |||
e0a754ff85 | |||
44757a2f15 | |||
6f7d084414 | |||
2027441330 | |||
966ffe7e66 | |||
cb3a532165 | |||
2a6e8d45bd | |||
98decf1e62 | |||
cdff498239 | |||
5209e791b9 | |||
248cc97e0b | |||
050b93514a | |||
88378b25af | |||
a1917d0014 | |||
b66456df67 | |||
2750798aef | |||
f2205528b5 | |||
de5750e41e | |||
54e65fa11e | |||
8f4c0e82ef | |||
3dc6d83db7 | |||
44f6e831dc | |||
3565aa36fd | |||
0beb5b9511 | |||
d0162610b1 | |||
e007f9e75c | |||
82998070d8 | |||
c7eba497f9 | |||
bcfd3d263e | |||
ac53aee292 | |||
d0015e78b9 | |||
f0d0ac6f2d | |||
d5d056f591 | |||
c1267230b2 | |||
38bc1c6884 | |||
a3b4272509 | |||
f9bba7313e | |||
96f5c87336 | |||
b2b68a44c3 | |||
c4c0fc061b | |||
5bd9690f0e | |||
161c8e5ccc | |||
4fd4026b93 | |||
e1ec71358e | |||
ac01ce83dd | |||
2babb12216 | |||
47ae2279bd | |||
ddc43668c3 | |||
b3e47da537 | |||
1d77ab8fbf | |||
224042206f | |||
c5a10bda04 | |||
92f0f89a40 | |||
add79ca00d | |||
4e7b3ce7ae | |||
a2cb083f42 | |||
369dc06429 | |||
6bf81b722f | |||
ad31b3eba0 | |||
356fd78f9a | |||
100f898d80 | |||
eeb763bcae | |||
2e1f9fa4f4 | |||
b62a9f269e | |||
0818711176 | |||
0527ba11c4 | |||
256db7fda1 | |||
59a8eed523 | |||
961e6c4859 | |||
57ab047e36 | |||
3027040b70 | |||
db7f9526fe | |||
dfa47196ba | |||
54ad5d37d0 | |||
03ab9bab8f | |||
d3a3874bec | |||
365ed088fc | |||
85805ee265 | |||
59154653db | |||
f319668212 | |||
96cc0a529c | |||
4bd8c8d136 | |||
b4268c4dc5 | |||
f6a3170907 | |||
cd606177c6 | |||
4d10375cb9 | |||
534f6f07fa | |||
64bb496591 | |||
ade292eb7c | |||
ac85550dac | |||
a27a1ae530 | |||
30e97c7e7a | |||
7bffde57fa | |||
32e3389739 | |||
d810dc7064 | |||
f28da0c7ce | |||
55d6788bb6 | |||
f3936045de | |||
f855071fb7 | |||
2492debddc | |||
3f4936519d | |||
be0b15a8e7 | |||
889b92d359 | |||
97fda364db | |||
0f82692494 | |||
872a23a59f | |||
8a6f217c42 | |||
87321c252d | |||
53a4ead6a0 | |||
dca54e8898 | |||
82005e6ded | |||
39931117f0 | |||
7e2d7e5997 | |||
37987ecfe6 | |||
31300231df | |||
cc30f4043b | |||
85288aeb8f | |||
ab65825117 | |||
230a0d6e19 | |||
6c6a0770a4 | |||
2f84695278 | |||
809c28e671 | |||
69909915df | |||
7ed67018b7 | |||
09cec3aa3d | |||
12341a9bf3 | |||
3c6db0ed4d | |||
65df49006f | |||
f2fc3957ce | |||
1412bf56a9 | |||
5b1701a5c0 | |||
c1bbeff43a | |||
9c1fc23901 | |||
f1b5626786 | |||
7e0165ff4c | |||
165c82c394 | |||
bda4601bd1 | |||
13842113f4 | |||
6442ca224b | |||
d11a83dd5e | |||
bcd18471bd | |||
1f8627086f | |||
153b41c64d | |||
11e0b38dbb | |||
c5855dd81d | |||
bcf7dc2131 | |||
a2a7240e6a | |||
97fb4807a5 | |||
514302d9ee | |||
bd81d5cd72 | |||
710ed4a135 | |||
1406459bd2 | |||
b367242329 | |||
3d57d19a90 | |||
59c60d410e | |||
84d2a2ba9d | |||
4b86308829 | |||
54878a538e | |||
4926c98dd4 | |||
686659514b | |||
2fe76f0f0e | |||
b2762cf5d8 | |||
e93f0527c4 | |||
fd0b9bb937 | |||
f860e24e58 | |||
be08aa8b5c | |||
2ffae83ef6 | |||
cd0d5ef4f6 | |||
52791831d3 | |||
d2716cc2b5 | |||
78e9d89fe4 | |||
a846f7434d | |||
5eb7841f06 | |||
88f37f2e93 | |||
2fdc41a357 | |||
c569b4d4ce | |||
2534999c0b | |||
4af50f44dd | |||
88f3ef358d | |||
03d2a82cac | |||
0280efe997 | |||
1764745ff3 | |||
b345056a2d | |||
570d5a0e22 | |||
82971d918e | |||
65d8419750 | |||
45c1c8a862 | |||
0f2b6f6c56 | |||
b537c4504e | |||
e993fcca49 | |||
8b75d736b3 | |||
dfeca624d6 | |||
6912ae8027 | |||
548c0c4efd | |||
d0bce05577 | |||
472d7610ad | |||
878931f788 | |||
e654e6399a | |||
1523d2bdd9 | |||
e8800be3d2 | |||
f211456214 | |||
08e112c687 | |||
cf49e83893 | |||
6968b72648 | |||
c69e553696 | |||
32b6ecd13d | |||
a660e9d38a | |||
c95e2c9d24 | |||
c8fcb2fb3d | |||
c1a24e71f1 | |||
0577b487d9 | |||
f7c8dbe10e | |||
060484494d | |||
a08a753967 | |||
ed27d542e0 | |||
52c641d93c | |||
1c1e86f168 | |||
ab8265b042 | |||
9c5b98ae5c | |||
5cc7fe5315 | |||
91f8c60f5b | |||
b9d8bbb9bb | |||
fcd2f36fb8 | |||
7a7f234b69 | |||
8c9c620700 | |||
558e2314ee | |||
d666142388 | |||
52988adee6 | |||
de078d2749 | |||
65ca294357 | |||
508adfd2f4 | |||
452c9685e7 | |||
39c3fc6da1 | |||
475e8fdea0 | |||
420535c275 | |||
9049784c1c | |||
963d139093 | |||
32ee757c91 | |||
cd74e84fb8 | |||
bae04a58a9 | |||
aed7a2cf05 | |||
df52dd1333 | |||
15a93611c6 | |||
4aa7c45c42 | |||
79bf6a4a4e | |||
58f4c2e9d6 | |||
e0754219aa | |||
700d1eaf7f | |||
cf986cf5d1 | |||
bf199a105c | |||
ed804db458 | |||
1ad7e71e24 | |||
37688470e1 | |||
26a6a24093 | |||
4642148e6f | |||
92b0079a23 | |||
0431d89738 | |||
08e439c48d | |||
ddecb74f6e | |||
435cd88e83 | |||
aae50b2d16 | |||
1ceb1097e1 | |||
b8788e5f9e | |||
b4be60ecb3 | |||
e0bb9195d8 | |||
96433fd145 | |||
c4c52cf0e9 | |||
be691d4f81 | |||
cb0f18cc0a | |||
5b386c57a3 | |||
2e447207a8 | |||
62e5f84fc5 | |||
509d00149f | |||
02e15f015f | |||
e492965b6e | |||
896d59c02e | |||
97740ad93d | |||
4f780339e1 | |||
01d89bd9bc | |||
56aecf2459 | |||
9b88d6220d | |||
7340920384 | |||
5f1eac8777 | |||
633cd2008d | |||
0b641cf425 | |||
77ff5f5cb9 | |||
59d873c385 | |||
8262c19e40 | |||
96455fcf56 | |||
ee4ba9d033 | |||
6e17a979e5 | |||
3cbf74b32e | |||
86fb1eb0cf | |||
3ef177f1c9 | |||
18f1f0a8f9 | |||
2e64464c7c | |||
4803a31fa4 | |||
9351707d83 | |||
03b709cb1f | |||
5427d7a8f2 | |||
4cdd884731 | |||
d50095d2a6 | |||
7ff3d65b9b | |||
70e52f1a0c | |||
4f53ed4630 | |||
1f3b601563 | |||
496fc70540 | |||
6ad24ea94b | |||
a08a54913b | |||
025d6f2ee6 | |||
65fdba8884 | |||
8ad6bff397 | |||
79feaa7fd5 | |||
4897fc74f1 | |||
07c2bb8421 | |||
692a675329 | |||
668e58761b | |||
82bff299ec | |||
75fc1989db | |||
da0d20731d | |||
06c84ae7b0 | |||
bc9d6ae59c | |||
9836991217 | |||
5ca5d2e34b | |||
64e43541db | |||
4dde2a206b | |||
f18e352251 | |||
f479c73940 | |||
9ddb91d3ea | |||
a7e8b474d7 | |||
6019f0fae1 | |||
b952833d17 | |||
cc92cbf239 | |||
aefa04dd6a | |||
5deefe053b | |||
5f798e535b | |||
2e7d10b6b7 | |||
d4872c7d83 | |||
32a7b0fd4d | |||
61e803a3a7 | |||
47d6c59b26 | |||
ae886b6154 | |||
b16dfb5cad | |||
caffd6c7da | |||
38e1dc8a22 | |||
25f1eab3ac | |||
b7030ca35b | |||
3ff054d60f | |||
3abcb244c7 | |||
97415e3f63 | |||
2e956586c1 | |||
e7992747e5 | |||
7019473212 | |||
0b175bab97 | |||
ba0871a814 | |||
399cbf6d66 | |||
55c8f1d964 | |||
82941f4c99 | |||
b70f5a9041 | |||
96ee0fae23 | |||
0159052d92 | |||
f46bcf9d5f | |||
e942108ad7 | |||
25460413ce | |||
9b788a2c32 | |||
0b263e8c78 | |||
851dd76849 | |||
5a3acfc41a | |||
147ef216ce | |||
c41c83b279 | |||
68dc026cf9 | |||
6f2aac75ce | |||
3bec7c5c77 | |||
4c81b329ef | |||
daebb44722 | |||
54a493f382 | |||
e4ef8c6582 | |||
d02bd410b3 | |||
7b4bd76d9b | |||
538b70068f | |||
d5583ce58c | |||
be11642977 | |||
4fd78f9049 | |||
d02d8642b9 | |||
b86abe8c65 | |||
41d0d1c03f | |||
4b3a671d27 | |||
aeaa715d8d | |||
641b696764 | |||
c2ff24cf89 | |||
b82abcf210 | |||
252a845f2b | |||
44310ae57e | |||
8d9d900608 | |||
06c1540797 | |||
cc672d525b | |||
8239d082ca | |||
d54efd4bc2 | |||
5af8ad46f4 | |||
9ce2aabe28 | |||
21bd5b5d42 | |||
0e755f48c9 | |||
4e4b789753 | |||
87ebfde08b | |||
4771254d1f | |||
689bcf0168 | |||
fb35f70c6e | |||
3d933149ff | |||
6c939780e8 | |||
d06c6e69f8 | |||
1c0ee8fc32 | |||
3ee02c766d | |||
bb16a5615f | |||
d78b29005d | |||
df685e89ac | |||
1942a636f3 | |||
050871e1f2 | |||
a58ca098b7 | |||
75f864a061 | |||
592424a420 | |||
f2ac46cbc0 | |||
04bd02972d | |||
7b9088f8c9 | |||
5272cc0afb | |||
4b59808ee3 | |||
31782dc75b | |||
ac463ac7a4 | |||
66efb225eb | |||
f0a9a0e29a | |||
6f371778c6 | |||
e57f8bf8f3 | |||
10233adb87 | |||
6ab8ffc137 | |||
5e8c60713a | |||
ad1c2fa1b8 | |||
cfd39f3d96 | |||
f38e4ff854 | |||
67139de9be | |||
26ac86f78a | |||
dc57c2bbb9 | |||
32b7c33e10 | |||
bd82bf66e3 | |||
bf24ba81c5 | |||
c54b5bc6a2 | |||
5a6024a1cc | |||
ec1cb90cba | |||
eb5639b017 | |||
cf8f6cb888 | |||
d1c2ec7a5b | |||
b20313f6a0 | |||
21b484f644 | |||
b511fe46aa | |||
c9e6c44be3 | |||
ed3eede4aa | |||
58f1bb249c | |||
2cda559ed9 | |||
e5e52cdf09 | |||
8f5d65aeef | |||
5633c228b1 | |||
97e4d35595 | |||
2de7a761eb | |||
569905e456 | |||
ee606de555 | |||
fd87b1b070 | |||
8a4698bd58 | |||
371bbde3c2 | |||
1b1ccc8a18 | |||
50373321dd | |||
576af43c98 | |||
673906b084 | |||
1482eb02f1 | |||
b69f1c5b66 | |||
e82b7005ad | |||
1402341264 | |||
bcc6a38094 | |||
d3f770827f | |||
5ac178ddda | |||
050059a388 | |||
afcc57f2c0 | |||
f8130af94e | |||
2bb5d973c3 | |||
8097dd57ab | |||
585075af1b | |||
bf20ca5dfb | |||
99e498057f | |||
a2b20e3ca2 | |||
9bbcc3118c | |||
4479f2fec6 | |||
d62d617f82 | |||
b2d7283f51 | |||
30615ac752 | |||
d38bd09987 | |||
c4cf1ced64 | |||
853d71b947 | |||
a411150abe | |||
ab84ae81e6 | |||
121d40e38c | |||
10ef2e346f | |||
7aae77f2ac | |||
83e41ceabd | |||
8bf6e31379 | |||
dea7b75549 | |||
e2ed639fec | |||
f103206221 | |||
6f7fd7faed | |||
3aa64bf40d | |||
19b5a64a3a | |||
38d296423b | |||
83216597c2 | |||
5b369d3c52 | |||
f4b46cf499 | |||
1a18491b03 | |||
270fdd77f2 | |||
3076ce56fb | |||
932a7e84e1 | |||
dfd0466291 | |||
8a3b4e2207 | |||
ee4f766c27 | |||
9832edf4a1 | |||
4c91872b2a | |||
f75d454b6a | |||
7b0c712719 | |||
ae874e4d5b | |||
4f7a2556bd | |||
45c12f0844 | |||
d1855c8895 | |||
fd0f3467ad | |||
642a2bc48e | |||
006fb7078e | |||
2bd7307dfa | |||
cc0ddbeb10 | |||
a65aa4f804 | |||
6f63c6388c | |||
1afe1443be | |||
df5d4a2f90 | |||
8d7df2b2ff | |||
24bbe47f18 | |||
7878f1f039 | |||
1e4e51edfe | |||
2fc5bf7849 | |||
d5e640d788 | |||
576af9ea89 | |||
214d6e6741 | |||
0c655d438e | |||
f68f875a6c | |||
13c327e370 | |||
3f42df50a3 | |||
9e78c78e43 | |||
99e2df2208 | |||
04c6625024 | |||
f68ee78352 | |||
b76161a698 | |||
2eec5bf40a | |||
2d11c253e3 | |||
a2a778c72f | |||
78fc4007ba | |||
27ba46494d | |||
0aec43a06a | |||
5656343e94 | |||
a08a616676 | |||
62777e93aa | |||
f4507fca34 | |||
4374d984d1 | |||
6a9c99cbd8 | |||
eec4dd9915 | |||
7ae90cc334 | |||
38e16d9370 | |||
91e0b07080 | |||
fe63ef9481 | |||
3451559feb | |||
829c0404c3 | |||
b353d04204 | |||
c139b45c26 | |||
2ee8fa58d7 | |||
60454fbf63 | |||
ccb22c3ef3 | |||
b4d9c81fe8 | |||
50e5349d09 | |||
d348c6dac6 | |||
ffbcb13040 | |||
7d389e0889 | |||
e7bde25551 | |||
bd18a89bc2 |
12
COPYRIGHT
12
COPYRIGHT
@ -1,16 +1,12 @@
|
||||
Mario Danic <mario.danic@gmail.com>,
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
libisoburn is Copyright (C) 2007-2010 Vreixo Formoso, Thomas Schmitt
|
||||
xorriso is Copyright (C) 2007-2010 Thomas Schmitt
|
||||
libisofs (if included) is Copyright (C) 2007-2010 Vreixo Formoso, Mario Danic
|
||||
libburn (if included) is Copyright (C) 2002-2006 Derek Foreman, Ben Jansens
|
||||
and Copyright (C) 2006-2010 Mario Danic, Thomas Schmitt
|
||||
|
||||
libisoburn is Copyright (C) 2007-2011 Vreixo Formoso, Thomas Schmitt
|
||||
xorriso is Copyright (C) 2007-2011 Thomas Schmitt
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 as
|
||||
published by the Free Software Foundation.
|
||||
it under the terms of the GNU General Public License version 2
|
||||
or later as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
481
ChangeLog
Normal file
481
ChangeLog
Normal file
@ -0,0 +1,481 @@
|
||||
libisoburn-1.1.4.tar.gz Sun Aug 7 2011
|
||||
===============================================================================
|
||||
* Bug fix: xorriso native mode on some drives wrote unreadble ISO images to CD
|
||||
* Bug fix: -assert_volid did not work. Regression since version 1.1.0.
|
||||
* Bug fix: -acl or -xattr worked with -extract only on Linux and FreeBSD
|
||||
* New option -device_links
|
||||
|
||||
libisoburn-1.1.2.tar.gz Fri Jul 8 2011
|
||||
===============================================================================
|
||||
* Bug fix: Since 1.0.6: Unreadable image produced by: xorrisofs ... >image.iso
|
||||
* Bug fix: -update_r scheduled non-existing files for hardlink update
|
||||
* Enabled extraction of the boot catalog file to disk filesystem
|
||||
* New option -list_speeds
|
||||
|
||||
GNU xorriso-1.1.0.pl01.tar.gz Mon Jun 20 2011
|
||||
===============================================================================
|
||||
* Bug fix: Due to a bug in libburn-1.1.0, GNU xorriso-1.1.0 compiled only
|
||||
on GNU/Linux, FreeBSD, and Solaris, but not on other systems.
|
||||
|
||||
libisoburn-1.1.0.tar.gz Sat Jun 18 2011
|
||||
===============================================================================
|
||||
* Bug fix: -mount_opts shared worked only with -osirrox o_excl_off
|
||||
* Bug fix: xorriso command -add_plainly "any" did not add all files to the image
|
||||
* Bug fix: The attempt to blank already blank DVD-RW was not gracefully blocked
|
||||
* Bug fix: -as mkisofs -isohybrid-mbr without -no-pad was not cylinder aligned
|
||||
* New option -signal_handling
|
||||
* New option -close_damaged
|
||||
* Dropped suffix .plXY from tarball name
|
||||
|
||||
libisoburn-1.0.8.pl00.tar.gz Thu Apr 14 2011
|
||||
===============================================================================
|
||||
* Bug fix: mkisofs emulation could ignore options (regression in 0.1.6)
|
||||
|
||||
libisoburn-1.0.6.pl00.tar.gz Sat Apr 9 2011
|
||||
===============================================================================
|
||||
* Bug fix: -as mkisofs padding did not work (regression in 1.0.4)
|
||||
* Bug fix: Options -gid and -uid had no effect
|
||||
* New API call isoburn_set_truncate()
|
||||
* New relax option isoburn_igopt_joliet_long_names
|
||||
* New option -early_stdio_test
|
||||
* New options -print_info and -print_mark
|
||||
* New -compliance option joliet_long_names
|
||||
* -as mkisofs option -joliet-long is now fully functional
|
||||
* Burning DVD-R DAO with 2 kB size granularity rather than 32 kB
|
||||
|
||||
libisoburn-1.0.4.pl00.tar.gz Thu Mar 10 2011
|
||||
===============================================================================
|
||||
libisoburn novelties:
|
||||
* New isoburn_ropt_set_extensions() option isoburn_ropt_nomd5tag
|
||||
xorriso novelties:
|
||||
* Bug fix: xorrisofs did not work under growisofs -M (version 1.0.0 was ok)
|
||||
* Bug fix: -as mkisofs -C attempted to read volume header of blank media
|
||||
* Bug fix: -as mkisofs -old-root did not work with -graft-points
|
||||
* Bug fix: -as mkisofs -partition_hd_cyl had no effect
|
||||
* Bug fix: -as mkisofs did not properly unescape target part of pathspecs
|
||||
* Bug fix: isohybrid image size was not aligned to cylinder boundary
|
||||
* Bug fix: Compilation without zlib failed
|
||||
* New -padding modes "included" and "appended"
|
||||
* New bootspec partition_cyl_align=, new -as mkisofs option -partition_cyl_align
|
||||
* New -as mkisofs and -as cdrecord option --no_rc
|
||||
* Own man page and info document for xorrisofs
|
||||
|
||||
libisoburn-1.0.2.pl00.tar.gz Mon Feb 23 2011
|
||||
===============================================================================
|
||||
libisoburn novelties:
|
||||
* Removed compiler obstacles of GNU xorriso on Solaris 9
|
||||
* New isoburn_igopt_set_extensions() option isoburn_igopt_old_empty
|
||||
xorriso novelties:
|
||||
* Bug fix: Images produced with -for_backup might be unreadable and
|
||||
also fail -check_md5 verification.
|
||||
* Bug fix: mkisofs emulation options -l , -full-iso9660-filenames did not work.
|
||||
* Bug fix: Option -mkdir yielded SIGSEGV due to a NULL pointer
|
||||
* Bug fix: ECMA-119 standards violation with Volume Descriptor Set Terminator
|
||||
* New options -clone and -cp_clone
|
||||
* New -find actions update_merge, rm_merge, clear_merge
|
||||
* New -as mkisofs option -max-iso9660-filenames
|
||||
* New -as mkisofs option --old-empty
|
||||
* New -as mkisofs options -root , -old-root
|
||||
* New -as mkisofs options --old-root-no-md5, --old-root-no-ino, --old-root-dev
|
||||
|
||||
libisoburn-1.0.0.pl00.tar.gz Mon Jan 17 2011
|
||||
===============================================================================
|
||||
libisoburn novelties:
|
||||
* New API call isoburn_igopt_set_untranslated_name_len()
|
||||
xorriso novelties:
|
||||
* Bug fix: -as mkisofs -print-size did not account for -partition_offset
|
||||
* Default -abort_on value is now "FAILURE" with batch and "NEVER" with dialog
|
||||
* New -compliance options untranslated_names , untranslated_name_len=
|
||||
* New -as mkisofs option -untranslated_name_len
|
||||
* New -compliance option iso_9660_1999, -as mkisofs option -iso-level 4
|
||||
* New -compliance option iso_9660_level=number
|
||||
* New -compliance option allow_dir_id_ext, -as mkisofs -disallow_dir_id_ext
|
||||
* Disabled TOC emulation with -as mkisofs. May be re-enabled by --emul-toc.
|
||||
|
||||
libisoburn-0.6.6.pl00.tar.gz Sun Dec 12 2010
|
||||
===============================================================================
|
||||
libisoburn novelties:
|
||||
* New API calls isoburn_igopt_set_disc_label(), isoburn_igopt_get_disc_label()
|
||||
* New API calls isoburn_ropt_set_displacement(), isoburn_ropt_get_displacement()
|
||||
xorriso novelties:
|
||||
* Bug fix: -as mkisofs -print-size printed the size but also produced ISO image
|
||||
* Build problem fix on Linux 2.4 in GNU xorriso libjte/checksum.c
|
||||
* New -as mkisofs option -joliet-long
|
||||
* New bootspec sparc_label=, new -as mkisofs options -sparc-boot , -sparc-label
|
||||
* New option -displacement
|
||||
|
||||
libisoburn-0.6.4.pl00.tar.gz Tue Oct 26 2010
|
||||
===============================================================================
|
||||
libisoburn novelties:
|
||||
* New API call isoburn_libjte_req()
|
||||
* New API calls isoburn_igopt_attach_jte() and isoburn_igopt_detach_jte()
|
||||
* New API call isoburn_igopt_set_tail_blocks()
|
||||
* New API call isoburn_libjte_req()
|
||||
xorriso novelties:
|
||||
* New option -jigdo
|
||||
* New -as mkisofs options -jigdo-* and -md5-list as of genisoimage
|
||||
* New -as mkisofs options -checksum_algorithm_iso, -checksum_algorithm_template
|
||||
* New bootspecs mips_path= and mipsel_path= for Debian MIPS releases
|
||||
* New -as mkisofs options -mips-boot and -mipsel-boot
|
||||
* New option -append_partition, -as mkisofs -append_partition
|
||||
|
||||
libisoburn-0.6.2.pl00.tar.gz Sat Sep 18 2010
|
||||
===============================================================================
|
||||
libisoburn novelties:
|
||||
* New API function isoburn_igopt_set_part_offset()
|
||||
* Hiding all non-API symbols from the linker by use of --version-script
|
||||
* Now with history of release notes in ./ChangeLog file.
|
||||
xorriso novelties:
|
||||
* Bug fix: Regression with -hardlinks and -compliance old_rr, 0.4.2, Aug 2009
|
||||
* New option -preparer_id, -as mkisofs options -p and -preparer
|
||||
* New -boot_image specifier emul_type=none|hard_disk|floppy
|
||||
* New boot_image boot specs partition_offset,partition_hd_cyl,partition_sec_hd
|
||||
* Made behavior of -as mkisofs with unknown options more similar to original
|
||||
* New -as mkisofs option -hard-disk-boot, enabled -b without -no-emul-boot
|
||||
* New -as mkisofs option -e from Fedora genisoimage
|
||||
* New -as mkisofs options -partition_offset,-partition_hd_cyl,-partition_sec_hd
|
||||
|
||||
libisoburn-0.6.0.pl00.tar.gz Fri Jul 02 2010
|
||||
===============================================================================
|
||||
libisoburn novelties:
|
||||
xorriso novelties:
|
||||
* New option -read_mkisofsrc interprets .mkisofsrc To be performed before -as
|
||||
mkisofs. Performed automatically with program alias name "xorrisofs".
|
||||
* Implemented -as mkisofs options -dir-mode, -file-mode, -abstract, -biblio,
|
||||
-copyright
|
||||
* Implemented -as mkisofs options -hide, -hide-joliet, -hide-list,
|
||||
-hide-joliet-list
|
||||
* New -as mkisofs option --boot-catalog-hide
|
||||
* New option -hide, -find action -hide, -find test -hidden
|
||||
* New -boot_image bootspec cat_hidden=on
|
||||
* New options -copyright_file , -biblio_file , -abstract_file
|
||||
* New find test -disk_name
|
||||
* Enabled use of libreadline on Solaris
|
||||
* Bug fix: -check_media patch_lba0= could install wrong image size
|
||||
* Bug fix: -as mkisofs option -volset was wrongly interpreted like -volid
|
||||
|
||||
libisoburn-0.5.8.pl00.tar.gz Mon Jun 14 2010
|
||||
===============================================================================
|
||||
libisoburn novelties:
|
||||
* xorriso source split into more modules, object code moved into libisoburn
|
||||
xorriso novelties:
|
||||
* New write extension option isoburn_igopt_no_emul_toc
|
||||
* New -compliance rule no_emul_toc, new -as mkisofs --no-emul-toc
|
||||
* Implemented -as cdrecord -V
|
||||
* Implemented -as mkisofs options -U, -N, -l, -d, -allow-lowercase
|
||||
|
||||
libisoburn-0.5.6.pl00.tar.gz Tue May 04 2010
|
||||
===============================================================================
|
||||
libisoburn novelties:
|
||||
xorriso novelties:
|
||||
* Allowing up to 32 boot images
|
||||
* New -boot_image bootspecs
|
||||
efi_path=, platform_id=, sel_crit=, id_string=, next
|
||||
* New -as mkisofs options --efi-boot, -eltorito-alt-boot
|
||||
|
||||
libisoburn-0.5.4.pl00.tar.gz Mon Apr 19 2010
|
||||
===============================================================================
|
||||
libisoburn novelties:
|
||||
* New API call isoburn_igopt_set_system_area()
|
||||
* New API call isoburn_igopt_set_pvd_times()
|
||||
* New isoburn_igopt_set_relaxed() options: only_iso_versions, no_j_force_dots
|
||||
xorriso novelties:
|
||||
* New -boot_image any system_area=, -as mkisofs option -G
|
||||
* New -boot_image grub partition_table=on, -as mkisofs --protective-msdos-label
|
||||
* New -boot_image isolinux partition_table=on, -as mkisofs -isohybrid-mbr
|
||||
* New option -volume_date, -as mkisofs --modification-date=
|
||||
* New -find action mkisofs_r,-as mkisofs -r
|
||||
* New -find action sort_weight, -as mkisofs --sort-weight
|
||||
* New -compliance options only_iso_version, no_j_force_dots avoid
|
||||
a bug in GRUB 1.96. They are default now.
|
||||
|
||||
libisoburn-0.5.2.pl00.tar.gz Tue Mar 30 2010
|
||||
===============================================================================
|
||||
xorriso novelties:
|
||||
* xorriso documentation is now based on a hybrid format of Texinfo and man-
|
||||
page. Copies included: .texi, .info, .1 (man page)
|
||||
|
||||
libisoburn-0.5.0.pl00.tar.gz Tue Feb 22 2010
|
||||
===============================================================================
|
||||
xorriso novelties:
|
||||
* The former xorriso-standalone project is now GNU xorriso under GPLv3+. This
|
||||
affects some documentation and the generator script, but not the license of
|
||||
libisoburn or its program xorriso.
|
||||
* Bug fix: xorriso -update_r could lead to SIGSEGV if applied to a data file
|
||||
rather than a directory.
|
||||
* Bug fix on FreeBSD: xorriso could leave the drive tray locked.
|
||||
* New option -scsi_log
|
||||
|
||||
libisoburn-0.4.8.pl00.tar.gz Tue Jan 26 2010
|
||||
===============================================================================
|
||||
xorriso novelties:
|
||||
* Bug fix: xorriso did not blank CD-RW with images that were prepared
|
||||
on hard disk.
|
||||
* New configure option --enable-libcdio for system adapter to libcdio-0.83git
|
||||
|
||||
libisoburn-0.4.6.pl00.tar.gz Wed Dec 09 2009
|
||||
===============================================================================
|
||||
xorriso novelties:
|
||||
* New options -dvd_obs and -stdio_sync
|
||||
* New configure option --enable-dvd-obs-64k
|
||||
|
||||
libisoburn-0.4.4.pl00.tar.gz Wed Oct 28 2009
|
||||
===============================================================================
|
||||
xorriso novelties:
|
||||
* Bug fix: With -as cdrecord : -xa1 and -xamix were ignored although they do
|
||||
matter.
|
||||
* Option -toc now reports the individual media type. E.g. with a DVD+RW:
|
||||
"Media product: RICOHJPN/W11/49 , Ricoh Company Limited"
|
||||
* New option -pvd_info displays image id strings. New options -system_id , -
|
||||
volset_id allow to set such image id strings.
|
||||
* New option -mount_opts tries to circumvent an eventual ban to mount the same
|
||||
device twice. Some Linux systems allow to mount two sessions of the same
|
||||
media only if they get fooled via the loop device.
|
||||
* New option -scdbackup_tag performs the task of the scdbackup MD5 checksum
|
||||
filter inside xorriso.
|
||||
Already fixed by patch releases of xorriso-0.4.2:
|
||||
* Bug fix: -cut_out deleted previously cut-out pieces of the same file
|
||||
* Bug fix libisofs: Filenames could lose blanks during a multi-session cycle
|
||||
* Bug fix: -for_backup did not enable -xattr and -md5 if no drive was chosen
|
||||
yet
|
||||
* Bug fix: xorrisofs -help, xorrecord -help displayed original xorriso -help
|
||||
|
||||
libisoburn-0.4.2.pl02.tar.gz Thu Oct 08 2009
|
||||
===============================================================================
|
||||
* Bug fix: -for_backup did not enable -xattr and -md5 if no drive was chosen
|
||||
yet
|
||||
* Bug fix: xorrisofs -help, xorrecord -help displayed original xorriso -help
|
||||
|
||||
Libisoburn 0.4.2.pl01
|
||||
===============================================================================
|
||||
* Bug fix: xorriso option -cut_out deleted previously cut-out pieces of the
|
||||
same file. The bug was introduced with release 0.1.4 in March 2008.
|
||||
|
||||
Libisoburn 0.4.2
|
||||
===============================================================================
|
||||
* New write options isoburn_igopt_session_md5, isoburn_igopt_file_md5,
|
||||
isoburn_igopt_file_stability allow to record MD5 checksums of session and
|
||||
single data files.
|
||||
* New read option isoburn_ropt_nomd5 allows to read those MD5 sums when
|
||||
importing an ISO image.
|
||||
xorriso novelties:
|
||||
* New option -md5, new -as mkisofs option --md5 allow to record in the image
|
||||
MD5 checksums for the whole session and for each single data file.
|
||||
* New options -check_md5, -check_md5_r allow to verify the whole session or
|
||||
single files by comparing their image data with their MD5 sums.
|
||||
* Options -compare, -compare_r, -update, update_r now can use recorded MD5.
|
||||
* New -find actions check_md5, get_md5, make_md5 allow to check, to display or
|
||||
to recompute MD5 checksums of data files. New find test -has_md5
|
||||
distinguishes data files which have recorded MD5 from files which have none.
|
||||
* New -find test -has_any_xattr and action get_any_xattr allow to inspect the
|
||||
libisofs specific attributes of namespace "isofs".
|
||||
* Options -lsl and lsdl now display correct link counts if -hardlinks is on.
|
||||
* New option -calm_drive allows to reduce drive noise if no data reading is
|
||||
intended for a while.
|
||||
* New option -list_profiles allows to inquire and process the list of supported
|
||||
media types.
|
||||
* Bug fix: xorriso -as mkisofs did not understand the -C option of growisofs
|
||||
any more. (Already fixed by release 0.4.0.pl01, 20 Jul 2009)
|
||||
|
||||
libisoburn-0.4.0.pl01.tar.gz Mon Jul 20 2009
|
||||
===============================================================================
|
||||
xorriso novelties:
|
||||
* New option -hardlinks enables recording and restoring of hard link relations.
|
||||
* Improved reading performance with -update_r and -extract.
|
||||
* New option -for_backup as shortcut for -acl -xattr -hardlinks
|
||||
* Operators with option -find : -not, -or, -and, (, ), -if, -then, -else
|
||||
* New -find tests -wholename, -prune
|
||||
* Bug fix: SIGSEGV with option -status and no search string
|
||||
* Bug fix: -load volid did not perform pattern search
|
||||
* Bug fix: Copies of overwriteable media on sequential were mistaken in ROM
|
||||
drives
|
||||
Libisoburn 0.4.0.pl01 release notes:
|
||||
* Bug fix: xorriso -as mkisofs did not understand the -C option of growisofs
|
||||
any more
|
||||
|
||||
libisoburn-0.3.8.pl00.tar.gz Sun Apr 19 2009
|
||||
===============================================================================
|
||||
libisoburn novelties:
|
||||
* New API calls isoburn_ropt_set_auto_incharset() and
|
||||
isoburn_ropt_get_auto_incharset()
|
||||
xorriso novelties:
|
||||
* New options -set_filter, -set_filter_r, -find -exec set_filter allow to
|
||||
manipulate the content of data files on the fly.
|
||||
* New option -zisofs, built-in filters --zisofs , --gzip , --gunzip enable
|
||||
compression and decompression of data file content.
|
||||
* New options -external_filter , -unregister_filter, -close_filter_list allow
|
||||
arbitrary external processes to do content filtering.
|
||||
* New options -show_stream, -show_stream_r allow to inspect the origin and the
|
||||
filters of data files in an emerging image.
|
||||
* New option -auto_charset based on xattr "isofs.cs" allows to tag an ISO
|
||||
filesystem image with the character set name that is in use on the current
|
||||
terminal.
|
||||
|
||||
libisoburn-0.3.6.pl00.tar.gz Mon Mar 16 2009
|
||||
===============================================================================
|
||||
xorriso novelties:
|
||||
* Dummy MMC adapter of libburn allows compilation on systems other than Linux,
|
||||
FreeBSD
|
||||
* Default of -compliance has been changed to "old_rr", new rule "new_rr"
|
||||
* New -stream_recording modes with start address or "data". "on" is now 32s.
|
||||
|
||||
libisoburn-0.3.4.pl00.tar.gz Sun Mar 01 2009
|
||||
===============================================================================
|
||||
* New isoburn_read_opts values: isoburn_ropt_noaaip, isoburn_ropt_noacl,
|
||||
isoburn_ropt_noea
|
||||
xorriso novelties:
|
||||
* New option -acl enables ACL import and export
|
||||
* New options -getfacl, -getfacl_r, -setfacl, -setfacl_r, -setfacl_list
|
||||
* New find tests -has_acl, -has_no_acl , new find actions getfacl, setfacl
|
||||
* New option -xattr enables import and export of Extended Attributes
|
||||
* New options -getfattr, -getfattr_r, -setfattr, -setfattr_r, -setfattr_list
|
||||
* New find tests -has_xattr, -has_aaip, new find actions getfattr, setfattr
|
||||
* New -as mkisofs options --acl and --xattr
|
||||
* New option -disk_dev_ino accelerates incremental backups
|
||||
|
||||
libisoburn-0.3.2.pl00.tar.gz Tue Jan 06 2009
|
||||
===============================================================================
|
||||
* New API function isoburn_get_mount_params()
|
||||
* Now depending on libburn-0.6.0 which supports BD-R media
|
||||
xorriso novelties:
|
||||
* Bug fix: Options -extract and -extract_single were enabled with -osirrox off
|
||||
* New options -mount , -mount_cmd , -session_string
|
||||
* New -format modes by_size_ and fast_by_size_
|
||||
* New option -assert_volid
|
||||
* New option -drive_class for safety management of pseudo-drive access
|
||||
|
||||
libisoburn-0.3.0.pl00.tar.gz Tue Dec 2 2008
|
||||
===============================================================================
|
||||
* Now depending on libisofs-0.6.12 and libburn-0.5.6 to ensure use of their
|
||||
recent bug fixes
|
||||
xorriso novelties:
|
||||
* New options -quoted_path_list, -quoted_not_list
|
||||
* New option -backslash_codes for weird file names and terminal safety
|
||||
* New options -charset, -in_charset, -out_charset
|
||||
* New option -local_charset allows to override locale
|
||||
* New option -application_id
|
||||
* New option -compliance allows certain deviations from standards
|
||||
* Suitable ISOLINUX boot images are made alternatively bootable via an MBR
|
||||
* Bug fix: Forgot exit value registration to -return_with.
|
||||
Thanks to Steve Dodd.
|
||||
* Bug fix: -format as_needed did not recognize unformatted BD-RE
|
||||
* Bug fix: disk patterns with relative addresses were not properly resolved
|
||||
|
||||
libisoburn-0.2.8.pl00.tar.gz Wed Oct 15 2008
|
||||
===============================================================================
|
||||
* Now depending on libisofs-0.6.10 and libburn-0.5.4 to ensure use of their
|
||||
recent bug fixes
|
||||
xorriso novelties:
|
||||
* Ability to write and maintain bootable ISO images based on ISOLINUX
|
||||
* New ./configure option --disable-libreadline to make binary more portable
|
||||
* Bug fix: -as mkisofs -iso-level was accused to be an unknown option
|
||||
* Bug fix: -follow link attributed random target filenames to looping links
|
||||
|
||||
libisoburn-0.2.6.pl00.tar.gz Sat Sep 20 2008
|
||||
===============================================================================
|
||||
xorriso novelties:
|
||||
* Capability to insert and extract files far larger than 4 GB
|
||||
* New option -file_size_limit, -as mkisofs now supports -iso-level 1 to 3
|
||||
* New option -extract_cut
|
||||
* New -error_behavior "file_extraction" behavior "best_effort"
|
||||
* New option -check_media_defaults
|
||||
* New option -list_delimiter
|
||||
* Bug fix: -format full did not re-format already formatted DVD+RW
|
||||
|
||||
libisoburn-0.2.4.pl00.tar.gz Mo Aug 25 2008
|
||||
===============================================================================
|
||||
xorriso novelties:
|
||||
* New option -check_media
|
||||
* New -find test -damaged, new -find actions "report_damage", "report_lba"
|
||||
* New -error_behavior occasion "file_extraction"
|
||||
|
||||
libisoburn-0.2.2.pl01.tar.gz Fr Jul 25 2008
|
||||
===============================================================================
|
||||
Libisoburn 0.2.2 release notes (Jul 19 2008)
|
||||
* New API function isoburn_prepare_blind_grow()
|
||||
* New flag bits with isoburn_set_msc1(), isoburn_read_iso_head()
|
||||
xorriso novelties:
|
||||
* New option -grow_blindly
|
||||
* Options -C and -M for -as mkisofs emulation
|
||||
* Options for -as cdrecord emulation: -multi, -msinfo, -isosize, tsize, --
|
||||
grow_overwriteable_iso, write_start_address,
|
||||
* New option -pacifier, more compatible pacifier with -as mkisofs
|
||||
* make install creates aliases as symbolic links: osirrox, xorrisofs, xorrecord
|
||||
* Can serve growisofs if started as xorrisofs, genisofs, mkisofs, genisoimage
|
||||
pl01 changes (Jul 25 2008):
|
||||
* Bug fix: Variable DESTDIR was not properly respected during make install
|
||||
|
||||
libisoburn-0.2.0.pl00.tar.gz Mon Jun 23 2008
|
||||
===============================================================================
|
||||
Libisoburn 0.2.0 release notes:
|
||||
* New API functions isoburn_set_msgs_submit(), isoburn_drive_set_msgs_submit()
|
||||
xorriso novelties:
|
||||
* Bug fix: -chmod unintentionally performed o-x as first operation
|
||||
* New options -cpax, -cp_rx, -cp_rax, -extract to restore files and trees from
|
||||
ISO image to disk filesystem.
|
||||
* New option -paste_in to copy ISO files into parts of disk files
|
||||
* New options -map_l, -compare_l, -update_l, -extract_l
|
||||
|
||||
libisoburn-0.1.8.pl00.tar.gz Tue Jun 3 2008
|
||||
===============================================================================
|
||||
* Bug fix: Major,minor numbers of device files appeared as 0,1 in next session
|
||||
* Bug fix: modifying to overwriteable target yielded unmountable results
|
||||
xorriso novelties:
|
||||
* New option -stream_recording for full speed with DVD-RAM and BD-RE
|
||||
* New options -osirrox and -cpx allow to extract single files from ISO image
|
||||
|
||||
libisoburn-0.1.6.pl00.tar.gz Mon May 19 2008
|
||||
===============================================================================
|
||||
* Support for BD-RE (by depending on libburn-0.4.8)
|
||||
* New API wrapper calls isoburn_toc_*() around libburn TOC inquiry calls
|
||||
* New API call isoburn_read_iso_head() identifies ISO 9660 filesystems
|
||||
* New API call isoburn_set_msc1() (like mount -o sbsector=)
|
||||
xorriso novelties:
|
||||
* Bug fix: -update_r and others did not work properly with relative paths
|
||||
* New options -map and -map_single
|
||||
* New options -not_paths, -not_leaf, -not_list, -not_mgt, -as mkisofs -m
|
||||
* Emulated -toc on overwriteable media, new -toc layout with volume id
|
||||
* New option -load makes alternative sessions accessible
|
||||
* New -blank and -format modes 'as_needed'
|
||||
* New option -list_formats and -format mode 'by_index_'
|
||||
|
||||
libisoburn-0.1.4.pl00.tar.gz Wed Apr 30 2008
|
||||
===============================================================================
|
||||
* Improved performance with reading directory trees
|
||||
* xorriso: Improved attribute transfer from disk for target
|
||||
* xorriso: Incremental backup functionality by new option -update_r
|
||||
* xorriso: Options -cut_out and split_size map byte intervals of oversized
|
||||
files into ISO files
|
||||
* xorriso: Emulation of some basic mkisofs and cdrecord options
|
||||
* Dynamically linkable with release version 0.6.4 of libisofs
|
||||
|
||||
Version 0.1.2 was not released as libisoburn
|
||||
but only as xorriso standalone version. Wed Mar 12 2008
|
||||
===============================================================================
|
||||
* Bug fix: -report_about HINT or higher did not report at all
|
||||
* Bug fix: speed=number without unit or media type letter was always CD speed
|
||||
* Bug fix: it was possible to write to appendable media which was not -indev
|
||||
* Bug fix: -follow param did not work for adding non-directory symbolic links
|
||||
* Bug fix: It was not possible to -add /THIS=a /b=THIS
|
||||
* Improved attribute transfer from disk for implicit target directories
|
||||
* New option -as "cdrecord" emulates a narrow set of cdrecord gestures
|
||||
* New option -as "mkisofs" emulates a narrow set of mkisofs gestures
|
||||
* New option -publisher
|
||||
* New option -errfile_log
|
||||
* Support for DVD+R/DL media
|
||||
* New options -compare, -compare_r and according -find -exec action
|
||||
* New options -update, -update_r and according -find -exec action
|
||||
* New -find actions "rm", "rm_r", new -findx -type "m" -exec "empty_iso_dir"
|
||||
* New option -cut_out
|
||||
|
||||
libisoburn-0.1.0.pl01.tar.gz Fri Feb 15 2008
|
||||
===============================================================================
|
||||
* Initial release of libisoburn/xorriso
|
||||
* libisoburn connects libisofs and libburn
|
||||
* libisoburn emulates multi-session on media without session history
|
||||
* xorriso is an integrated multi-session tool for ISO 9660 Rock Ridge images
|
||||
* due to a subtle mistake in ABI usage with libisofs this release had to be
|
||||
restricted to dynamic linking with exactly libisofs-0.6.2 where the mistake
|
||||
does no harm. A version of libisoburn which is open to all future libisofs
|
||||
versions will be released shortly after libisofs.0.6.4.
|
||||
|
111
Makefile.am
111
Makefile.am
@ -6,6 +6,7 @@ pkgconfigdir=$(LIBBURNIA_PKGCONFDIR)
|
||||
libincludedir=$(includedir)/libisoburn
|
||||
|
||||
lib_LTLIBRARIES = libisoburn/libisoburn.la
|
||||
ACLOCAL_AMFLAGS = -I ./
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
@ -13,12 +14,65 @@ lib_LTLIBRARIES = libisoburn/libisoburn.la
|
||||
libisoburn_libisoburn_la_LDFLAGS = \
|
||||
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
||||
libisoburn_libisoburn_la_SOURCES = \
|
||||
libisoburn/isoburn.h \
|
||||
libisoburn/libisoburn.h \
|
||||
libisoburn/burn_wrap.c \
|
||||
libisoburn/data_source.c \
|
||||
libisoburn/isoburn.c \
|
||||
libisoburn/isoburn.h \
|
||||
libisoburn/isofs_wrap.c \
|
||||
libisoburn/libisoburn.h \
|
||||
\
|
||||
xorriso/xorriso.h \
|
||||
xorriso/xorriso_private.h \
|
||||
xorriso/sfile.h \
|
||||
xorriso/sfile.c \
|
||||
xorriso/aux_objects.h \
|
||||
xorriso/aux_objects.c \
|
||||
xorriso/findjob.h \
|
||||
xorriso/findjob.c \
|
||||
xorriso/check_media.h \
|
||||
xorriso/check_media.c \
|
||||
xorriso/misc_funct.h \
|
||||
xorriso/misc_funct.c \
|
||||
xorriso/text_io.h \
|
||||
xorriso/text_io.c \
|
||||
xorriso/match.h \
|
||||
xorriso/match.c \
|
||||
xorriso/emulators.h \
|
||||
xorriso/emulators.c \
|
||||
xorriso/disk_ops.h \
|
||||
xorriso/disk_ops.c \
|
||||
xorriso/cmp_update.h \
|
||||
xorriso/cmp_update.c \
|
||||
xorriso/parse_exec.h \
|
||||
xorriso/parse_exec.c \
|
||||
xorriso/opts_a_c.c \
|
||||
xorriso/opts_d_h.c \
|
||||
xorriso/opts_i_o.c \
|
||||
xorriso/opts_p_z.c \
|
||||
\
|
||||
xorriso/xorrisoburn.h \
|
||||
xorriso/base_obj.h \
|
||||
xorriso/base_obj.c \
|
||||
xorriso/lib_mgt.h \
|
||||
xorriso/lib_mgt.c \
|
||||
xorriso/sort_cmp.h \
|
||||
xorriso/sort_cmp.c \
|
||||
xorriso/drive_mgt.h \
|
||||
xorriso/drive_mgt.c \
|
||||
xorriso/iso_img.h \
|
||||
xorriso/iso_img.c \
|
||||
xorriso/iso_tree.h \
|
||||
xorriso/iso_tree.c \
|
||||
xorriso/iso_manip.h \
|
||||
xorriso/iso_manip.c \
|
||||
xorriso/write_run.h \
|
||||
xorriso/write_run.c \
|
||||
xorriso/read_run.h \
|
||||
xorriso/read_run.c \
|
||||
xorriso/filters.h \
|
||||
xorriso/filters.c \
|
||||
xorriso/xorriso_timestamp.h \
|
||||
xorriso/xorriso_buildstamp.h \
|
||||
version.h
|
||||
|
||||
libisoburn_libisoburn_la_LIBADD = \
|
||||
@ -26,7 +80,12 @@ libisoburn_libisoburn_la_LIBADD = \
|
||||
-lburn
|
||||
|
||||
libinclude_HEADERS = \
|
||||
libisoburn/libisoburn.h
|
||||
libisoburn/libisoburn.h \
|
||||
xorriso/xorriso.h
|
||||
|
||||
# libisoburn_libisoburn_la_CFLAGS = $(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
|
||||
# $(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF) \
|
||||
# $(XORRISO_DVD_OBS_64K)
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
@ -50,22 +109,16 @@ bin_PROGRAMS = \
|
||||
# cat xorriso/xorriso_buildstamp.h
|
||||
|
||||
xorriso_xorriso_CPPFLAGS = -Ilibisoburn
|
||||
xorriso_xorriso_CFLAGS = -DXorriso_with_maiN \
|
||||
$(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
|
||||
$(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF) \
|
||||
$(XORRISO_DVD_OBS_64K)
|
||||
# xorriso_xorriso_CFLAGS = $(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
|
||||
# $(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF) \
|
||||
# $(XORRISO_DVD_OBS_64K)
|
||||
|
||||
xorriso_xorriso_LDADD = libisoburn/libisoburn.la -lisofs -lburn \
|
||||
$(THREAD_LIBS) $(LIBBURN_ARCH_LIBS)
|
||||
|
||||
xorriso_xorriso_SOURCES = \
|
||||
xorriso/xorriso.h \
|
||||
xorriso/xorriso_private.h \
|
||||
xorriso/xorriso.c \
|
||||
xorriso/xorrisoburn.h \
|
||||
xorriso/xorrisoburn.c \
|
||||
xorriso/xorriso_timestamp.h \
|
||||
xorriso/xorriso_buildstamp.h
|
||||
xorriso/xorriso_main.c
|
||||
|
||||
|
||||
# Install symbolic links to the xorriso binary
|
||||
@ -77,6 +130,7 @@ install-exec-hook:
|
||||
ln -s xorriso "$(DESTDIR)$(bindir)"/osirrox
|
||||
if test -e "$(DESTDIR)$(bindir)"/xorrecord ; then rm "$(DESTDIR)$(bindir)"/xorrecord ; else echo ; fi
|
||||
ln -s xorriso "$(DESTDIR)$(bindir)"/xorrecord
|
||||
$(LIBBURNIA_LDCONFIG_CMD) "$(DESTDIR)$(libdir)" || echo 'NOTE: Explicite dynamic library configuration failed. If needed, configure manually for:' "$(DESTDIR)$(libdir)"
|
||||
|
||||
|
||||
# Alternative to the disabled .PHONY above.
|
||||
@ -92,9 +146,10 @@ buildstamped: buildstamp
|
||||
|
||||
|
||||
|
||||
## Build test applications
|
||||
## Build companion applications
|
||||
noinst_PROGRAMS = \
|
||||
test/compare_file
|
||||
test/compare_file \
|
||||
xorriso/make_xorriso_1
|
||||
|
||||
# A program to compare two files in mirrored trees in mounted filesystems
|
||||
# To compare tree /media/dvd and /original/dir :
|
||||
@ -105,6 +160,12 @@ test_compare_file_CFLAGS =
|
||||
test_compare_file_LDADD =
|
||||
test_compare_file_SOURCES = test/compare_file.c
|
||||
|
||||
# Specialized converter from xorriso/xorriso.texi to xorriso/xorriso.1
|
||||
#
|
||||
xorriso_make_xorriso_1_CPPFLAGS =
|
||||
xorriso_make_xorriso_1_CFLAGS =
|
||||
xorriso_make_xorriso_1_LDADD =
|
||||
xorriso_make_xorriso_1_SOURCES = xorriso/make_xorriso_1.c
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
@ -124,7 +185,9 @@ doc/html: doc/doxygen.conf
|
||||
doc-upload: doc/html
|
||||
scp -r $</* $(webhost):$(webpath)
|
||||
|
||||
all: doc
|
||||
## Not by default any more.
|
||||
## It is unclear who is supposed to create file ./doc/doc.lock
|
||||
# all: doc
|
||||
|
||||
install-data-local:
|
||||
if [ -f ./doc/doc.lock ]; then \
|
||||
@ -157,21 +220,33 @@ indent: $(indent_files)
|
||||
nodist_pkgconfig_DATA = \
|
||||
libisoburn-1.pc
|
||||
|
||||
man_MANS = xorriso/xorriso.1
|
||||
man_MANS = \
|
||||
xorriso/xorriso.1 \
|
||||
xorriso/xorrisofs.1
|
||||
|
||||
info_TEXINFOS = \
|
||||
xorriso/xorriso.texi \
|
||||
xorriso/xorrisofs.texi
|
||||
|
||||
EXTRA_DIST = \
|
||||
libisoburn-1.pc.in \
|
||||
version.h.in \
|
||||
doc/comments \
|
||||
doc/doxygen.conf.in \
|
||||
doc/partition_offset.wiki \
|
||||
doc/startup_file.txt \
|
||||
README \
|
||||
AUTHORS \
|
||||
CONTRIBUTORS \
|
||||
COPYRIGHT \
|
||||
COPYING \
|
||||
INSTALL \
|
||||
ChangeLog \
|
||||
libisoburn/libisoburn.ver \
|
||||
xorriso/changelog.txt \
|
||||
xorriso/xorriso_buildstamp_none.h \
|
||||
xorriso/README \
|
||||
xorriso/README_gnu_xorriso \
|
||||
xorriso/make_docs.sh \
|
||||
$(man_MANS)
|
||||
|
||||
|
||||
|
114
README
114
README
@ -1,11 +1,11 @@
|
||||
------------------------------------------------------------------------------
|
||||
http:libburnia-project.org
|
||||
------------------------------------------------------------------------------
|
||||
libisoburn. By Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
libisoburn and xorriso. By Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Integrated sub project of libburnia-project.org.
|
||||
http://files.libburnia-project.org/releases/libisoburn-0.4.8.pl00.tar.gz
|
||||
Copyright (C) 2006-2010 Vreixo Formoso, Thomas Schmitt.
|
||||
http://files.libburnia-project.org/releases/libisoburn-1.1.4.tar.gz
|
||||
Copyright (C) 2006-2011 Vreixo Formoso, Thomas Schmitt.
|
||||
Provided under GPL version 2 or later.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
@ -18,8 +18,13 @@ The price for that is thorough specialization on data files in ISO-9660
|
||||
filesystem images. So libisoburn is not suitable for audio (CD-DA) or any
|
||||
other CD layout which does not entirely consist of ISO-9660 sessions.
|
||||
|
||||
Currently it is fully supported on Linux with kernels >= 2.4 and on
|
||||
FreeBSD versions with ATAPI/CAM support enabled in the kernel, see atapicam(4).
|
||||
xorriso is an application of libisoburn, libisofs, and libburn, which reads
|
||||
commands from program arguments, files, stdin, or readline.
|
||||
Its features are also available via a C language API of libisoburn.
|
||||
|
||||
Currently they are fully supported on Linux with kernels >= 2.4,
|
||||
on FreeBSD with ATAPI/CAM support enabled in the kernel, see atapicam(4),
|
||||
and on OpenSolaris (tested with kernel 5.11).
|
||||
On other X/Open compliant systems libburn will only offer POSIX i/o with disk
|
||||
file objects, but no direct MMC operation on CD/DVD/BD drives.
|
||||
|
||||
@ -29,17 +34,17 @@ By using this software you agree to the disclaimer at the end of this text:
|
||||
|
||||
Compilation, First Glimpse, Installation
|
||||
|
||||
Dynamic library and compile time header requirements for libisoburn-0.4.8 :
|
||||
- libburn.so.4 , version libburn-0.7.6 or higher
|
||||
- libisofs.so.6 , version libisofs-0.6.26 or higher
|
||||
Dynamic library and compile time header requirements for libisoburn-1.1.4 :
|
||||
- libburn.so.4 , version libburn-1.1.4 or higher
|
||||
- libisofs.so.6 , version libisofs-1.1.4 or higher
|
||||
libisoburn and xorriso will not start with libraries which are older than their
|
||||
headers seen at compile time.
|
||||
include headers seen at compile time.
|
||||
|
||||
Obtain libisoburn-0.4.8.pl00.tar.gz, take it to a directory of your choice
|
||||
Obtain libisoburn-1.1.4.tar.gz, take it to a directory of your choice
|
||||
and do:
|
||||
|
||||
tar xzf libisoburn-0.4.8.pl00.tar.gz
|
||||
cd libisoburn-0.4.8
|
||||
tar xzf libisoburn-1.1.4.tar.gz
|
||||
cd libisoburn-1.1.4
|
||||
|
||||
Within that directory execute:
|
||||
|
||||
@ -50,24 +55,33 @@ Then become superuser and execute
|
||||
make install
|
||||
which will make available libisoburn.so.1 and the program xorriso.
|
||||
|
||||
For the API concepts and calls see
|
||||
./libisoburn/libisoburn.h
|
||||
as well as
|
||||
/usr/lib/libisofs/libisofs.h
|
||||
/usr/lib/libburn/libburn.h
|
||||
On GNU/Linux it will try to run program ldconfig with the library installation
|
||||
directory as only argument. Failure to do so will not abort installation.
|
||||
One may disable ldconfig by ./configure option --disable-ldconfig-at-install .
|
||||
|
||||
|
||||
By use of a version script, the libisoburn.so library exposes no other function
|
||||
names but those of the API definitions in <libisoburn/libisoburn.h> and
|
||||
<libisoburn/xorriso.h>.
|
||||
If -Wl,--version-script=... makes problems with the local compiler, then
|
||||
disable this encapsulation feature by
|
||||
./configure --disable-versioned-libs
|
||||
make clean ; make
|
||||
|
||||
|
||||
xorriso
|
||||
|
||||
libisoburn comes with a command line and dialog application named xorriso,
|
||||
which offers a substantial part of libisoburn features to shell scripts and
|
||||
users. Its file xorriso/README describes a standalone tarball as first
|
||||
preference for statically linked xorriso installation.
|
||||
users. Its file xorriso/README_gnu_xorriso describes the tarball of the
|
||||
derived package GNU xorriso as first preference for a statically linked
|
||||
xorriso installation.
|
||||
The libisoburn installation described above produces a dynamically linked
|
||||
xorriso binary depending on libburn.so, libisofs.so, libisoburn.so.
|
||||
|
||||
After installation documentation is available via
|
||||
man xorriso
|
||||
man xorrisofs
|
||||
|
||||
Several alias links point to the xorriso binary:
|
||||
xorrisofs starts xorriso with -as mkisofs emulation already enabled
|
||||
@ -83,6 +97,7 @@ Other deliberate dependency reduction options of ./configure are:
|
||||
--disable-libacl avoid use of ACL functions like acl_to_text()
|
||||
--disable-xattr avoid use of xattr functions like listxattr()
|
||||
--disable-zlib avoid use of zlib functions like compress2()
|
||||
--disable-libjte avoid use of libjte for -jigdo command
|
||||
|
||||
xorriso allows to use external processes as file content filters. This is
|
||||
a potential security risk which may be avoided by ./configure option
|
||||
@ -97,12 +112,46 @@ if 64 KB rather than 32 KB are transmitted in each write operation.
|
||||
--enable-dvd-obs-64k
|
||||
|
||||
|
||||
libisoburn, libisofs, and libburn C language API
|
||||
|
||||
For the lower API concepts and calls see
|
||||
./libisoburn/libisoburn.h
|
||||
as well as
|
||||
/usr/include/libisofs/libisofs.h
|
||||
/usr/include/libburn/libburn.h
|
||||
|
||||
|
||||
xorriso C language API
|
||||
|
||||
Actually the dynamically linked xorriso binary is only a small start program
|
||||
for the xorriso API that is implemented inside libisoburn.
|
||||
There are API calls for command readers and interpreters, and there are
|
||||
API calls for each single command of xorriso.
|
||||
|
||||
Interested programmers should have a look into the API definition at
|
||||
xorriso/xorriso.h
|
||||
and the start program
|
||||
xorriso/xorriso_main.c
|
||||
|
||||
The header file xorriso.h gets installed suitable for
|
||||
#include <libisoburn/xorriso.h>
|
||||
|
||||
So after installation of a binary libisoburn package you may find it e.g. as
|
||||
/usr/include/libisoburn/xorriso.h
|
||||
|
||||
|
||||
Drives and Disk File Objects
|
||||
|
||||
The user of libisoburn applications needs rw-permission for the CD/DVD/BD
|
||||
drives which shall be used, even if only reading is intended.
|
||||
The user of libisoburn applications needs operating system dependent
|
||||
permissions for the CD/DVD/BD drives which shall be used.
|
||||
On Linux and FreeBSD this means -rw-permissions, even if only reading is
|
||||
intended. On Solaris one needs privileges "basic,sys_devices" and r-permission,
|
||||
even if writing is intended.
|
||||
|
||||
A list of rw-accessible drives can be obtained by
|
||||
xorriso -devices
|
||||
resp. by xorriso API call
|
||||
Xorriso_option_devices()
|
||||
resp. by libburn API call
|
||||
burn_drive_scan()
|
||||
|
||||
@ -114,7 +163,7 @@ your desired drive, then consider to kill it.
|
||||
If you cannot get rid of the automounter that easily, try whether it helps
|
||||
to always load the drive tray manually before starting a write run of
|
||||
xorriso. Wait until the drive light is off.
|
||||
Better try to unmount an eventually mounted media before a write run.
|
||||
Better try to unmount a mounted media before a write run.
|
||||
|
||||
|
||||
Besides true optical drives, libisoburn can also address disk files as input or
|
||||
@ -134,7 +183,7 @@ test program which compares files from the mounted image with the orignals
|
||||
on disk. It uses the normal POSIX filesystem calls, i.e. no libburnia stuff.
|
||||
|
||||
This program is not installed systemwide but stays in the installation
|
||||
directory of the xorriso tarball as test/compare_file . Usually it is
|
||||
directory of the libisoburn tarball as test/compare_file . Usually it is
|
||||
run as -exec payload of a find command. It demands at least three arguments:
|
||||
The path of the file to compare, the prefix1 to be cut off from path
|
||||
and the prefix2 which gets prepended afterwards to obtain the path of the
|
||||
@ -158,8 +207,8 @@ and vice versa:
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 as
|
||||
published by the Free Software Foundation.
|
||||
it under the terms of the GNU General Public License version 2 or later
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
@ -176,17 +225,12 @@ libburnia-project.org
|
||||
By Mario Danic <mario.danic@gmail.com>,
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-2010 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
||||
Copyright (C) 2006-2011 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
||||
|
||||
We, the copyright holders, agree on the interpretation that dynamical linking
|
||||
of our libraries constitutes "use of" and not "derivation from" our work in
|
||||
the sense of GPL, provided those libraries are compiled from our unaltered
|
||||
code or from altered code published under GPL.
|
||||
|
||||
So we will not raise any legal protest to dynamic linking of our
|
||||
libraries with applications not under GPL, as long as they fulfill
|
||||
We will not raise any legal protest to dynamic linking of our libraries
|
||||
with applications that are not under GPL, as long as they fulfill
|
||||
the condition of offering the library source code used, whether
|
||||
altered or unaltered, under the GPL, along with the application.
|
||||
altered or unaltered, under the GPLv2+, along with the application.
|
||||
Nevertheless, the safest legal position is not to link libburn with
|
||||
non-GPL compatible programs.
|
||||
|
||||
|
149
acinclude.m4
149
acinclude.m4
@ -1,3 +1,16 @@
|
||||
AC_DEFUN([LIBBURNIA_SET_FLAGS],
|
||||
[
|
||||
case $target_os in
|
||||
freebsd*)
|
||||
LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
||||
CPPFLAGS="$CPPFLAGS -I/usr/local/include"
|
||||
;;
|
||||
solaris*)
|
||||
LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
||||
esac
|
||||
])
|
||||
|
||||
|
||||
AC_DEFUN([TARGET_SHIZZLE],
|
||||
[
|
||||
ARCH=""
|
||||
@ -5,10 +18,12 @@ AC_DEFUN([TARGET_SHIZZLE],
|
||||
|
||||
AC_MSG_CHECKING([target operating system])
|
||||
|
||||
LIBBURNIA_LDCONFIG_CMD="echo 'No ldconfig run performed. If needed, configure manually for:'"
|
||||
case $target in
|
||||
*-*-linux*)
|
||||
ARCH=linux
|
||||
LIBBURN_ARCH_LIBS=
|
||||
LIBBURNIA_LDCONFIG_CMD=ldconfig
|
||||
;;
|
||||
*-*-freebsd*)
|
||||
ARCH=freebsd
|
||||
@ -39,8 +54,9 @@ dnl From Bruno Haible.
|
||||
dnl
|
||||
AC_DEFUN([LIBBURNIA_CHECK_ICONV],
|
||||
[
|
||||
|
||||
dnl Check whether it is allowed to link with -liconv
|
||||
AC_MSG_CHECKING([for separate -liconv ])
|
||||
AC_MSG_CHECKING([for iconv() in separate -liconv ])
|
||||
libburnia_liconv="no"
|
||||
libburnia_save_LIBS="$LIBS"
|
||||
LIBS="$LIBS -liconv"
|
||||
@ -54,6 +70,13 @@ AC_DEFUN([LIBBURNIA_CHECK_ICONV],
|
||||
)
|
||||
AC_MSG_RESULT([$libburnia_liconv])
|
||||
|
||||
if test x"$libburnia_save_LIBS" = x"$LIBS"
|
||||
then
|
||||
dnl GNU iconv has no function iconv() but libiconv() and a macro iconv()
|
||||
dnl It is not tested whether this is detected by above macro.
|
||||
AC_CHECK_LIB(iconv, libiconv, , )
|
||||
fi
|
||||
|
||||
dnl Check for iconv(..., const char **inbuf, ...)
|
||||
AC_MSG_CHECKING([for const qualifier with iconv() ])
|
||||
AC_TRY_COMPILE([
|
||||
@ -62,13 +85,133 @@ AC_DEFUN([LIBBURNIA_CHECK_ICONV],
|
||||
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
|
||||
], [], [libburnia_iconv_const=""], [libburnia_iconv_const="const"]
|
||||
)
|
||||
AC_DEFINE_UNQUOTED([ICONV_CONST], [$libburnia_iconv_const])
|
||||
if test x$libburnia_iconv_const = xconst
|
||||
then
|
||||
AC_DEFINE_UNQUOTED([ICONV_CONST], [const])
|
||||
else
|
||||
AC_DEFINE_UNQUOTED([ICONV_CONST], [])
|
||||
fi
|
||||
test -z "$libburnia_iconv_const" && libburnia_iconv_const="no"
|
||||
AC_MSG_RESULT([$libburnia_iconv_const])
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_SET_PKGCONFIG determines the install directory for the *.pc file.
|
||||
dnl LIBBURNIA_ASSERT_ICONV is by Thomas Schmitt, libburnia project
|
||||
dnl
|
||||
AC_DEFUN([LIBBURNIA_ASSERT_ICONV],
|
||||
[
|
||||
if test x$XORRISO_ASSUME_ICONV = x
|
||||
then
|
||||
dnl Check for the essential gestures of libisofs/util.c
|
||||
AC_MSG_CHECKING([for iconv() to be accessible now ])
|
||||
AC_TRY_LINK([
|
||||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
#include <iconv.h>
|
||||
#include <locale.h>
|
||||
#include <langinfo.h>
|
||||
#include <unistd.h>],
|
||||
[iconv_t cd = iconv_open("","");
|
||||
iconv(cd,NULL,NULL,NULL,NULL);
|
||||
iconv_close(cd);
|
||||
], [iconv_test="yes"], [iconv_test="no"]
|
||||
)
|
||||
AC_MSG_RESULT([$iconv_test])
|
||||
if test x$iconv_test = xno
|
||||
then
|
||||
echo >&2
|
||||
echo "Cannot get function iconv() to work. Configuration aborted." >&2
|
||||
echo "Check whether your system needs a separate libiconv installed." >&2
|
||||
echo "If it is installed but not found, try something like" >&2
|
||||
echo ' export LDFLAGS="$LDFLAGS -L/usr/local/lib"' >&2
|
||||
echo ' export CPPFLAGS="$CPPFLAGS -I/usr/local/include"' >&2
|
||||
echo ' export LIBS="$LIBS -liconv"' >&2
|
||||
echo "You may override this test by exporting variable" >&2
|
||||
echo " XORRISO_ASSUME_ICONV=yes" >&2
|
||||
echo >&2
|
||||
(exit 1); exit 1;
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_TRY_READLINE is by Thomas Schmitt, libburnia project
|
||||
dnl It performs the actual test compilation for readline.
|
||||
dnl Variable LIBS has to be set by the caller.
|
||||
AC_DEFUN([LIBBURNIA_TRY_READLINE],
|
||||
[
|
||||
AC_TRY_LINK([
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <readline/readline.h>
|
||||
#include <readline/history.h>],
|
||||
[HIST_ENTRY **hl;
|
||||
readline("");
|
||||
add_history("");
|
||||
hl= history_list();
|
||||
], [readline_test="yes"], [readline_test="no"]
|
||||
)
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_ASSERT_READLINE is by Thomas Schmitt, libburnia project
|
||||
dnl It disables xorriso readline if not all needed functions are present
|
||||
AC_DEFUN([LIBBURNIA_ASSERT_READLINE],
|
||||
[
|
||||
if test x$XORRISO_ASSUME_READLINE = x
|
||||
then
|
||||
dnl Check for the essential gestures of libisofs/util.c
|
||||
AC_MSG_CHECKING([for desired functions in libreadline])
|
||||
readline_msg=
|
||||
libburnia_save_LIBS="$LIBS"
|
||||
LIBS="$LIBS -lreadline"
|
||||
LIBBURNIA_TRY_READLINE
|
||||
if test x$readline_test = xno
|
||||
then
|
||||
LIBS="$libburnia_save_LIBS"
|
||||
LIBS="$LIBS -lreadline -lcurses"
|
||||
LIBBURNIA_TRY_READLINE
|
||||
if test x$readline_test = xyes
|
||||
then
|
||||
readline_msg=", with -lcurses"
|
||||
fi
|
||||
fi
|
||||
if test x$readline_test = xno
|
||||
then
|
||||
READLINE_DEF=
|
||||
LIBS="$libburnia_save_LIBS"
|
||||
fi
|
||||
AC_MSG_RESULT([$readline_test $readline_msg])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl LIBISOBURN_ASSERT_VERS_LIBS is by Thomas Schmitt, libburnia project
|
||||
dnl It tests whether -Wl,--version-script=... works with the compiler
|
||||
AC_DEFUN([LIBISOBURN_ASSERT_VERS_LIBS],
|
||||
[
|
||||
libburnia_save_LDFLAGS="$LDFLAGS"
|
||||
LDFLAGS="$LDFLAGS -Wl,--version-script=libisoburn/libisoburn.ver"
|
||||
AC_TRY_LINK([#include <stdio.h>], [printf("Hello\n");],
|
||||
[vers_libs_test="yes"], [vers_libs_test="no"])
|
||||
if test x$vers_libs_test = xno
|
||||
then
|
||||
LDFLAGS="$libburnia_save_LDFLAGS"
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_SET_PKGCONFIG is by Thomas Schmitt, libburnia project
|
||||
dnl It determines the install directory for the *.pc file.
|
||||
dnl Important: Must be performed _after_ TARGET_SHIZZLE
|
||||
dnl
|
||||
AC_DEFUN([LIBBURNIA_SET_PKGCONFIG],
|
||||
|
@ -1,7 +1,11 @@
|
||||
#!/bin/sh -x
|
||||
|
||||
aclocal
|
||||
aclocal -I .
|
||||
libtoolize --copy --force
|
||||
autoconf
|
||||
|
||||
# Not with libisoburn
|
||||
# autoheader
|
||||
|
||||
automake --foreign --add-missing --copy --include-deps
|
||||
|
||||
|
116
configure.ac
116
configure.ac
@ -1,11 +1,14 @@
|
||||
AC_INIT([libisoburn], [0.4.8], [http://libburnia-project.org])
|
||||
AC_INIT([libisoburn], [1.1.4], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
dnl AC_CONFIG_HEADER([config.h])
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
AC_CANONICAL_TARGET
|
||||
|
||||
LIBBURNIA_SET_FLAGS
|
||||
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
AC_CONFIG_MACRO_DIR([./])
|
||||
|
||||
dnl Hint: Search list for version code aspects:
|
||||
dnl /AC_INIT(
|
||||
@ -19,9 +22,9 @@ dnl configure.ac only rules the libtool revision numbering about
|
||||
dnl LT_CURREN, LT_AGE, LT_REVISION where SONAME becomes LT_CURRENT - LT_AGE
|
||||
dnl
|
||||
dnl These three are only copies to provide libtool with unused LT_RELEASE
|
||||
ISOBURN_MAJOR_VERSION=0
|
||||
ISOBURN_MINOR_VERSION=4
|
||||
ISOBURN_MICRO_VERSION=8
|
||||
ISOBURN_MAJOR_VERSION=1
|
||||
ISOBURN_MINOR_VERSION=1
|
||||
ISOBURN_MICRO_VERSION=4
|
||||
|
||||
dnl ISOBURN_VERSION=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION.$ISOBURN_MICRO_VERSION
|
||||
|
||||
@ -34,16 +37,16 @@ dnl Libtool versioning
|
||||
dnl Generate libisoburn.so.1.x.y
|
||||
dnl SONAME will become LT_CURRENT - LT_AGE
|
||||
dnl
|
||||
dnl ts B00125
|
||||
dnl This is the release version 0.4.8 = libisoburn.so.1.37.0
|
||||
dnl ts B10807
|
||||
dnl This is the release version 1.1.4 = libisoburn.so.1.71.0
|
||||
dnl ### This is the development version after above stable release
|
||||
dnl LT_CURRENT++, LT_AGE++ have not happened yet.
|
||||
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile.
|
||||
dnl
|
||||
dnl SONAME = 38 - 37 = 1 . Library name = libisoburn.so.1.37.0
|
||||
dnl SONAME = 72 - 71 = 1 . Library name = libisoburn.so.1.71.0
|
||||
LT_RELEASE=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION
|
||||
LT_CURRENT=38
|
||||
LT_AGE=37
|
||||
LT_CURRENT=72
|
||||
LT_AGE=71
|
||||
LT_REVISION=0
|
||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||
|
||||
@ -71,11 +74,22 @@ if test ! $ac_cv_func_fseeko; then
|
||||
AC_ERROR([Libburn requires largefile support.])
|
||||
fi
|
||||
|
||||
if test x$LIBISOBURN_OLD_ICONV_CONFIGURE = x
|
||||
then
|
||||
|
||||
dnl ts B00410 : To detect the need for -liconv and const argument of iconv()
|
||||
LIBBURNIA_CHECK_ICONV
|
||||
|
||||
else
|
||||
|
||||
dnl Outdated: produces double -liconv and warnings about parameter mismatch
|
||||
dnl If iconv(3) is in an extra lib, then it gets added to variable LIBS.
|
||||
dnl If not, then no -liconv will be added.
|
||||
AC_CHECK_LIB(iconv, iconv, , )
|
||||
AC_CHECK_LIB(iconv, iconv, , )
|
||||
dnl GNU iconv has no function iconv() but libiconv() and a macro iconv()
|
||||
AC_CHECK_LIB(iconv, libiconv, , )
|
||||
AC_CHECK_LIB(iconv, libiconv, , )
|
||||
|
||||
fi
|
||||
|
||||
AC_PROG_LIBTOOL
|
||||
AC_SUBST(LIBTOOL_DEPS)
|
||||
@ -107,10 +121,19 @@ if test x$enable_libreadline = xyes; then
|
||||
dnl Check whether there is readline-devel and readline-runtime.
|
||||
dnl If not, erase this macro which would enable use of readline(),add_history()
|
||||
READLINE_DEF="-DXorriso_with_readlinE"
|
||||
|
||||
if test x$XORRISO_OLD_READLINE_CONFIGURE = x
|
||||
then
|
||||
|
||||
dnl ts B00411 : To disable readline if not all needed functions are present
|
||||
LIBBURNIA_ASSERT_READLINE
|
||||
|
||||
else
|
||||
dnl The empty yes case obviously causes -lreadline to be linked
|
||||
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
|
||||
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
|
||||
dnl The X= in the yes case prevents that -lreadline gets linked twice
|
||||
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
|
||||
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
|
||||
fi
|
||||
else
|
||||
READLINE_DEF=
|
||||
fi
|
||||
@ -173,6 +196,17 @@ else
|
||||
fi
|
||||
AC_SUBST(ZLIB_DEF)
|
||||
|
||||
dnl ts B00928
|
||||
AC_ARG_ENABLE(libjte,
|
||||
[ --enable-libjte Enable use of libjte by xorriso, default=yes],
|
||||
, enable_libjte=yes)
|
||||
if test "x$enable_libjte" = xyes; then
|
||||
LIBJTE_DEF="-DXorriso_with_libjtE"
|
||||
AC_CHECK_HEADER(libjte/libjte.h, AC_CHECK_LIB(jte, libjte_new, , LIBJTE_DEF= ), LIBJTE_DEF= )
|
||||
else
|
||||
LIBJTE_DEF=
|
||||
fi
|
||||
AC_SUBST(LIBJTE_DEF)
|
||||
|
||||
dnl ts B00107
|
||||
dnl Just for the case that it is necessary to give link option -lcdio not only
|
||||
@ -219,7 +253,7 @@ AC_SUBST(EXTF_SUID_DEF)
|
||||
|
||||
AC_ARG_ENABLE(dvd-obs-64k,
|
||||
[ --enable-dvd-obs-64k 64 KB default size for xorriso DVD/BD writing, default=no],
|
||||
, enable_fifo_odirect=no)
|
||||
, enable_dvd_obs_64=no)
|
||||
if test x$enable_dvd_obs_64k = xyes; then
|
||||
XORRISO_DVD_OBS_64K="-DXorriso_dvd_obs_default_64K"
|
||||
echo "enabled xorriso write size default 64 KB on DVD and BD"
|
||||
@ -229,16 +263,54 @@ else
|
||||
fi
|
||||
AC_SUBST(XORRISO_DVD_OBS_64K)
|
||||
|
||||
# Library versioning normally serves a complex purpose.
|
||||
# Since libisoburn obeys strict ABI backward compatibility, it needs only the
|
||||
# simple feature to declare function names "global:" or "local:". Only the
|
||||
# global ones are visible to applications at library load time.
|
||||
AC_ARG_ENABLE(versioned-libs,
|
||||
[ --enable-versioned-libs Enable strict symbol encapsulation , default=yes],
|
||||
, enable_versioned_libs=yes)
|
||||
if test x$enable_versioned_libs = xyes; then
|
||||
vers_libs_test=no
|
||||
LIBISOBURN_ASSERT_VERS_LIBS
|
||||
if test x$vers_libs_test = xno
|
||||
then
|
||||
echo "disabled strict symbol encapsulation (test failed)"
|
||||
else
|
||||
echo "enabled strict symbol encapsulation"
|
||||
fi
|
||||
else
|
||||
echo "disabled strict symbol encapsulation"
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(ldconfig-at-install,
|
||||
[ --enable-ldconfig-at-install On GNU/Linux run ldconfig, default=yes],
|
||||
, ldconfig_at_install=yes)
|
||||
if test x$ldconfig_at_install = xyes; then
|
||||
dummy=dummy
|
||||
else
|
||||
LIBBURNIA_LDCONFIG_CMD="echo 'NOTE: ldconfig is disabled. If needed, configure manually for:'"
|
||||
echo "disabled run of ldconfig during installation on GNU/Linux"
|
||||
fi
|
||||
AC_SUBST(LIBBURNIA_LDCONFIG_CMD)
|
||||
|
||||
|
||||
|
||||
AC_CHECK_HEADER(libburn/libburn.h)
|
||||
AC_CHECK_HEADER(libisofs/libisofs.h)
|
||||
|
||||
|
||||
# ------- Visible mark in configure : Start of library check
|
||||
|
||||
dnl Check for proper library versions
|
||||
LIBBURN_REQUIRED=0.7.6
|
||||
LIBISOFS_REQUIRED=0.6.26
|
||||
LIBBURN_REQUIRED=1.1.4
|
||||
LIBISOFS_REQUIRED=1.1.4
|
||||
PKG_CHECK_MODULES(LIBBURN, libburn-1 >= $LIBBURN_REQUIRED)
|
||||
PKG_CHECK_MODULES(LIBISOFS, libisofs-1 >= $LIBISOFS_REQUIRED)
|
||||
|
||||
# ------- Visible mark in configure : End of library check
|
||||
|
||||
|
||||
if test x$LIBCDIO_DEF = x
|
||||
then
|
||||
if test x$enable_libcdio = xyes
|
||||
@ -262,17 +334,19 @@ AC_ARG_ENABLE(debug,
|
||||
, enable_debug=yes)
|
||||
if test x$enable_debug != xyes; then
|
||||
if test x$GCC = xyes; then
|
||||
CFLAGS="$CFLAGS -O3"
|
||||
CFLAGS="$CFLAGS -fexpensive-optimizations"
|
||||
CFLAGS="-O3 $CFLAGS"
|
||||
CFLAGS="-fexpensive-optimizations $CFLAGS"
|
||||
fi
|
||||
CFLAGS="$CFLAGS -DNDEBUG"
|
||||
CFLAGS="-DNDEBUG $CFLAGS"
|
||||
else
|
||||
if test x$GCC = xyes; then
|
||||
CFLAGS="$CFLAGS -g -pedantic -Wall"
|
||||
CFLAGS="-g -pedantic -Wall -Wextra -Wno-unused-parameter $CFLAGS"
|
||||
fi
|
||||
CFLAGS="$CFLAGS -DDEBUG"
|
||||
CFLAGS="-DDEBUG $CFLAGS"
|
||||
fi
|
||||
|
||||
CFLAGS="$READLINE_DEF $LIBACL_DEF $XATTR_DEF $EXTF_DEF $EXTF_SUID_DEF $ZLIB_DEF $LIBJTE_DEF $XORRISO_DVD_OBS_64K $CFLAGS"
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
doc/doxygen.conf
|
||||
|
41
doc/comments
41
doc/comments
@ -10,7 +10,7 @@ optical discs. This page is about its capability to read, manipulate, and
|
||||
write ISO 9660 filesystems with Rock Ridge extensions. Media can be optical
|
||||
media or filesystem objects.
|
||||
|
||||
Our scope is currently Linux 2.4 and 2.6, or FreeBSD .
|
||||
Our scope is currently Linux 2.4 and 2.6, or FreeBSD, or OpenSolaris.
|
||||
|
||||
libisoburn is an add-on to libburn and libisofs which coordinates both and
|
||||
also allows to grow ISO-9660 filesystem images on multi-session media as well
|
||||
@ -21,7 +21,9 @@ xorriso is an application of all three libraries which creates, loads,
|
||||
manipulates and writes ISO 9660 filesystem images with Rock Ridge extensions.
|
||||
Manipulation is not only adding or overwriting of files but also deletion,
|
||||
renaming, and attribute changing. An incremental backup feature is provided.
|
||||
See xorriso/README for more
|
||||
The xorriso features are accessible via built-in command interpreters and
|
||||
via a C language API.
|
||||
|
||||
|
||||
SONAME:
|
||||
libisoburn.so.1 (since 0.1.0, February 2008).
|
||||
@ -32,7 +34,7 @@ libisoburn.so.1 (since 0.1.0, February 2008).
|
||||
Our build system is based on autotools.
|
||||
User experience tells us that you will need at least autotools version 1.7.
|
||||
|
||||
To build libisoburn go into its toplevel directory and execute
|
||||
To build libisoburn go into its toplevel directory and execute:
|
||||
|
||||
- ./bootstrap (needed if you downloaded from SVN)
|
||||
|
||||
@ -40,14 +42,28 @@ To build libisoburn go into its toplevel directory and execute
|
||||
|
||||
- make
|
||||
|
||||
To make the libraries accessible for running resp. developing applications
|
||||
To make the library and the xorriso application accessible for running resp.
|
||||
software development:
|
||||
|
||||
- make install
|
||||
|
||||
Read libisoburn/libisoburn.h for a description of the API.
|
||||
See also README, xorriso/README, and the man page xorriso/xorriso.1 which
|
||||
gives an idea of the capabilities provided by Libburnia.
|
||||
|
||||
For direct use as command line tool use the xorriso binary which among many
|
||||
other features provides a mkisofs emulation via command "-as mkisofs".
|
||||
See man page xorriso/xorriso.1 or GNU info document xorriso/xorriso.info.
|
||||
|
||||
|
||||
If you want to link an own application with libisoburn, you have
|
||||
two alternative APIs for choice:
|
||||
|
||||
- libisoburn, together with libburn and libisofs.
|
||||
|
||||
- xorriso, a complete representation of xorriso command line options.
|
||||
It encapsulates the three lower level libraries.
|
||||
Calls of both API families shall not be mixed.
|
||||
|
||||
For a description of the lbisoburn API read libisoburn/libisoburn.h
|
||||
See file README for download and installation of a release tarball.
|
||||
You will also have to install and understand the two libraries of the
|
||||
Libburnia project which provide fundamental services:
|
||||
libburn is the library by which preformatted data get onto optical media.
|
||||
@ -55,4 +71,15 @@ See libburn/libburn.h for its API description.
|
||||
libisofs is the library to handle ISO 9660 filesystems with Rock Ridge
|
||||
extensions. Its API is described in libisofs/libisofs.h .
|
||||
|
||||
For xorriso features see its man page xorriso/xorriso.1 or
|
||||
its GNU info document xorriso/xorriso.info.
|
||||
For the corresponding C language API see libisoburn/xorriso.h (resp.
|
||||
xorriso/xorriso.h in the build directory).
|
||||
The implementation this API is part of libisoburn.
|
||||
The xorriso command line tool gets installed as dynamically linked
|
||||
binary together with libisoburn.
|
||||
|
||||
There is also a statically linked release named GNU xorriso.
|
||||
See xorriso/README_gnu_xorriso for its download and installation.
|
||||
|
||||
*/
|
||||
|
@ -154,13 +154,6 @@ QT_AUTOBRIEF = NO
|
||||
|
||||
MULTILINE_CPP_IS_BRIEF = YES
|
||||
|
||||
# If the DETAILS_AT_TOP tag is set to YES then Doxygen
|
||||
# will output the detailed description near the top, like JavaDoc.
|
||||
# If set to NO, the detailed description appears after the member
|
||||
# documentation.
|
||||
|
||||
DETAILS_AT_TOP = YES
|
||||
|
||||
# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
|
||||
# member inherits the documentation from any documented member that it
|
||||
# re-implements.
|
||||
@ -495,7 +488,9 @@ INPUT_ENCODING = UTF-8
|
||||
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
|
||||
# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
|
||||
|
||||
FILE_PATTERNS =
|
||||
FILE_PATTERNS = libisoburn.h \
|
||||
xorriso.h \
|
||||
comments
|
||||
|
||||
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
|
||||
# should be searched for input files as well. Possible values are YES and NO.
|
||||
@ -1150,7 +1145,8 @@ HIDE_UNDOC_RELATIONS = YES
|
||||
# toolkit from AT&T and Lucent Bell Labs. The other options in this section
|
||||
# have no effect if this option is set to NO (the default)
|
||||
|
||||
HAVE_DOT = YES
|
||||
# ts B10415: dot causes sigsegv on Debian buildd
|
||||
HAVE_DOT = NO
|
||||
|
||||
# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
|
||||
# will generate a graph for each documented class showing the direct and
|
||||
|
246
doc/faq.wiki
Normal file
246
doc/faq.wiki
Normal file
@ -0,0 +1,246 @@
|
||||
|
||||
'''Libburnia Frequently Asked Questions'''
|
||||
|
||||
Please post your questions to
|
||||
[http://mailman-mail1.webfaction.com/listinfo/libburn-hackers/ libburn-hackers mailing list].
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
'''Content:'''
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
Burning:
|
||||
|
||||
[#diff_cdrskin_xorriso What is the difference between cdrskin and xorriso ?]
|
||||
|
||||
Imaging:
|
||||
|
||||
[#edit_files Is there a way to edit files inside the ISO image ?]
|
||||
|
||||
[#boot_arch For which architectures xorriso is able to create bootable images ?]
|
||||
|
||||
[#isohybrid How to enable booting from USB stick ?]
|
||||
|
||||
[#partition_offset What is partition offset feature all about?]
|
||||
|
||||
[#partition_offset_apple Partition offset bad on Apple ?]
|
||||
|
||||
Development:
|
||||
|
||||
[#api_specs Where are the APIs of libburnia libraries described ?]
|
||||
|
||||
[#gui_advise I want to write a GUI on the top of libburnia libraries. Any pointers or recommendations ?]
|
||||
|
||||
Miscellaneous:
|
||||
|
||||
[#example_links Where to see examples ?]
|
||||
|
||||
[#xorriso_aliases What personalities are supported by xorriso ?]
|
||||
|
||||
[#xorriso_dialog_mode What is xorriso dialog mode useful for ?]
|
||||
|
||||
[#version_numbers Why is every second release missing ?]
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
'''Burning'''
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
===== What is the difference between cdrskin and xorriso ? ===== #diff_cdrskin_xorriso
|
||||
|
||||
[wiki:Cdrskin cdrskin] is a dedicated emulator of program cdrecord, based on
|
||||
libburn. It tries to be as similar to cdrecord as is possible under that
|
||||
premise.
|
||||
|
||||
[wiki:Xorriso xorriso] is an integrated tool which creates, loads, manipulates,
|
||||
and writes ISO 9660 filesystem images with Rock Ridge extensions.
|
||||
It is based on libburn, libisofs, and libisoburn. One of its features is
|
||||
the emulation of the corresponding tasks as done by mkisofs and cdrecord.
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
'''Imaging'''
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
===== Is there a way to edit files inside the ISO image ? ===== #edit_files
|
||||
|
||||
File content cannot be altered. But files may be replaced by new copies from
|
||||
the disk filesystem.
|
||||
|
||||
The main method of manipulating an existing ISO image is to append a session
|
||||
with a new complete directory tree and the file content of the added or
|
||||
overwritten files. Depending on the media type you get gaps between sessions
|
||||
of up to 20 MB. So better try to do all foreseeable changes by one add-on
|
||||
session.
|
||||
|
||||
===== For which architectures xorriso is able to create bootable images ? ===== #boot_arch
|
||||
|
||||
Currently it supports systems with PC-BIOS via El Torito for booting from
|
||||
CD, DVD, or BD media, and via MBR for booting from memory sticks or hard
|
||||
disks. Further it supports machines with MIPS processor from SGI (Big Endian)
|
||||
and DEC (Little Endian), and SUN SPARC machines.
|
||||
(See [http://bazaar.launchpad.net/%7Elibburnia-team/libisofs/scdbackup/annotate/head%3A/doc/boot_sectors.txt libisofs/doc/boot_sectors.txt]
|
||||
for technical details.)
|
||||
|
||||
Machines which support EFI may either boot via El Torito or use the files
|
||||
of the ISO image directly. It is possible to append to the ISO image a
|
||||
writeable FAT12 partition where files for EFI may be stored and changed.
|
||||
|
||||
===== How to enable booting from USB stick ? ===== #isohybrid
|
||||
|
||||
The ISOLINUX boot loader is normally started from CD, DVD or BD media
|
||||
by a PC-BIOS via an El Torito boot record. But if the ISO image resides on an
|
||||
USB stick or another hard-disk-like device, then PC-BIOS ignores El Torito
|
||||
and rather expects a Master Boot Record (MBR). Both boot record types can
|
||||
reside in the same ISO image. Therefore it is possible to create an MBR that
|
||||
starts the boot image file of ISOLINUX which is already target of the El Torito
|
||||
boot record. This kind of MBR is called "isohybrid". ISOLINUX provides
|
||||
a program named isohybrid to patch existing images, but libisofs can create an
|
||||
MBR already when producing the ISO image. See in
|
||||
[http://www.gnu.org/software/xorriso/man_1_xorriso.html manual page of xorriso]
|
||||
option -boot_image with arguments "isolinux" "system_area=",
|
||||
and -as mkisofs option -isohybrid-mbr.
|
||||
|
||||
See [http://en.wikipedia.org/wiki/Master_boot_record Wikipedia on MBR] for
|
||||
general information about PC-DOS Master Boot Records, and
|
||||
[http://syslinux.zytor.com/wiki/index.php/ISOLINUX ISOLINUX wiki] for special
|
||||
information about ISOLINUX. The wiki example with mkisofs can be performed
|
||||
as well by help of xorriso option -as mkisofs.
|
||||
|
||||
A similar combination of El Torito and MBR is created by GRUB2 tool
|
||||
grub-mkrescue. See [http://www.gnu.org/software/grub/ homepage of GNU GRUB 2]
|
||||
for general information.
|
||||
|
||||
===== What is partition offset feature all about? ===== #partition_offset
|
||||
|
||||
If an MBR is present, then it contains a partition table with up to four
|
||||
entries. The MBR is located at the very start of the ISO image. By
|
||||
tradition the first partition should begin only after the range of MBR and
|
||||
eventual supporting data blocks. On hard disk one often sees partition 1
|
||||
starting at byte 63*512. Further it is tradition that the payload filesystem
|
||||
is mountable via one of the partitions.
|
||||
|
||||
The isohybrid MBR has its only partition start at byte 0. Thus it is mountable
|
||||
but does not obey the tradition to begin only after the MBR. The grub-mkrescue
|
||||
MBR on the other hand has partition 1 start at byte 512, which makes it
|
||||
unmountable. Only the unpartitioned base device can be mounted. (On GNU/Linux
|
||||
e.g. /dev/sdb is the base device whereas /dev/sdb1 is partition 1.)
|
||||
|
||||
The compromise offered by libisofs is to create a second superblock at
|
||||
address 16*2048 and to let start partition 1 at this address. The second
|
||||
superblock leads to a second directory tree which takes into account the
|
||||
address difference between partition 1 and the base device. So the image
|
||||
gets mountable via both devices and reserves 32 kB for boot manager software
|
||||
where it may manipulate and augment the MBR.
|
||||
(See [http://libburnia-project.org/wiki/PartitionOffset Partition Offset Wiki]
|
||||
for examples.)
|
||||
|
||||
There are reports of machines which will not boot from USB stick if
|
||||
partition offset is 0.
|
||||
|
||||
===== Partition offset bad on Apple ? ===== #partition_offset_apple
|
||||
|
||||
Apple's "Snow Leopard" operating system refuses to mount Debian CD images
|
||||
with non-zero partition offset.
|
||||
|
||||
The issue is still under investigation. But for now one has to choose
|
||||
between mountability on Apple "Snow Leopard" or bootability from USB stick
|
||||
on Kontron CG2100 "carrier grade server".
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
'''Developing'''
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
===== Where are the APIs of libburnia libraries described ? ===== #api_specs
|
||||
|
||||
The decisive references are the inclusion headers of the libraries
|
||||
<libburn/libburn.h>, <libisofs/libisofs.h>, <libisoburn/libisoburn.h>,
|
||||
and <libisoburn/xorriso.h>.
|
||||
|
||||
Current SVN versions of these files:
|
||||
[http://libburnia-project.org/browser/libburn/trunk/libburn/libburn.h libburn/libburn.h] ,
|
||||
[http://bazaar.launchpad.net/%7Elibburnia-team/libisofs/scdbackup/annotate/head%3A/libisofs/libisofs.h libisofs/libisofs.h] ,
|
||||
[http://libburnia-project.org/browser/libisoburn/trunk/libisoburn/libisoburn.h libisoburn/libisoburn.h] ,
|
||||
[http://libburnia-project.org/browser/libisoburn/trunk/xorriso/xorriso.h libisoburn/xorriso.h]
|
||||
|
||||
Doxygen generated API descriptions at
|
||||
[http://api.libburnia-project.org api.libburnia-project.org]
|
||||
might be slightly behind the latest developments.
|
||||
|
||||
===== I want to write a GUI on the top of libburnia libraries. Any pointers or recommendations ? ===== #gui_advise
|
||||
|
||||
Most appreciated would be a GUI for xorriso which allows to copy files from
|
||||
a view of the hard disk filesystem to a view of the ISO filesystem, and vice
|
||||
versa. The xorriso implementation is located inside libisoburn.
|
||||
|
||||
Each option that is described in
|
||||
[http://www.gnu.org/software/xorriso/man_1_xorriso.html man 1 xorriso]
|
||||
can be performed by a corresponding C function that is defined in
|
||||
[http://libburnia-project.org/browser/libisoburn/trunk/xorriso/xorriso.h xorriso.h].
|
||||
Further there are calls for library startup and shutdown, for problem
|
||||
handling, and for the interpreters of xorriso's command line interface.
|
||||
The xorriso API encapsulates calls to libisofs, libburn, and libisoburn.
|
||||
|
||||
An alternative to the xorriso C API is xorriso dialog mode.
|
||||
[#xorriso_dialog_mode See below.]
|
||||
|
||||
The known existing GUIs [http://www.xfce.org/projects/xfburn/ Xfburn],
|
||||
[http://projects.gnome.org/brasero/ Brasero],
|
||||
[http://flburn.sourceforge.net/ FlBurn]
|
||||
rather use libisofs and libburn directly.
|
||||
(Please submit an URI if you want your libburnia GUI application mentioned
|
||||
here.)
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
'''Miscellaneous'''
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
===== Where to see examples ? ===== #example_links
|
||||
|
||||
[http://www.gnu.org/software/xorriso/man_1_xorriso.html#EXAMPLES xorriso examples] ,
|
||||
[http://scdbackup.sourceforge.net/man_1_cdrskin_devel.html#EXAMPLES cdrskin examples] ,
|
||||
[http://libburnia-project.org/browser/libburn/trunk/test/libburner.c libburner.c a minimal but complete burn program]
|
||||
(also illustrated at the end of [http://api.libburnia-project.org/libburn/ libburn API intro]).
|
||||
|
||||
|
||||
===== What personalities are supported by xorriso ? ===== #xorriso_aliases
|
||||
|
||||
The name by which xorriso is started may trigger certain features which
|
||||
normally would need to be enabled by program options.
|
||||
|
||||
xorrisofs starts up in mkisofs emulation mode, which otherwise would have to
|
||||
be entered by command -as "mkisofs".
|
||||
|
||||
xorrecord starts up in cdrecord emulation mode, which is normally entered by
|
||||
command -as "cdrecord". This emulation is only able to write a single data
|
||||
track as new session to blank or appendable media. No audio. No multiple
|
||||
tracks in one session.
|
||||
|
||||
osirrox allows to copy files from ISO image to disk and to apply option -mount
|
||||
to one or more of the existing ISO sessions. This is normally enabled by
|
||||
option -osirrox "on:o_excl_off".
|
||||
|
||||
===== What is xorriso dialog mode useful for ? ===== #xorriso_dialog_mode
|
||||
|
||||
Dialog mode is initiated if -dialog "on" is among the program arguments.
|
||||
It can be used to inspect and exploit existing ISO 9660 images or
|
||||
to explore xorriso's behavior in order to develop the command sequence
|
||||
for a batch run.
|
||||
|
||||
Frontend programmers may fork xorriso initiating a xorriso dialog session
|
||||
(-dialog "on" -use_readline "off" -pkt_output "on" -mark "done"),
|
||||
and interact with it from their own program via pipes connected to
|
||||
xorriso's stdin and stdout. This is more efficient than forking xorriso
|
||||
every now and then to perform various commands in order to complete
|
||||
complex tasks like image size prediction.
|
||||
|
||||
===== Why is every second release missing ? ===== #version_numbers
|
||||
|
||||
Releases have an even third version number. Like 0.5.6 or 1.0.4.
|
||||
During development the next higher odd number is used. E.g. 0.5.7 or 1.0.5.
|
||||
|
||||
The content of release tarballs does not get changed without changing
|
||||
their name. The development tarballs of xorriso and cdrskin may change
|
||||
their content without notice.
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
Site maintainer: Do not edit this wiki directly but rather the SVN version
|
||||
of libisoburn/trunk/doc/faq.wiki. When done, paste it into the wiki editor.
|
||||
|
232
doc/partition_offset.wiki
Normal file
232
doc/partition_offset.wiki
Normal file
@ -0,0 +1,232 @@
|
||||
|
||||
The partition offset feature of libisofs can produce ISO 9660 images which bear
|
||||
a quite conventional partition table if copied onto a USB stick. The first
|
||||
partition marks the size of the ISO image but starts at a non-zero address.
|
||||
Thus it marks a small part of the device as unclaimed by partitions and
|
||||
available for storing boot loader code.
|
||||
|
||||
Nevertheless the USB stick is mountable via its overall device file as well as
|
||||
via the partition device file. E.g. on GNU/Linux: /dev/sdb and /dev/sdb1.
|
||||
This is achieved by two distinct sets of meta-data which refer to the same
|
||||
file content.
|
||||
|
||||
The dual-mount feature supports Rock Ridge and Joliet too.
|
||||
It is capable of multi-session.
|
||||
|
||||
Currently only offset 32 kB seems to make sense. Smaller offsets are prohibited
|
||||
by fundamental assumptions of libisofs and libisoburn. Larger offsets would
|
||||
extend the unclaimed area into vital blocks of the ISO image.
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
Meanwhile Debian
|
||||
[http://cdimage.debian.org/cdimage/daily-builds/daily/current/ daily]
|
||||
and [http://cdimage.debian.org/cdimage/weekly-builds/ weekly] builds make
|
||||
use of this feature with their bootable ISO images for i386 and amd64. E.g.
|
||||
[http://cdimage.debian.org/cdimage/daily-builds/daily/current/i386/iso-cd/debian-testing-i386-businesscard.iso debian-testing-i386-businesscard.iso].
|
||||
|
||||
According to a
|
||||
[http://syslinux.zytor.com/archives/2011-March/016201.html thread of march 2011]
|
||||
on Syslinux mailing list this enabled booting of a Kontron CG2100 server
|
||||
from USB stick, which otherwise failed.
|
||||
|
||||
Regrettably the feature seems to prevent mounting of ISO 9660 images on
|
||||
Apple "Snow Leopard" systems.
|
||||
At least this is the outcome of a
|
||||
[http://lists.debian.org/debian-cd/2011/04/msg00029.html debian-cd thread of april 2011].
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
Example:
|
||||
|
||||
Testing mountability and ISOLINUX bootability from USB stick and CD.
|
||||
|
||||
Overview:
|
||||
|
||||
The test image was derived from one year old RIPLinux-9.3-non-X.iso which
|
||||
has an isohybrid MBR. Syslinux version seems to be 3.82. That MBR and the file
|
||||
tree from the mounted RIPLinux image was used to build a new ISO image
|
||||
with 16 * 2kB partition offset. Isohybrid MBR patching was done by xorriso.
|
||||
|
||||
Details:
|
||||
|
||||
The first 32 kB of an ISO 9660 image are called System Area and may host any
|
||||
byte pattern. In the case of RIPLinux-9.3-non-X.iso only the first 512 bytes
|
||||
are non-zero. But to avoid any assumptions, all 32 kB get copied here.
|
||||
{{{
|
||||
dd if=RIPLinux-9.3-non-X.iso bs=1K count=32 of=RIPLinux-9.3-non-X.sysarea
|
||||
}}}
|
||||
Normally the System Area file with its MBR is provided by the Syslinux
|
||||
installation under the name isohdp[fp]x*.bin .
|
||||
E.g. /usr/lib/syslinux/isohdpfx.bin
|
||||
|
||||
The files of the image are made accessible for reading
|
||||
{{{
|
||||
mount -o loop RIPLinux-9.3-non-X.iso /mnt
|
||||
}}}
|
||||
|
||||
A new ISO image gets composed. The first three lines of arguments are taken
|
||||
from the prescriptions of ISOLINUX wiki and adapted to the names used in
|
||||
RIPLinux-9.3-non-X.iso.
|
||||
Option -isohybrid-mbr imports the copied System Area and patches the MBR
|
||||
according to rules published by hpa on Syslinux mailing list.
|
||||
Option -partition_offset 16 causes the first partition to start at 2 kB block
|
||||
number 16. It also prepares the image to be mountable by this partition, too.
|
||||
{{{
|
||||
xorriso -as mkisofs \
|
||||
-o new_image.iso \
|
||||
-b boot/isolinux/isolinux.bin -c boot/boot.cat \
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||
-isohybrid-mbr RIPLinux-9.3-non-X.sysarea \
|
||||
-partition_offset 16 \
|
||||
/mnt
|
||||
}}}
|
||||
The image was copied onto a USB stick
|
||||
{{{
|
||||
dd if=new_image.iso of=/dev/sdc
|
||||
}}}
|
||||
and plugged into a Debian system.
|
||||
{{{
|
||||
fdisk -lu /dev/sdb
|
||||
}}}
|
||||
yields
|
||||
{{{
|
||||
Device Boot Start End Blocks Id System
|
||||
/dev/sdb1 * 64 120831 60384 17 Hidden HPFS/NTFS
|
||||
}}}
|
||||
|
||||
I can mount /dev/sdb and /dev/sdb1 alike:
|
||||
{{{
|
||||
mount /dev/sdb1 /mnt1
|
||||
mount -o loop /dev/sdb /mnt
|
||||
}}}
|
||||
-o loop avoids failure with "mount: /dev/sdb already mounted or /mnt busy".
|
||||
A comparison by
|
||||
{{{
|
||||
diff -r /mnt /mnt1
|
||||
}}}
|
||||
reports no difference.
|
||||
Human readable files look ok.
|
||||
Test-reading all content by
|
||||
{{{
|
||||
tar cf - /mnt | wc
|
||||
}}}
|
||||
yields a reasonable byte count of 60743680 and no errors.
|
||||
|
||||
The machine boots RIPLinux from this USB stick with no visible problems.
|
||||
It can then mount /dev/sdb as well as /dev/sdb1.
|
||||
The ISO image boots from CD too.
|
||||
|
||||
Mounting the partition can be simulated with an image file on hard disk by
|
||||
cutting off the first partition_offset blocks of 2 KB:
|
||||
{{{
|
||||
dd if=new_image.iso of=partition_image.iso bs=2048 skip=16
|
||||
mount -o loop partition_image.iso /mnt1
|
||||
}}}
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
Another test was made with GRUB 2 by downloading
|
||||
{{{
|
||||
bzr branch http://bzr.savannah.gnu.org/r/grub/trunk/grub
|
||||
}}}
|
||||
|
||||
Before building GRUB 2, the file
|
||||
{{{
|
||||
util/grub-mkrescue.in
|
||||
}}}
|
||||
was edited to replace in the options of the xorriso command:
|
||||
{{{
|
||||
--protective-msdos-label
|
||||
}}}
|
||||
by
|
||||
{{{
|
||||
-partition_offset 16 -no-pad
|
||||
}}}
|
||||
Then GRUB 2 was built and installed.
|
||||
|
||||
The resulting image from
|
||||
{{{
|
||||
./grub-mkrescue -o image.iso
|
||||
}}}
|
||||
was put onto USB stick. It passed the same tests on Debian
|
||||
as above RIPLinux example. It boots to a GRUB prompt.
|
||||
|
||||
Due to option -no-pad the image is about 250 kB smaller than
|
||||
the image produced by original grub-mkrescue. Else it would have grown by
|
||||
about 50 kB.
|
||||
|
||||
Unpadded ISO images are safe except for burning on CD in TAO mode.
|
||||
In this case problems may occur with reading the last few data blocks.
|
||||
So when burning onto CD make sure to require SAO mode and/or to
|
||||
require padding by 300 kB.
|
||||
Burning on DVD or BD needs no such caution. Neither does copying
|
||||
on USB stick or hard disk.
|
||||
|
||||
Program fdisk will complain about "different physical/logical" addresses.
|
||||
This can be silenced by adding option
|
||||
{{{
|
||||
-partition_cyl_align on
|
||||
}}}
|
||||
at the cost of image padding up to the next full MB.
|
||||
E.g. by 402 kB to 2 MB.
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
Open questions:
|
||||
|
||||
- Shall the partition of an isohybrid image be marked bootable ?
|
||||
Currently xorriso keeps the 0x80 mark of an imported MBR
|
||||
resp. the 0x80 mark which xorriso sets by its own MBR
|
||||
preparations.
|
||||
- If not to be marked bootable:
|
||||
What equipment would the partition need to justify having the mark ?
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
Application:
|
||||
|
||||
The partition offset feature can be controlled by libisofs API calls
|
||||
{{{
|
||||
int iso_write_opts_set_part_offset(IsoWriteOpts *opts,
|
||||
uint32_t block_offset_2k,
|
||||
int secs_512_per_head,
|
||||
int heads_per_cyl);
|
||||
|
||||
int iso_write_opts_set_system_area(IsoWriteOpts *opts, char data[32768],
|
||||
int options, int flag);
|
||||
}}}
|
||||
resp. by libisoburn calls
|
||||
{{{
|
||||
int isoburn_igopt_set_part_offset(struct isoburn_imgen_opts *opts,
|
||||
uint32_t block_offset_2k,
|
||||
int secs_512_per_head, int heads_per_cyl);
|
||||
|
||||
int isoburn_igopt_get_part_offset(struct isoburn_imgen_opts *opts,
|
||||
uint32_t *block_offset_2k,
|
||||
int *secs_512_per_head, int *heads_per_cyl);
|
||||
|
||||
int isoburn_igopt_set_system_area(struct isoburn_imgen_opts *o,
|
||||
char data[32768], int options);
|
||||
|
||||
int isoburn_igopt_get_system_area(struct isoburn_imgen_opts *o,
|
||||
char data[32768], int *options);
|
||||
}}}
|
||||
resp. by xorriso options
|
||||
{{{
|
||||
-boot_image any partition_offset=(2kb_block_adr)
|
||||
-boot_image any partition_sec_hd=(number)
|
||||
-boot_image any partition_hd_cyl=(number)
|
||||
-boot_image any partition_cyl_align(on|auto|off)
|
||||
|
||||
-as mkisofs ... -partition_offset (2kb_block_adr) \
|
||||
-partition_hd_cyl (number) \
|
||||
-partition_sec_hd (number) \
|
||||
-partition_cyl_align (on|auto|off) ...
|
||||
}}}
|
||||
|
||||
As stated above, an offset larger than 16 would expose vital parts of the
|
||||
ISO image as unclaimed space. Values smaller than 16 are not accepted.
|
||||
So use either an offset of 16 blocks or keep the feature disabled by
|
||||
offset 0.
|
||||
|
22
doc/startup_file.txt
Normal file
22
doc/startup_file.txt
Normal file
@ -0,0 +1,22 @@
|
||||
# This is an example for a xorriso startup file.
|
||||
# If found at one of the following addresses then its text lines will get
|
||||
# executed by xorriso as commands before any of its program arguments:
|
||||
# /etc/default/xorriso
|
||||
# /etc/opt/xorriso/rc
|
||||
# /etc/xorriso/xorriso.conf
|
||||
# $HOME/.xorrisorc
|
||||
# Note: Command -no_rc as first program argument prevents this execution.
|
||||
|
||||
|
||||
# Disallow the use of hard disk /dev/sda and its partitions as
|
||||
# pseudo-drive (e.g. as output target of an ISO image).
|
||||
|
||||
-drive_class banned /dev/sda*
|
||||
|
||||
|
||||
# Allow the use of /dev/sdb, /dev/sdc, and /dev/sdd as pseudo-drives
|
||||
# without the prefix "stdio:" which is usually required for device addresses
|
||||
# which begin by "/dev/" but represent no CD drives.
|
||||
|
||||
-drive_class harmless /dev/sd[bcd]
|
||||
|
@ -6,9 +6,14 @@
|
||||
*/
|
||||
/* libburn wrappers for libisoburn
|
||||
|
||||
Copyright 2007 - 2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
Copyright 2007 - 2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
/* <<< A70929 : hardcoded CD-RW with fabricated -msinfo
|
||||
#define Hardcoded_cd_rW 1
|
||||
#define Hardcoded_cd_rw_c1 12999
|
||||
@ -26,17 +31,21 @@
|
||||
#include <time.h>
|
||||
#include <regex.h>
|
||||
|
||||
|
||||
#ifndef Xorriso_standalonE
|
||||
|
||||
#include <libburn/libburn.h>
|
||||
|
||||
#include <libisofs/libisofs.h>
|
||||
#ifdef Xorriso_with_libjtE
|
||||
#include <libjte/libjte.h>
|
||||
#endif
|
||||
|
||||
#else /* ! Xorriso_standalonE */
|
||||
|
||||
#include "../libisofs/libisofs.h"
|
||||
#include "../libburn/libburn.h"
|
||||
#ifdef Xorriso_with_libjtE
|
||||
#include "../libjte/libjte.h"
|
||||
#endif
|
||||
|
||||
#endif /* Xorriso_standalonE */
|
||||
|
||||
@ -64,10 +73,10 @@ static int isoburn_emulate_toc(struct burn_drive *d, int flag);
|
||||
|
||||
int isoburn_initialize(char msg[1024], int flag)
|
||||
{
|
||||
int major, minor, micro, bad_match= 0;
|
||||
int major, minor, micro, bad_match= 0, no_iso_init= 0;
|
||||
|
||||
|
||||
/* First two ugly compile time checks for header version compatibility.
|
||||
/* First the ugly compile time checks for header version compatibility.
|
||||
If everthing matches, then they produce no C code. In case of mismatch,
|
||||
intentionally faulty C code will be inserted.
|
||||
*/
|
||||
@ -103,7 +112,7 @@ int isoburn_initialize(char msg[1024], int flag)
|
||||
|
||||
#ifdef Isoburn_libisofs_dot_h_too_olD
|
||||
LIBISOFS_MISCONFIGURATION = 0;
|
||||
INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libisofs_dot_h_TOO_OLD__SEE_libisoburn_dot_h_AND_burn_wrap_dot_h = 0;
|
||||
INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libisofs_dot_h_TOO_OLD__SEE_libisoburn_dot_h_AND_burn_wrap_dot_c = 0;
|
||||
LIBISOFS_MISCONFIGURATION_ = 0;
|
||||
#endif
|
||||
|
||||
@ -144,14 +153,62 @@ INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libburn_dot_h_TOO_OLD__SEE_libisobu
|
||||
LIBBURN_MISCONFIGURATION_ = 0;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
|
||||
/* The minimum requirement of libisoburn towards the libjte header
|
||||
at compile time is the same as the one of a usable libisfs itowards libjte.
|
||||
So the requirement is defined in libisofs/libisofs.h :
|
||||
iso_libjte_req_major , iso_libjte_req_minor , iso_libjte_req_micro
|
||||
*/
|
||||
/* The indendation is an advise of man gcc to help old compilers ignoring */
|
||||
#if iso_libjte_req_major > LIBJTE_VERSION_MAJOR
|
||||
#define Libisofs_libjte_dot_h_too_olD 1
|
||||
#endif
|
||||
#if iso_libjte_req_major == LIBJTE_VERSION_MAJOR && iso_libjte_req_minor > LIBJTE_VERSION_MINOR
|
||||
#define Libisofs_libjte_dot_h_too_olD 1
|
||||
#endif
|
||||
#if iso_libjte_req_minor == LIBJTE_VERSION_MINOR && iso_libjte_req_micro > LIBJTE_VERSION_MICRO
|
||||
#define Libisofs_libjte_dot_h_too_olD 1
|
||||
#endif
|
||||
|
||||
#ifdef Libisofs_libjte_dot_h_too_olD
|
||||
LIBJTE_MISCONFIGURATION = 0;
|
||||
INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libjte_dot_h_TOO_OLD__SEE_libisofs_dot_h_AND_burn_wrap.c_c = 0;
|
||||
LIBJTE_MISCONFIGURATION_ = 0;
|
||||
#endif
|
||||
|
||||
#endif /* Xorriso_with_libjtE */
|
||||
|
||||
|
||||
/* End of ugly compile time tests (scroll up for explanation) */
|
||||
|
||||
|
||||
|
||||
msg[0]= 0;
|
||||
if(iso_init()<0) {
|
||||
sprintf(msg+strlen(msg), "Cannot initialize libisofs\n");
|
||||
return(0);
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
|
||||
libjte__version(&major, &minor, µ);
|
||||
sprintf(msg + strlen(msg), "libjte-%d.%d.%d ", major, minor, micro);
|
||||
if (libjte__is_compatible(LIBJTE_VERSION_MAJOR, LIBJTE_VERSION_MINOR,
|
||||
LIBJTE_VERSION_MICRO, 0)) {
|
||||
sprintf(msg+strlen(msg), "ok, ");
|
||||
} else {
|
||||
sprintf(msg + strlen(msg),
|
||||
"- TOO OLD -, need at least libjte-%d.%d.%d ,\n",
|
||||
LIBJTE_VERSION_MAJOR, LIBJTE_VERSION_MINOR,
|
||||
LIBJTE_VERSION_MICRO);
|
||||
bad_match= 1;
|
||||
no_iso_init= 1; /* iso_init() will fail anyway */
|
||||
}
|
||||
|
||||
#endif /* Xorriso_with_libjtE */
|
||||
|
||||
if(!no_iso_init) {
|
||||
if(iso_init()<0) {
|
||||
sprintf(msg+strlen(msg), "Cannot initialize libisofs\n");
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
iso_lib_version(&major, &minor, µ);
|
||||
sprintf(msg+strlen(msg), "libisofs-%d.%d.%d ", major, minor, micro);
|
||||
@ -183,6 +240,7 @@ LIBBURN_MISCONFIGURATION_ = 0;
|
||||
sprintf(msg+strlen(msg), "Cannot initialize libburn\n");
|
||||
return(0);
|
||||
}
|
||||
|
||||
burn_version(&major, &minor, µ);
|
||||
sprintf(msg+strlen(msg), "libburn-%d.%d.%d ", major, minor, micro);
|
||||
if(major > burn_header_version_major
|
||||
@ -228,6 +286,20 @@ int isoburn_libburn_req(int *major, int *minor, int *micro)
|
||||
}
|
||||
|
||||
|
||||
/* API @since 0.6.4 */
|
||||
int isoburn_libjte_req(int *major, int *minor, int *micro)
|
||||
{
|
||||
#ifdef Xorriso_with_libjtE
|
||||
*major= LIBJTE_VERSION_MAJOR;
|
||||
*minor= LIBJTE_VERSION_MINOR;
|
||||
*micro= LIBJTE_VERSION_MICRO;
|
||||
#else
|
||||
*major= *minor= *micro= 0;
|
||||
#endif /* ! Xorriso_with_libjtE */
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_set_msgs_submit(int (*msgs_submit)(void *handle, int error_code,
|
||||
char msg_text[], int os_errno,
|
||||
char severity[], int flag),
|
||||
@ -272,7 +344,8 @@ int isoburn_is_intermediate_dvd_rw(struct burn_drive *d, int flag)
|
||||
static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
int flag)
|
||||
{
|
||||
int ret, lba, nwa, profile, readonly= 0;
|
||||
int ret, profile, readonly= 0, role, random_access;
|
||||
int emulation_started= 0;
|
||||
struct burn_multi_caps *caps= NULL;
|
||||
struct isoburn_toc_entry *t;
|
||||
char profile_name[80];
|
||||
@ -281,7 +354,13 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
struct isoburn_toc_track **tracks;
|
||||
int num_sessions= 0, num_tracks= 0, track_count= 0, session_no= 0;
|
||||
char msg[80];
|
||||
enum burn_disc_status s;
|
||||
|
||||
#ifndef Hardcoded_cd_rW
|
||||
int lba, nwa;
|
||||
#endif
|
||||
|
||||
s= burn_disc_get_status(d);
|
||||
profile_name[0]= 0;
|
||||
ret= burn_disc_get_profile(d, &profile, profile_name);
|
||||
if(ret<=0)
|
||||
@ -309,16 +388,18 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
(*o)->fabricated_disc_status= BURN_DISC_APPENDABLE;
|
||||
#endif
|
||||
|
||||
if(caps->start_adr)
|
||||
role= burn_drive_get_drive_role(d);
|
||||
random_access= caps->start_adr || role == 4;
|
||||
if(random_access)
|
||||
(*o)->emulation_mode= 1;
|
||||
if(caps->start_adr && !readonly) { /* set emulation to overwriteable */
|
||||
if(random_access && !readonly) { /* set emulation to overwriteable */
|
||||
ret= isoburn_is_intermediate_dvd_rw(d, 0);
|
||||
if(ret>0) {
|
||||
(*o)->min_start_byte= 0;
|
||||
(*o)->nwa= 0;
|
||||
(*o)->zero_nwa= 0;
|
||||
}
|
||||
if(flag&1) {
|
||||
if((flag & 1) && role != 4 && role != 5) {
|
||||
(*o)->nwa= (*o)->zero_nwa;
|
||||
(*o)->fabricated_disc_status= BURN_DISC_BLANK;
|
||||
} else {
|
||||
@ -327,6 +408,7 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
(*o)->emulation_mode= -1;
|
||||
goto ex;
|
||||
}
|
||||
emulation_started= 1;
|
||||
/* try to read emulated toc */
|
||||
ret= isoburn_emulate_toc(d, flag & 16);
|
||||
if(ret<0) {
|
||||
@ -338,8 +420,14 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
|
||||
/* >>> recognize unsuitable media (but allow read-only media) */;
|
||||
|
||||
if(readonly) {
|
||||
if(readonly && s != BURN_DISC_EMPTY) {
|
||||
|
||||
/* >>> ts B10712: This maps BURN_DISC_UNSUITABLE to BURN_DISC_FULL
|
||||
which can hardly be correct in general.
|
||||
??? What reason does this have ?
|
||||
*/
|
||||
(*o)->fabricated_disc_status= BURN_DISC_FULL;
|
||||
|
||||
/* This might be overwriteable media in a -ROM drive.
|
||||
Pitfall:
|
||||
Multi-session media which bear a xorriso image for overwriteables
|
||||
@ -356,7 +444,8 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
for(session_no= 0; session_no < num_sessions; session_no++) {
|
||||
tracks= isoburn_toc_session_get_tracks(sessions[session_no],
|
||||
&num_tracks);
|
||||
track_count+= num_tracks;
|
||||
if(tracks != NULL)
|
||||
track_count+= num_tracks;
|
||||
}
|
||||
isoburn_toc_disc_free(disc);
|
||||
}
|
||||
@ -367,6 +456,12 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
if((flag & 16) || track_count >= 2) {
|
||||
ret= 0; /* toc emulation off, or not overwriteable */
|
||||
} else {
|
||||
ret= isoburn_start_emulation(*o, 1);
|
||||
if(ret<=0) {
|
||||
(*o)->emulation_mode= -1;
|
||||
goto ex;
|
||||
}
|
||||
emulation_started= 1;
|
||||
ret= isoburn_emulate_toc(d, 1);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
@ -379,6 +474,13 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
CD-R TOC (profile 0x08) can be trusted. Others not.
|
||||
Do a scan search of ISO headers.
|
||||
*/
|
||||
if(!emulation_started) {
|
||||
ret= isoburn_start_emulation(*o, 1);
|
||||
if(ret<=0) {
|
||||
(*o)->emulation_mode= -1;
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
ret= isoburn_emulate_toc(d, 1|2);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
@ -396,6 +498,8 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
ret= burn_disc_track_lba_nwa(d, NULL, 0, &lba, &nwa);
|
||||
if(ret>0)
|
||||
(*o)->nwa= nwa;
|
||||
if((*o)->nwa < (*o)->zero_nwa)
|
||||
(*o)->zero_nwa= 0;
|
||||
#endif
|
||||
|
||||
}
|
||||
@ -427,26 +531,19 @@ int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],
|
||||
{
|
||||
int ret, drive_grabbed= 0;
|
||||
struct isoburn *o= NULL;
|
||||
|
||||
#ifndef NIX
|
||||
|
||||
/* <<< should be obsolete by new drive addressing of libburn-0.5.2 */
|
||||
/* >>> but helps with kernel 2.4 to use /dev/sr */
|
||||
|
||||
int conv_ret;
|
||||
char libburn_drive_adr[BURN_DRIVE_ADR_LEN];
|
||||
char *libburn_drive_adr= NULL;
|
||||
|
||||
/* Should be obsolete by new drive addressing of libburn-0.5.2 */
|
||||
/* but helps with kernel 2.4 to use /dev/sr */
|
||||
libburn_drive_adr= calloc(1, BURN_DRIVE_ADR_LEN);
|
||||
if(libburn_drive_adr == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
conv_ret= burn_drive_convert_fs_adr(adr, libburn_drive_adr);
|
||||
if(conv_ret<=0)
|
||||
strcpy(libburn_drive_adr, adr);
|
||||
|
||||
ret= burn_drive_scan_and_grab(drive_infos, libburn_drive_adr, flag&1);
|
||||
|
||||
#else
|
||||
|
||||
ret= burn_drive_scan_and_grab(drive_infos, adr, flag & 1);
|
||||
|
||||
#endif /* ! NIX */
|
||||
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
drive_grabbed= 1;
|
||||
@ -468,6 +565,8 @@ ex:
|
||||
burn_drive_release((*drive_infos)[0].drive, 0);
|
||||
isoburn_destroy(&o, 0);
|
||||
}
|
||||
if(libburn_drive_adr != NULL)
|
||||
free(libburn_drive_adr);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
@ -562,12 +661,19 @@ int isoburn_disc_erasable(struct burn_drive *d)
|
||||
|
||||
void isoburn_disc_erase(struct burn_drive *drive, int fast)
|
||||
{
|
||||
int ret, do_pseudo_blank= 0;
|
||||
int ret, do_pseudo_blank= 0, role;
|
||||
struct isoburn *o;
|
||||
enum burn_disc_status s;
|
||||
char zero_buffer[Libisoburn_target_head_sizE];
|
||||
char *zero_buffer= NULL;
|
||||
struct burn_multi_caps *caps= NULL;
|
||||
|
||||
zero_buffer= calloc(1, Libisoburn_target_head_sizE);
|
||||
if(zero_buffer == NULL) {
|
||||
/* To cause a negative reply with burn_drive_wrote_well() */
|
||||
burn_drive_cancel(drive);
|
||||
goto ex;
|
||||
}
|
||||
|
||||
ret= isoburn_find_emulator(&o, drive, 0);
|
||||
if(ret>0) {
|
||||
if(o->emulation_mode==-1) {
|
||||
@ -575,7 +681,15 @@ void isoburn_disc_erase(struct burn_drive *drive, int fast)
|
||||
burn_drive_cancel(drive);
|
||||
goto ex;
|
||||
}
|
||||
|
||||
role = burn_drive_get_drive_role(drive);
|
||||
if (role == 5) {
|
||||
/* libburn will truncate the random-access write-only file
|
||||
to zero size and change its state */
|
||||
burn_disc_erase(drive, fast);
|
||||
o->fabricated_disc_status= burn_disc_get_status(drive);
|
||||
o->nwa= o->zero_nwa= 0;
|
||||
goto ex;
|
||||
}
|
||||
if(o->emulation_mode > 0) { /* might be readonly with emulated sessions */
|
||||
ret= burn_disc_get_multi_caps(drive, BURN_WRITE_NONE, &caps, 0);
|
||||
if(ret > 0 && caps->start_adr)
|
||||
@ -599,6 +713,8 @@ void isoburn_disc_erase(struct burn_drive *drive, int fast)
|
||||
ex:;
|
||||
if(caps!=NULL)
|
||||
burn_disc_free_multi_caps(&caps);
|
||||
if(zero_buffer != NULL)
|
||||
free(zero_buffer);
|
||||
}
|
||||
|
||||
|
||||
@ -668,6 +784,7 @@ int isoburn_disc_track_lba_nwa(struct burn_drive *d,
|
||||
{
|
||||
int ret;
|
||||
struct isoburn *o;
|
||||
enum burn_disc_status s;
|
||||
|
||||
#ifdef Hardcoded_cd_rW
|
||||
/* <<< A70929 : hardcoded CD-RW with fabricated -msinfo */
|
||||
@ -687,6 +804,10 @@ int isoburn_disc_track_lba_nwa(struct burn_drive *d,
|
||||
}
|
||||
if(burn_drive_get_drive_role(d) != 1)
|
||||
return(1);
|
||||
|
||||
s= isoburn_disc_get_status(d);
|
||||
if(s == BURN_DISC_BLANK) /* We do not believe in anything but nwa = lba = 0 */
|
||||
return(1);
|
||||
return(burn_disc_track_lba_nwa(d, opts, trackno, lba, nwa));
|
||||
}
|
||||
|
||||
@ -707,6 +828,29 @@ int isoburn_get_msc2(struct isoburn *o,
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* @param flag bit0= truncate (else do not truncate)
|
||||
bit1= do not warn if call is inappropriate to drive
|
||||
bit2= only set if truncation is currently enabled
|
||||
*/
|
||||
int isoburn_set_truncate(struct burn_drive *drive, int flag)
|
||||
{
|
||||
int ret;
|
||||
struct isoburn *o;
|
||||
|
||||
ret= isoburn_find_emulator(&o, drive, 0);
|
||||
if(ret < 0)
|
||||
return ret;
|
||||
if(o == NULL) {
|
||||
if(!(flag & (2 | 4)))
|
||||
isoburn_msgs_submit(o, 0x00060000,
|
||||
"Drive type or role is inappropriate for truncation", 0, "WARNING", 0);
|
||||
return(0);
|
||||
}
|
||||
if(o->truncate || !(flag & 4))
|
||||
o->truncate= flag & 1;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||
{
|
||||
@ -714,15 +858,24 @@ void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||
off_t nwa= 0;
|
||||
struct isoburn *o;
|
||||
struct burn_drive *drive;
|
||||
char reasons[BURN_REASONS_LEN],msg[160+BURN_REASONS_LEN];
|
||||
char adr[BURN_DRIVE_ADR_LEN];
|
||||
char *reasons= NULL, *msg= NULL, *adr= NULL;
|
||||
enum burn_write_types write_type;
|
||||
struct stat stbuf;
|
||||
|
||||
drive= burn_write_opts_get_drive(opts);
|
||||
|
||||
reasons= calloc(1, BURN_REASONS_LEN);
|
||||
msg= calloc(1, 160+BURN_REASONS_LEN);
|
||||
adr= calloc(1, BURN_DRIVE_ADR_LEN);
|
||||
if(reasons == NULL || msg == NULL || adr == NULL) {
|
||||
/* To cause a negative reply with burn_drive_wrote_well() */
|
||||
burn_drive_cancel(drive);
|
||||
goto ex;
|
||||
}
|
||||
|
||||
ret= isoburn_find_emulator(&o, drive, 0);
|
||||
if(ret<0)
|
||||
return;
|
||||
goto ex;
|
||||
if(o!=NULL) {
|
||||
o->wrote_well= -1;
|
||||
if(o->emulation_mode!=0) {
|
||||
@ -752,10 +905,9 @@ void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||
"It might help to first deformat it and then format it again");
|
||||
isoburn_msgs_submit(o, 0x00060000, msg, 0, "HINT", 0);
|
||||
burn_drive_cancel(drive); /* mark run as failure */
|
||||
return;
|
||||
goto ex;
|
||||
}
|
||||
/* end of DVD-RW oriented check */
|
||||
|
||||
burn_write_opts_set_start_byte(opts, nwa * (off_t) 2048);
|
||||
}
|
||||
}
|
||||
@ -769,7 +921,7 @@ void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||
o->wrote_well= 0;
|
||||
/* To cause a negative reply with burn_drive_wrote_well() */
|
||||
burn_drive_cancel(drive);
|
||||
return;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
sprintf(reasons, "%d", (int) write_type);
|
||||
@ -787,18 +939,26 @@ void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||
|
||||
if(o->truncate) {
|
||||
ret= burn_drive_get_drive_role(drive);
|
||||
if(ret==2) {
|
||||
if(ret == 2 || ret == 5) {
|
||||
ret= burn_drive_d_get_adr(drive, adr);
|
||||
if(ret>0) {
|
||||
ret= lstat(adr, &stbuf);
|
||||
if(ret!=-1)
|
||||
if(S_ISREG(stbuf.st_mode))
|
||||
truncate(adr, nwa * (off_t) 2048);
|
||||
ret= truncate(adr, nwa * (off_t) 2048);
|
||||
/* (result of truncate intentionally ignored) */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
burn_disc_write(opts, disc);
|
||||
ex:;
|
||||
if(reasons != NULL)
|
||||
free(reasons);
|
||||
if(msg != NULL)
|
||||
free(msg);
|
||||
if(adr != NULL)
|
||||
free(adr);
|
||||
}
|
||||
|
||||
|
||||
@ -863,6 +1023,8 @@ int isoburn_set_start_byte(struct isoburn *o, off_t value, int flag)
|
||||
if(value % caps->start_alignment)
|
||||
value+= caps->start_alignment - (value % caps->start_alignment);
|
||||
o->nwa= value/2048;
|
||||
if(o->nwa < o->zero_nwa)
|
||||
o->zero_nwa= 0;
|
||||
/* If suitable for media alignment, round up to Libisoburn_nwa_alignemenT */
|
||||
if((o->nwa % Libisoburn_nwa_alignemenT) &&
|
||||
((Libisoburn_nwa_alignemenT*2048) % caps->start_alignment)==0 )
|
||||
@ -1065,30 +1227,48 @@ int isoburn_read_iso_head_parse(struct burn_drive *d, unsigned char *data,
|
||||
int isoburn_read_iso_head(struct burn_drive *d, int lba,
|
||||
int *image_blocks, char *info, int flag)
|
||||
{
|
||||
unsigned char buffer[64*1024];
|
||||
unsigned char *buffer= NULL;
|
||||
int ret, info_mode, capacity, role;
|
||||
off_t data_count;
|
||||
off_t data_count, to_read;
|
||||
struct isoburn *o;
|
||||
|
||||
buffer= calloc(1, 64 * 1024);
|
||||
if(buffer == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
|
||||
info_mode= flag&255;
|
||||
*image_blocks= 0;
|
||||
if(flag&(1<<13)) {
|
||||
memcpy(buffer, info, 64*1024);
|
||||
} else {
|
||||
memset(buffer, 0, 64 * 1024);
|
||||
role = burn_drive_get_drive_role(d);
|
||||
if (role == 3 || role == 5)
|
||||
|
||||
/* >>> ??? return always 0 ? */
|
||||
{ret= (-1*!!(flag&(1<<15))); goto ex;}
|
||||
|
||||
ret = burn_get_read_capacity(d, &capacity, 0);
|
||||
if (ret <= 0 && role == 2) {
|
||||
if (ret <= 0 && (role == 2 || role == 4)) {
|
||||
/* Might be a block device on a system where libburn cannot determine its
|
||||
size. Try to read anyway. */
|
||||
capacity = 0x7ffffff0;
|
||||
ret = 1;
|
||||
}
|
||||
if(ret > 0 && (off_t) capacity * (off_t) 2048 >= (off_t) (64 * 1024)) {
|
||||
to_read= (off_t) capacity * ((off_t) 2048);
|
||||
if(ret > 0 && to_read >= (off_t) (36 * 1024)) {
|
||||
ret= isoburn_find_emulator(&o, d, 0);
|
||||
if(ret > 0)
|
||||
if(o->media_read_error)
|
||||
{ret= (-1 * !!(flag & (1 << 15))); goto ex;}
|
||||
if(to_read >= (off_t) (64 * 1024))
|
||||
to_read= 64 * 1024;
|
||||
ret = burn_read_data(d, ((off_t) lba) * (off_t) 2048, (char *) buffer,
|
||||
(off_t) 64*1024, &data_count, 2); /* no error messages */
|
||||
} else
|
||||
ret= 0;
|
||||
to_read, &data_count, 2); /* no error messages */
|
||||
} else
|
||||
ret= 0;
|
||||
if(ret<=0)
|
||||
return(-1*!!(flag&(1<<15)));
|
||||
{ret= (-1*!!(flag&(1<<15))); goto ex;}
|
||||
if(info_mode==2)
|
||||
memcpy(info, buffer, 64*1024);
|
||||
}
|
||||
@ -1096,15 +1276,19 @@ int isoburn_read_iso_head(struct burn_drive *d, int lba,
|
||||
if(flag&(1<<14)) {
|
||||
ret= isoburn_read_iso_head_parse(d, buffer, image_blocks, info, info_mode);
|
||||
if(ret<0)
|
||||
return(ret);
|
||||
goto ex;
|
||||
if(ret>0)
|
||||
return(2);
|
||||
{ret= 2; goto ex;}
|
||||
}
|
||||
ret= isoburn_read_iso_head_parse(d, buffer+32*1024, image_blocks, info,
|
||||
info_mode);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
return(1);
|
||||
goto ex;
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(buffer != NULL)
|
||||
free(buffer);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
@ -1150,29 +1334,35 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
|
||||
int scan_start= 0, scan_count= 0, probe_minus_16= 0, growisofs_nwa, role;
|
||||
int with_enclosure= 0, readable_blocks= -1;
|
||||
struct isoburn *o;
|
||||
char msg[160], size_text[80], *sev, volid[33], *volid_pt= NULL;
|
||||
char *msg= NULL, *size_text= NULL, *sev, volid[33], *volid_pt= NULL;
|
||||
time_t start_time, last_pacifier, now;
|
||||
|
||||
msg= calloc(1, 160);
|
||||
size_text= calloc(1, 80);
|
||||
if(msg == NULL || size_text == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
|
||||
/* is the media emulated multi-session ? */
|
||||
ret= isoburn_find_emulator(&o, d, 0);
|
||||
if(ret<0)
|
||||
return(-1);
|
||||
{ret= -1; goto ex;}
|
||||
if(o==NULL)
|
||||
return(-1);
|
||||
{ret= -1; goto ex;}
|
||||
if(o->emulation_mode<=0 && !(flag&1))
|
||||
return(0);
|
||||
{ret= 0; goto ex;}
|
||||
|
||||
ret= burn_get_read_capacity(d, &readable_blocks, 0);
|
||||
if(ret <= 0) {
|
||||
|
||||
role = burn_drive_get_drive_role(d);
|
||||
if (role == 2)
|
||||
if (role == 2 || role == 4)
|
||||
/* Might be a block device on a system where libburn cannot determine its
|
||||
size. Try to read anyway. */
|
||||
readable_blocks= 0x7ffffff0; /* try to read anyway */
|
||||
else
|
||||
readable_blocks= -1;
|
||||
}
|
||||
if(o->fabricated_disc_status == BURN_DISC_BLANK)
|
||||
{ret= 0; goto failure;}
|
||||
|
||||
start_time= last_pacifier= time(NULL);
|
||||
lba= 0;
|
||||
@ -1180,7 +1370,7 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
|
||||
ret= isoburn_read_iso_head(d, lba, &image_size, NULL, 0);
|
||||
if(ret<=0)
|
||||
{ret= 0; goto failure;}
|
||||
lba= Libisoburn_overwriteable_starT;
|
||||
lba= o->target_iso_head_size / 2048;
|
||||
with_enclosure= 1;
|
||||
if((flag & 16) && o->emulation_mode == 1) {
|
||||
ret= 1;
|
||||
@ -1207,7 +1397,7 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
|
||||
/* growisofs aligns to 16 rather than 32. Overwriteable TOC emulation
|
||||
relies on not accidentially seeing inter-session trash data.
|
||||
But one can safely access 16 blocks earlier because a xorriso header
|
||||
would have overwritten with the unused 16 blocks at its start.
|
||||
would have been overwritten with the unused 16 blocks at its start.
|
||||
If libisoburn alignment would increase, then this would not be
|
||||
possible any more.
|
||||
*/
|
||||
@ -1286,7 +1476,7 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
|
||||
sprintf(msg, "Found %d ISO sessions by scanning %s in %.f seconds",
|
||||
session_count, size_text, (double) (now - start_time));
|
||||
isoburn_msgs_submit(o, 0x00060000, msg, 0, sev, 0);
|
||||
return(1);
|
||||
{ret= 1; goto ex;}
|
||||
failure:;
|
||||
isoburn_toc_entry_destroy(&(o->toc), 1);
|
||||
if(with_enclosure && o->emulation_mode == 1) {
|
||||
@ -1299,6 +1489,11 @@ failure:;
|
||||
session_count= 0;
|
||||
ret= isoburn_make_toc_entry(o, &session_count, 0, image_size, NULL, 0);
|
||||
}
|
||||
ex:;
|
||||
if(msg != NULL)
|
||||
free(msg);
|
||||
if(size_text != NULL)
|
||||
free(size_text);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
@ -1633,10 +1828,10 @@ int isoburn_drive_set_msgs_submit(struct burn_drive *d,
|
||||
int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
||||
int flag)
|
||||
{
|
||||
int ret, num_sessions, num_tracks, adr_num, i, j, total_tracks;
|
||||
int ret, num_sessions= 0, num_tracks, adr_num, i, j, total_tracks;
|
||||
int lba, best_lba, size, re_valid= 0, track_count= 0;
|
||||
time_t start_time= 0, last_pacifier= 0, now;
|
||||
char volid[33], msg[160];
|
||||
char volid[33], *msg= NULL;
|
||||
struct isoburn *o;
|
||||
struct isoburn_toc_disc *disc= NULL;
|
||||
struct isoburn_toc_session **sessions= NULL;
|
||||
@ -1645,6 +1840,7 @@ int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
||||
static int max_mode_names= 4;
|
||||
regex_t re;
|
||||
regmatch_t match[1];
|
||||
enum burn_disc_status s;
|
||||
|
||||
ret= isoburn_find_emulator(&o, d, 0);
|
||||
if(ret<0)
|
||||
@ -1652,6 +1848,10 @@ int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
||||
if(o==NULL)
|
||||
return(-1);
|
||||
|
||||
msg= calloc(1, 160);
|
||||
if(msg == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
|
||||
start_time= last_pacifier= time(NULL);
|
||||
adr_num= atoi(adr_value);
|
||||
if(adr_mode!=3 || (flag & 2)) {
|
||||
@ -1705,6 +1905,14 @@ not_found:;
|
||||
|
||||
} else if(adr_mode==3) {
|
||||
o->fabricated_msc1= adr_num;
|
||||
s= isoburn_disc_get_status(d);
|
||||
if(o->fabricated_msc1 > 0 && s != BURN_DISC_FULL
|
||||
&& s != BURN_DISC_APPENDABLE) {
|
||||
isoburn_msgs_submit(o, 0x00060000,
|
||||
"Non-zero load offset given with blank input media",
|
||||
0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
if((flag & 1) && o->fabricated_msc1 >= 16) {
|
||||
/* adr_num is possibly 16 blocks too high */
|
||||
ret= isoburn_read_iso_head(d, o->fabricated_msc1, &size,volid, 1|(1<<14));
|
||||
@ -1778,6 +1986,8 @@ ex:;
|
||||
isoburn_toc_disc_free(disc);
|
||||
if((flag & 4) && re_valid)
|
||||
regfree(&re);
|
||||
if(msg != NULL)
|
||||
free(msg);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
@ -1833,6 +2043,8 @@ int isoburn_get_mount_params(struct burn_drive *d,
|
||||
|
||||
ex:;
|
||||
o->fabricated_msc1= msc1_mem;
|
||||
if(disc != NULL)
|
||||
isoburn_toc_disc_free(disc);
|
||||
return(2 - is_iso);
|
||||
}
|
||||
|
||||
|
@ -3,8 +3,13 @@
|
||||
|
||||
Copyright 2007 - 2010 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
@ -59,6 +64,20 @@ struct isoburn_cached_drive {
|
||||
struct burn_drive *drive;
|
||||
struct isoburn_cache_tile tiles[Libisoburn_cache_tileS];
|
||||
int current_age;
|
||||
|
||||
/**
|
||||
Offset to be applied to all block addresses to compensate for an
|
||||
eventual displacement of the block addresses relative to the image
|
||||
start block address that was assumed when the image was created.
|
||||
E.g. if track number 2 gets copied into a disk file and shall then
|
||||
be loaded as ISO filesystem.
|
||||
If displacement_sign is 1 then the displacement number will be
|
||||
added to .read_block() addresses, if -1 it will be subtracted.
|
||||
Else it will be ignored.
|
||||
*/
|
||||
uint32_t displacement;
|
||||
int displacement_sign;
|
||||
|
||||
};
|
||||
|
||||
#define Libisoburn_max_agE 2000000000
|
||||
@ -100,6 +119,19 @@ int ds_read_block(IsoDataSource *src, uint32_t lba, uint8_t *buffer)
|
||||
|
||||
tiles = (struct isoburn_cache_tile *) icd->tiles;
|
||||
|
||||
if(icd->displacement_sign == 1) {
|
||||
if(lba + icd->displacement < lba) {
|
||||
address_rollover:;
|
||||
return ISO_DISPLACE_ROLLOVER;
|
||||
} else
|
||||
lba += icd->displacement;
|
||||
} else if(icd->displacement_sign == -1) {
|
||||
if(lba < icd->displacement )
|
||||
goto address_rollover;
|
||||
else
|
||||
lba -= icd->displacement;
|
||||
}
|
||||
|
||||
aligned_lba= lba & ~(Libisoburn_tile_blockS - 1);
|
||||
|
||||
for(i=0; i<Libisoburn_cache_tileS; i++) {
|
||||
@ -146,30 +178,10 @@ int ds_read_block(IsoDataSource *src, uint32_t lba, uint8_t *buffer)
|
||||
if (ret > 0)
|
||||
return 1;
|
||||
tiles[oldest].last_error_lba = lba;
|
||||
|
||||
#ifdef ISO_DATA_SOURCE_MISHAP
|
||||
ret= ISO_DATA_SOURCE_MISHAP;
|
||||
#else
|
||||
/* <<< pre libisofs-0.6.7 */
|
||||
/* It is not required by the specs of libisofs but implicitely assumed
|
||||
...
|
||||
But it is not possible to ignore FAILURE.
|
||||
libisofs insists in original error codes, i.e. libisoburn cannot
|
||||
change severity FAILURE associated with ISO_FILE_READ_ERROR.
|
||||
So ISO_FILE_READ_ERROR is not an option and libisoburn has to
|
||||
misuse ISO_FILE_CANT_WRITE, which is actually for image generation
|
||||
and not for image reading.
|
||||
This is quite wrong, although the error message text is unclear
|
||||
enough to make it appear plausible.
|
||||
*/
|
||||
ret= ISO_FILE_CANT_WRITE;
|
||||
#endif
|
||||
|
||||
if(ret >= 0)
|
||||
ret = -1;
|
||||
sprintf(msg, "ds_read_block(%lu) returns %d", (unsigned long) lba, ret);
|
||||
sprintf(msg, "ds_read_block(%lu) returns %lX",
|
||||
(unsigned long) lba, (unsigned long) ret);
|
||||
isoburn_msgs_submit(NULL, 0x00060000, msg, 0, "DEBUG", 0);
|
||||
return ret;
|
||||
return ISO_DATA_SOURCE_MISHAP;
|
||||
}
|
||||
|
||||
#ifdef Libisoburn_read_cache_reporT
|
||||
@ -221,7 +233,8 @@ int isoburn_data_source_shutdown(IsoDataSource *src, int flag)
|
||||
}
|
||||
|
||||
|
||||
IsoDataSource *isoburn_data_source_new(struct burn_drive *d)
|
||||
IsoDataSource *isoburn_data_source_new(struct burn_drive *d,
|
||||
uint32_t displacement, int displacement_sign)
|
||||
{
|
||||
IsoDataSource *ret;
|
||||
struct isoburn_cached_drive *icd= NULL;
|
||||
@ -233,6 +246,7 @@ IsoDataSource *isoburn_data_source_new(struct burn_drive *d)
|
||||
icd = calloc(1,sizeof(struct isoburn_cached_drive));
|
||||
if (ret == NULL || icd == NULL)
|
||||
return NULL;
|
||||
ret->version = 0;
|
||||
ret->refcount = 1;
|
||||
ret->read_block = ds_read_block;
|
||||
ret->open = ds_open;
|
||||
@ -248,6 +262,8 @@ IsoDataSource *isoburn_data_source_new(struct burn_drive *d)
|
||||
icd->tiles[i].last_aligned_error_lba = 0xffffffff;
|
||||
icd->tiles[i].age= 0;
|
||||
}
|
||||
icd->displacement = displacement;
|
||||
icd->displacement_sign = displacement_sign;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -8,8 +8,14 @@
|
||||
|
||||
Copyright 2007 - 2010 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
/* ( derived from stub generated by CgeN on Sat, 01 Sep 2007 12:04:36 GMT ) */
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -109,7 +115,7 @@ struct isoburn *isoburn_list_start= NULL;
|
||||
int isoburn_new(struct isoburn **objpt, int flag)
|
||||
{
|
||||
struct isoburn *o;
|
||||
int i, ret;
|
||||
int ret;
|
||||
|
||||
*objpt= o= (struct isoburn *) malloc(sizeof(struct isoburn));
|
||||
if(o==NULL) {
|
||||
@ -129,10 +135,12 @@ int isoburn_new(struct isoburn **objpt, int flag)
|
||||
o->truncate= 0;
|
||||
o->iso_source= NULL;
|
||||
o->fabricated_disc_status= BURN_DISC_UNREADY;
|
||||
o->media_read_error= 0;
|
||||
o->toc= NULL;
|
||||
o->wrote_well= -1;
|
||||
for(i=0;i<Libisoburn_target_head_sizE;i++)
|
||||
o->target_iso_head[i]= 0;
|
||||
o->loaded_partition_offset= 0;
|
||||
o->target_iso_head_size= Libisoburn_target_head_sizE;
|
||||
o->target_iso_head= NULL;
|
||||
o->image= NULL;
|
||||
o->iso_data_source= NULL;
|
||||
o->read_pacifier= NULL;
|
||||
@ -142,9 +150,15 @@ int isoburn_new(struct isoburn **objpt, int flag)
|
||||
o->msgs_submit_flag= 0;
|
||||
o->prev= NULL;
|
||||
o->next= NULL;
|
||||
o->target_iso_head= calloc(1, o->target_iso_head_size);
|
||||
if(o->target_iso_head == NULL) {
|
||||
isoburn_report_iso_error(ISO_OUT_OF_MEM, "Cannot allocate overwrite buffer",
|
||||
0, "FATAL", 0);
|
||||
goto failed;
|
||||
}
|
||||
ret= iso_image_new("ISOIMAGE", &o->image);
|
||||
if(ret<0) {
|
||||
isoburn_report_iso_error(ret, "Cannot create image", 0, "FATAL", 0);
|
||||
isoburn_report_iso_error(ret, "Cannot create image object", 0, "FATAL", 0);
|
||||
goto failed;
|
||||
}
|
||||
isoburn_link(o, isoburn_list_start, 1);
|
||||
@ -182,6 +196,8 @@ int isoburn_destroy(struct isoburn **objpt, int flag)
|
||||
burn_source_free(o->iso_source);
|
||||
if(o->iso_data_source!=NULL)
|
||||
iso_data_source_unref(o->iso_data_source);
|
||||
if(o->target_iso_head != NULL)
|
||||
free(o->target_iso_head);
|
||||
free((char *) o);
|
||||
*objpt= NULL;
|
||||
return(1);
|
||||
@ -340,6 +356,38 @@ int isoburn_msgs_submit(struct isoburn *o, int error_code, char msg_text[],
|
||||
}
|
||||
|
||||
|
||||
/** Check whether the size of target_iso_head matches the given partition
|
||||
offset. Eventually adjust size.
|
||||
*/
|
||||
int isoburn_adjust_target_iso_head(struct isoburn *o,
|
||||
uint32_t offst, int flag)
|
||||
{
|
||||
uint8_t *new_buf;
|
||||
uint32_t new_size;
|
||||
|
||||
if((uint32_t) o->target_iso_head_size ==
|
||||
Libisoburn_target_head_sizE + 2048 * offst)
|
||||
return(1);
|
||||
new_size= Libisoburn_target_head_sizE + 2048 * offst;
|
||||
new_buf= calloc(1, new_size);
|
||||
if(new_buf == NULL) {
|
||||
isoburn_msgs_submit(o, 0x00060000,
|
||||
"Cannot re-allocate overwrite buffer", 0, "FATAL", 0);
|
||||
return(-1);
|
||||
}
|
||||
memcpy(new_buf, o->target_iso_head,
|
||||
(uint32_t) o->target_iso_head_size < new_size ?
|
||||
(uint32_t) o->target_iso_head_size : new_size);
|
||||
free(o->target_iso_head);
|
||||
o->target_iso_head= new_buf;
|
||||
o->target_iso_head_size= new_size;
|
||||
if(o->nwa == o->zero_nwa)
|
||||
o->nwa= Libisoburn_overwriteable_starT + offst;
|
||||
o->zero_nwa= Libisoburn_overwriteable_starT + offst;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= modifying rather than growing
|
||||
bit1= prepare for early release of input drive:
|
||||
wait until input and then disable image data source
|
||||
@ -358,7 +406,11 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
|
||||
int ret, fifo_chunks, lba, nwa, i, new_img, early_indev_release;
|
||||
uint32_t data_start= -1;
|
||||
size_t buffer_size= 0, buffer_free= 0;
|
||||
char msg[160];
|
||||
char *msg= NULL;
|
||||
|
||||
msg= calloc(1, 160);
|
||||
if(msg == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
|
||||
new_img= flag&1;
|
||||
early_indev_release= flag&2;
|
||||
@ -392,6 +444,12 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
|
||||
0, "FAILURE", 0);
|
||||
{ret= -2; goto ex;}
|
||||
}
|
||||
if (state != BURN_DISC_BLANK && opts->libjte_handle != NULL) {
|
||||
isoburn_msgs_submit(out_o, 0x00060000,
|
||||
"Jigdo Template Extraction works only on blank target media",
|
||||
0, "FAILURE", 0);
|
||||
{ret= -2; goto ex;}
|
||||
}
|
||||
|
||||
fifo_chunks= 32;
|
||||
if(opts->fifo_size >= 64*1024 && opts->fifo_size <= 1024.0 * 1024.0 * 1024.0){
|
||||
@ -405,21 +463,18 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
|
||||
isoburn_report_iso_error(ret, "Cannot create iso_write_opts", 0, "FATAL",0);
|
||||
goto ex;
|
||||
}
|
||||
iso_write_opts_set_will_cancel(wopts, opts->will_cancel);
|
||||
iso_write_opts_set_iso_level(wopts, opts->level);
|
||||
iso_write_opts_set_rockridge(wopts, opts->rockridge);
|
||||
iso_write_opts_set_joliet(wopts, opts->joliet);
|
||||
iso_write_opts_set_iso1999(wopts, opts->iso1999);
|
||||
|
||||
/* <<< #ifdef shall be removed when libisofs-0.6.20 is released */
|
||||
#ifdef Libisofs_hardlink_prooF
|
||||
|
||||
iso_write_opts_set_hardlinks(wopts, opts->hardlinks);
|
||||
if(opts->hardlinks)
|
||||
iso_write_opts_set_rrip_1_10_px_ino(wopts, 1);
|
||||
|
||||
#endif
|
||||
|
||||
iso_write_opts_set_aaip(wopts, opts->aaip);
|
||||
iso_write_opts_set_old_empty(wopts, !!opts->old_empty);
|
||||
iso_write_opts_set_untranslated_name_len(wopts, opts->untranslated_name_len);
|
||||
iso_write_opts_set_allow_dir_id_ext(wopts, opts->allow_dir_id_ext);
|
||||
iso_write_opts_set_omit_version_numbers(wopts, opts->omit_version_numbers);
|
||||
iso_write_opts_set_allow_deep_paths(wopts, opts->allow_deep_paths);
|
||||
iso_write_opts_set_allow_longer_paths(wopts, opts->allow_longer_paths);
|
||||
@ -429,6 +484,7 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
|
||||
iso_write_opts_set_allow_full_ascii(wopts, opts->allow_full_ascii);
|
||||
iso_write_opts_set_relaxed_vol_atts(wopts, 1);
|
||||
iso_write_opts_set_joliet_longer_paths(wopts, opts->joliet_longer_paths);
|
||||
iso_write_opts_set_joliet_long_names(wopts, opts->joliet_long_names);
|
||||
iso_write_opts_set_always_gmt(wopts, opts->always_gmt);
|
||||
iso_write_opts_set_rrip_version_1_10(wopts, opts->rrip_version_1_10);
|
||||
iso_write_opts_set_dir_rec_mtime(wopts, opts->dir_rec_mtime);
|
||||
@ -447,19 +503,69 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
|
||||
iso_write_opts_set_default_gid(wopts, opts->gid);
|
||||
iso_write_opts_set_output_charset(wopts, opts->output_charset);
|
||||
iso_write_opts_set_fifo_size(wopts, fifo_chunks);
|
||||
ret = iso_write_opts_set_system_area(wopts, opts->system_area_data,
|
||||
opts->system_area_options, 0);
|
||||
if (ret < 0) {
|
||||
isoburn_report_iso_error(ret, "Cannot set content of System Area",
|
||||
0, "FAILURE", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
iso_write_opts_set_pvd_times(wopts,
|
||||
opts->vol_creation_time, opts->vol_modification_time,
|
||||
opts->vol_expiration_time, opts->vol_effective_time,
|
||||
opts->vol_uuid);
|
||||
iso_write_opts_attach_jte(wopts, opts->libjte_handle);
|
||||
|
||||
ret= isoburn_adjust_target_iso_head(out_o, opts->partition_offset, 0);
|
||||
if(ret <= 0)
|
||||
{ret= -1; goto ex;}
|
||||
if(out_o->nwa < out_o->zero_nwa)
|
||||
out_o->zero_nwa= 0;
|
||||
if(opts->no_emul_toc || opts->libjte_handle != NULL) {
|
||||
if(out_o->nwa == out_o->zero_nwa &&
|
||||
out_o->zero_nwa == Libisoburn_overwriteable_starT
|
||||
+ opts->partition_offset
|
||||
&& out_o->emulation_mode == 1) {
|
||||
out_o->nwa= 0;
|
||||
out_o->zero_nwa= 0;
|
||||
out_o->min_start_byte= 0;
|
||||
}
|
||||
}
|
||||
ret = isoburn_disc_track_lba_nwa(out_d, NULL, 0, &lba, &nwa);
|
||||
opts->effective_lba= nwa;
|
||||
ret= isoburn_get_msc2(out_o, NULL, &nwa, 0);
|
||||
if (ret != 1) {
|
||||
isoburn_msgs_submit(out_o, 0x00060000,
|
||||
"Cannot determine next writeable address", 0, "FAILURE", 0);
|
||||
|
||||
/* >>> NWA_V : If burn_next_track_damaged:
|
||||
??? Close track and session ?
|
||||
??? Issue a hint for a repair command ?
|
||||
*/;
|
||||
|
||||
{ret= -3; goto ex;}
|
||||
}
|
||||
iso_write_opts_set_ms_block(wopts, nwa);
|
||||
iso_write_opts_set_appendable(wopts, !new_img);
|
||||
iso_write_opts_set_overwrite_buf(wopts,
|
||||
nwa>0 ? out_o->target_iso_head : NULL);
|
||||
iso_write_opts_set_part_offset(wopts, opts->partition_offset,
|
||||
opts->partition_secs_per_head,
|
||||
opts->partition_heads_per_cyl);
|
||||
iso_write_opts_set_tail_blocks(wopts, opts->tail_blocks);
|
||||
for(i= 0; i < Libisoburn_max_appended_partitionS; i++) {
|
||||
if(opts->appended_partitions[i] == NULL)
|
||||
continue;
|
||||
ret= iso_write_opts_set_partition_img(wopts, i + 1,
|
||||
opts->appended_part_types[i],
|
||||
opts->appended_partitions[i], 0);
|
||||
if(ret < 0) {
|
||||
isoburn_report_iso_error(ret, "Cannot set path for appended partition",
|
||||
0, "FAILURE", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
}
|
||||
iso_write_opts_set_disc_label(wopts, opts->ascii_disc_label);
|
||||
|
||||
ret = iso_image_create_burn_source(in_o->image, wopts, &wsrc);
|
||||
if (ret < 0) {
|
||||
@ -516,6 +622,8 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
|
||||
ex:
|
||||
if(wopts!=NULL)
|
||||
{iso_write_opts_free(wopts); wopts= NULL;}
|
||||
if(msg != NULL)
|
||||
free(msg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -557,6 +665,7 @@ int isoburn_prepare_blind_grow(struct burn_drive *d, struct burn_disc **disc,
|
||||
o->nwa= o->zero_nwa= 0;
|
||||
else
|
||||
o->zero_nwa= 0;
|
||||
o->min_start_byte= 0;
|
||||
ret= isoburn_prepare_disc_aux(d, out_drive, disc, opts, 2);
|
||||
if (ret<=0)
|
||||
return ret;
|
||||
@ -673,6 +782,8 @@ int isoburn_ropt_new(struct isoburn_read_opts **new_o, int flag)
|
||||
o->hasElTorito= 0;
|
||||
o->size= 0;
|
||||
o->pretend_blank= 1;
|
||||
o->displacement= 0;
|
||||
o->displacement_sign= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
@ -698,7 +809,7 @@ int isoburn_ropt_set_extensions(struct isoburn_read_opts *o, int ext)
|
||||
o->noacl= !!(ext & 64);
|
||||
o->noea= !!(ext & 128);
|
||||
o->noino= !!(ext & 256);
|
||||
o->nomd5= !!(ext & 512);
|
||||
o->nomd5= (ext >> 9) & 3;
|
||||
return(1);
|
||||
}
|
||||
|
||||
@ -708,7 +819,7 @@ int isoburn_ropt_get_extensions(struct isoburn_read_opts *o, int *ext)
|
||||
*ext= (!!o->norock) | ((!!o->nojoliet)<<1) | ((!!o->noiso1999)<<2) |
|
||||
((!!o->preferjoliet)<<3) | ((!!o->pretend_blank)<<4) |
|
||||
((!!o->noaaip) << 5) | ((!!o->noacl) << 6) | ((!!o->noea) << 7) |
|
||||
((!!o->noino) << 8) | ((!!o->nomd5) << 9);
|
||||
((!!o->noino) << 8) | ((o->nomd5 & 3) << 9);
|
||||
return(1);
|
||||
}
|
||||
|
||||
@ -789,6 +900,24 @@ int isoburn_ropt_get_auto_incharset(struct isoburn_read_opts *o, int *mode)
|
||||
}
|
||||
|
||||
|
||||
int isoburn_ropt_set_displacement(struct isoburn_read_opts *o,
|
||||
uint32_t displacement, int displacement_sign)
|
||||
{
|
||||
o->displacement= displacement;
|
||||
o->displacement_sign= displacement_sign;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_ropt_get_displacement(struct isoburn_read_opts *o,
|
||||
uint32_t *displacement, int *displacement_sign)
|
||||
{
|
||||
*displacement= o->displacement;
|
||||
*displacement_sign= o->displacement_sign;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_ropt_get_size_what(struct isoburn_read_opts *o,
|
||||
uint32_t *size, int *has_what)
|
||||
{
|
||||
@ -809,6 +938,7 @@ int isoburn_ropt_get_size_what(struct isoburn_read_opts *o,
|
||||
int isoburn_igopt_new(struct isoburn_imgen_opts **new_o, int flag)
|
||||
{
|
||||
struct isoburn_imgen_opts *o;
|
||||
int i;
|
||||
|
||||
o= (*new_o)= calloc(1, sizeof(struct isoburn_imgen_opts));
|
||||
if(o==NULL) {
|
||||
@ -823,6 +953,12 @@ int isoburn_igopt_new(struct isoburn_imgen_opts **new_o, int flag)
|
||||
o->iso1999= 0;
|
||||
o->hardlinks= 0;
|
||||
o->aaip = 0;
|
||||
o->session_md5= 0;
|
||||
o->file_md5= 0;
|
||||
o->no_emul_toc= 0;
|
||||
o->old_empty= 0;
|
||||
o->untranslated_name_len = 0;
|
||||
o->allow_dir_id_ext = 0;
|
||||
o->omit_version_numbers= 0;
|
||||
o->allow_deep_paths= 1;
|
||||
o->allow_longer_paths= 0;
|
||||
@ -831,6 +967,7 @@ int isoburn_igopt_new(struct isoburn_imgen_opts **new_o, int flag)
|
||||
o->allow_lowercase= 0;
|
||||
o->allow_full_ascii= 0;
|
||||
o->joliet_longer_paths= 0;
|
||||
o->joliet_long_names= 0;
|
||||
o->always_gmt= 0;
|
||||
o->rrip_version_1_10= 0;
|
||||
o->dir_rec_mtime= 0;
|
||||
@ -848,14 +985,34 @@ int isoburn_igopt_new(struct isoburn_imgen_opts **new_o, int flag)
|
||||
o->fifo_size= 4*1024*1024;
|
||||
o->effective_lba= -1;
|
||||
o->data_start_lba= -1;
|
||||
o->system_area_data= NULL;
|
||||
o->system_area_options= 0;
|
||||
o->partition_offset= 0;
|
||||
o->partition_secs_per_head= 0;
|
||||
o->partition_heads_per_cyl= 0;
|
||||
o->vol_creation_time= 0;
|
||||
o->vol_modification_time= 0;
|
||||
o->vol_expiration_time= 0;
|
||||
o->vol_effective_time= 0;
|
||||
o->libjte_handle= NULL;
|
||||
o->tail_blocks= 0;
|
||||
for(i= 0; i < Libisoburn_max_appended_partitionS; i++) {
|
||||
o->appended_partitions[i]= NULL;
|
||||
o->appended_part_types[i]= 0;
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_destroy(struct isoburn_imgen_opts **o, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(*o==NULL)
|
||||
return(0);
|
||||
for(i= 0; i < Libisoburn_max_appended_partitionS; i++)
|
||||
if((*o)->appended_partitions[i] != NULL)
|
||||
free((*o)->appended_partitions[i]);
|
||||
free(*o);
|
||||
*o= NULL;
|
||||
return(1);
|
||||
@ -885,6 +1042,9 @@ int isoburn_igopt_set_extensions(struct isoburn_imgen_opts *o, int ext)
|
||||
o->aaip= !!(ext & 32);
|
||||
o->session_md5= !!(ext & 64);
|
||||
o->file_md5= (ext & (128 | 256)) >> 7;
|
||||
o->no_emul_toc= !!(ext & 512);
|
||||
o->will_cancel= !!(ext & 1024);
|
||||
o->old_empty= !!(ext & 2048);
|
||||
return(1);
|
||||
}
|
||||
|
||||
@ -893,18 +1053,22 @@ int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext)
|
||||
{
|
||||
*ext= (!!o->rockridge) | ((!!o->joliet)<<1) | ((!!o->iso1999)<<2) |
|
||||
((!!o->hardlinks) << 3) | ((!!o->aaip) << 5) |
|
||||
((!!o->session_md5) << 6) | ((o->file_md5 & 3) << 7);
|
||||
((!!o->session_md5) << 6) | ((o->file_md5 & 3) << 7) |
|
||||
((!!o->no_emul_toc) << 9) | ((o->will_cancel) << 10) |
|
||||
((!!o->old_empty) << 11);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_set_relaxed(struct isoburn_imgen_opts *o, int relax)
|
||||
{
|
||||
o->omit_version_numbers= !!(relax&1);
|
||||
o->omit_version_numbers= (!!(relax&1)) |
|
||||
(2 * !!(relax & isoburn_igopt_only_iso_versions));
|
||||
o->allow_deep_paths= !!(relax&2);
|
||||
o->allow_longer_paths= !!(relax&4);
|
||||
o->max_37_char_filenames= !!(relax&8);
|
||||
o->no_force_dots= !!(relax&16);
|
||||
o->no_force_dots= (!!(relax&16)) |
|
||||
(2 * !!(relax & isoburn_igopt_no_j_force_dots));
|
||||
o->allow_lowercase= !!(relax&32);
|
||||
o->allow_full_ascii= !!(relax&64);
|
||||
o->joliet_longer_paths= !!(relax&128);
|
||||
@ -912,6 +1076,8 @@ int isoburn_igopt_set_relaxed(struct isoburn_imgen_opts *o, int relax)
|
||||
o->rrip_version_1_10= !!(relax & isoburn_igopt_rrip_version_1_10);
|
||||
o->dir_rec_mtime= !!(relax & isoburn_igopt_dir_rec_mtime);
|
||||
o->aaip_susp_1_10= !!(relax & isoburn_igopt_aaip_susp_1_10);
|
||||
o->allow_dir_id_ext= !!(relax & isoburn_igopt_allow_dir_id_ext);
|
||||
o->joliet_long_names= !!(relax & isoburn_igopt_joliet_long_names);
|
||||
return(1);
|
||||
}
|
||||
|
||||
@ -920,10 +1086,58 @@ int isoburn_igopt_get_relaxed(struct isoburn_imgen_opts *o, int *relax)
|
||||
{
|
||||
*relax= (!!o->omit_version_numbers) | ((!!o->allow_deep_paths)<<1) |
|
||||
((!!o->allow_longer_paths)<<2) | ((!!o->max_37_char_filenames)<<3) |
|
||||
((!!o->no_force_dots)<<4) | ((!!o->allow_lowercase)<<5) |
|
||||
((!!(o->no_force_dots & 1))<<4)| ((!!o->allow_lowercase)<<5) |
|
||||
((!!o->allow_full_ascii)<<6) | ((!!o->joliet_longer_paths)<<7) |
|
||||
((!!o->always_gmt)<<8) | ((!!o->rrip_version_1_10)<<9) |
|
||||
((!!o->dir_rec_mtime)<<10) | ((!!o->aaip_susp_1_10)<<11);
|
||||
((!!o->dir_rec_mtime)<<10) | ((!!o->aaip_susp_1_10)<<11) |
|
||||
((!!(o->omit_version_numbers & 2))<<12) |
|
||||
((!!(o->no_force_dots & 2))<<13) |
|
||||
((!!o->allow_dir_id_ext) << 14) |
|
||||
((!!o->joliet_long_names) << 15);
|
||||
return(1);
|
||||
}
|
||||
|
||||
int isoburn_igopt_set_untranslated_name_len(struct isoburn_imgen_opts *o,
|
||||
int len)
|
||||
{
|
||||
int ret;
|
||||
IsoWriteOpts *opts = NULL;
|
||||
char *msg= NULL;
|
||||
|
||||
msg= calloc(1, 160);
|
||||
if(msg == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
|
||||
ret= iso_write_opts_new(&opts, 0);
|
||||
if(ret < 0) {
|
||||
isoburn_msgs_submit(NULL, 0x00060000,
|
||||
"Cannot create libisofs write options object", 0, "FATAL", 0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
ret= iso_write_opts_set_untranslated_name_len(opts, len);
|
||||
if(ret < 0) {
|
||||
ret= iso_write_opts_set_untranslated_name_len(opts, -1);
|
||||
sprintf(msg,
|
||||
"Improper value for maximum length of untranslated names (%d <-> -1 ... %d)",
|
||||
len, ret);
|
||||
isoburn_msgs_submit(NULL, 0x00060000, msg, 0, "FAILURE", 0);
|
||||
iso_write_opts_free(opts);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
o->untranslated_name_len= ret; /* Normalized len value */
|
||||
iso_write_opts_free(opts);
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(msg != NULL)
|
||||
free(msg);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_get_untranslated_name_len(struct isoburn_imgen_opts *o,
|
||||
int *len)
|
||||
{
|
||||
*len = o->untranslated_name_len;
|
||||
return(1);
|
||||
}
|
||||
|
||||
@ -1059,3 +1273,180 @@ int isoburn_igopt_get_scdbackup_tag(struct isoburn_imgen_opts *o,
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_set_system_area(struct isoburn_imgen_opts *opts,
|
||||
char data[32768], int options)
|
||||
{
|
||||
if (data == NULL) { /* Disable */
|
||||
if (opts->system_area_data != NULL)
|
||||
free(opts->system_area_data);
|
||||
opts->system_area_data = NULL;
|
||||
} else {
|
||||
if (opts->system_area_data == NULL) {
|
||||
opts->system_area_data = calloc(32768, 1);
|
||||
if (opts->system_area_data == NULL)
|
||||
return(-1);
|
||||
}
|
||||
memcpy(opts->system_area_data, data, 32768);
|
||||
}
|
||||
opts->system_area_options = options & 0x3ff;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_get_system_area(struct isoburn_imgen_opts *opts,
|
||||
char data[32768], int *options)
|
||||
{
|
||||
*options= opts->system_area_options;
|
||||
if(opts->system_area_data == NULL)
|
||||
return(0);
|
||||
memcpy(data, opts->system_area_data, 32768);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_set_pvd_times(struct isoburn_imgen_opts *opts,
|
||||
time_t vol_creation_time, time_t vol_modification_time,
|
||||
time_t vol_expiration_time, time_t vol_effective_time,
|
||||
char *vol_uuid)
|
||||
{
|
||||
opts->vol_creation_time = vol_creation_time;
|
||||
opts->vol_modification_time = vol_modification_time;
|
||||
opts->vol_expiration_time = vol_expiration_time;
|
||||
opts->vol_effective_time = vol_effective_time;
|
||||
strncpy(opts->vol_uuid, vol_uuid, 16);
|
||||
opts->vol_uuid[16] = 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_get_pvd_times(struct isoburn_imgen_opts *opts,
|
||||
time_t *vol_creation_time, time_t *vol_modification_time,
|
||||
time_t *vol_expiration_time, time_t *vol_effective_time,
|
||||
char vol_uuid[17])
|
||||
{
|
||||
*vol_creation_time = opts->vol_creation_time;
|
||||
*vol_modification_time = opts->vol_modification_time;
|
||||
*vol_expiration_time = opts->vol_expiration_time;
|
||||
*vol_effective_time = opts->vol_effective_time;
|
||||
strcpy(vol_uuid, opts->vol_uuid);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_set_part_offset(struct isoburn_imgen_opts *opts,
|
||||
uint32_t block_offset_2k,
|
||||
int secs_512_per_head, int heads_per_cyl)
|
||||
{
|
||||
if (block_offset_2k > 0 && block_offset_2k < 16)
|
||||
return(0);
|
||||
opts->partition_offset = block_offset_2k;
|
||||
opts->partition_secs_per_head = secs_512_per_head;
|
||||
opts->partition_heads_per_cyl = heads_per_cyl;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_get_part_offset(struct isoburn_imgen_opts *opts,
|
||||
uint32_t *block_offset_2k,
|
||||
int *secs_512_per_head, int *heads_per_cyl)
|
||||
{
|
||||
*block_offset_2k = opts->partition_offset;
|
||||
*secs_512_per_head = opts->partition_secs_per_head;
|
||||
*heads_per_cyl = opts->partition_heads_per_cyl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_attach_jte(struct isoburn_imgen_opts *opts,
|
||||
void *libjte_handle)
|
||||
{
|
||||
opts->libjte_handle = libjte_handle;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_detach_jte(struct isoburn_imgen_opts *opts,
|
||||
void **libjte_handle)
|
||||
{
|
||||
if(libjte_handle != NULL)
|
||||
*libjte_handle = opts->libjte_handle;
|
||||
opts->libjte_handle = NULL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_set_tail_blocks(struct isoburn_imgen_opts *opts,
|
||||
uint32_t num_blocks)
|
||||
{
|
||||
opts->tail_blocks = num_blocks;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int isoburn_igopt_get_tail_blocks(struct isoburn_imgen_opts *opts,
|
||||
uint32_t *num_blocks)
|
||||
{
|
||||
*num_blocks = opts->tail_blocks;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_set_partition_img(struct isoburn_imgen_opts *opts,
|
||||
int partition_number, uint8_t partition_type,
|
||||
char *image_path)
|
||||
{
|
||||
char msg[80];
|
||||
|
||||
if (partition_number < 1 ||
|
||||
partition_number > Libisoburn_max_appended_partitionS) {
|
||||
sprintf(msg, "Partition number is out of range (1 ... %d)",
|
||||
Libisoburn_max_appended_partitionS);
|
||||
isoburn_msgs_submit(NULL, 0x00060000, msg, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
if (opts->appended_partitions[partition_number - 1] != NULL)
|
||||
free(opts->appended_partitions[partition_number - 1]);
|
||||
opts->appended_partitions[partition_number - 1] = strdup(image_path);
|
||||
if (opts->appended_partitions[partition_number - 1] == NULL)
|
||||
return(-1);
|
||||
opts->appended_part_types[partition_number - 1] = partition_type;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_get_partition_img(struct isoburn_imgen_opts *opts,
|
||||
int num_entries,
|
||||
uint8_t partition_types[],
|
||||
char *image_paths[])
|
||||
{
|
||||
int i, max_entry= 0;
|
||||
|
||||
for(i= 0; i < num_entries; i++)
|
||||
image_paths[i]= NULL;
|
||||
for(i= 0; i < Libisoburn_max_appended_partitionS; i++) {
|
||||
if(opts->appended_partitions[i] == NULL)
|
||||
continue;
|
||||
if(i < num_entries) {
|
||||
image_paths[i]= opts->appended_partitions[i];
|
||||
partition_types[i]= opts->appended_part_types[i];
|
||||
}
|
||||
max_entry= i + 1;
|
||||
}
|
||||
return(max_entry);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_set_disc_label(struct isoburn_imgen_opts *opts, char *label)
|
||||
{
|
||||
strncpy(opts->ascii_disc_label, label, Libisoburn_disc_label_sizE - 1);
|
||||
opts->ascii_disc_label[Libisoburn_disc_label_sizE - 1] = 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_get_disc_label(struct isoburn_imgen_opts *opts, char **label)
|
||||
{
|
||||
*label= opts->ascii_disc_label;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
@ -2,8 +2,9 @@
|
||||
/*
|
||||
Class struct of libisoburn.
|
||||
|
||||
Copyright 2007 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright 2007 - 2011 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifndef Isoburn_includeD
|
||||
@ -11,7 +12,13 @@
|
||||
|
||||
|
||||
/* for uint8_t */
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#else
|
||||
#ifdef HAVE_INTTYPES_H
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* For emulated TOC of overwriteable media.
|
||||
Provides minimal info for faking a struct burn_toc_entry.
|
||||
@ -35,11 +42,26 @@ int isoburn_toc_entry_new(struct isoburn_toc_entry **objpt,
|
||||
int isoburn_toc_entry_destroy(struct isoburn_toc_entry **o, int flag);
|
||||
|
||||
|
||||
/* Size of target_iso_head which is to be written during
|
||||
isoburn_activate_session()
|
||||
/* Minimal size of target_iso_head which is to be written during
|
||||
isoburn_activate_session().
|
||||
Within this size there is everything that is needed for image access with
|
||||
no partition offset. The actual target_iso_head buffer must be larger by
|
||||
the evential partition offset.
|
||||
*/
|
||||
#define Libisoburn_target_head_sizE (32*2048)
|
||||
|
||||
|
||||
/* Maximum number of appended partitions. Effectively usable number depends
|
||||
on system area type.
|
||||
*/
|
||||
#define Libisoburn_max_appended_partitionS 8
|
||||
|
||||
/*
|
||||
Maximum length of a disc label text plus 1.
|
||||
*/
|
||||
#define Libisoburn_disc_label_sizE 129
|
||||
|
||||
|
||||
struct isoburn {
|
||||
|
||||
|
||||
@ -91,6 +113,10 @@ struct isoburn {
|
||||
*/
|
||||
enum burn_disc_status fabricated_disc_status;
|
||||
|
||||
/* To be set if read errors occured during media evaluation.
|
||||
*/
|
||||
int media_read_error;
|
||||
|
||||
/* Eventual emulated table of content read from the chain of ISO headers
|
||||
on overwriteable media.
|
||||
*/
|
||||
@ -103,9 +129,14 @@ struct isoburn {
|
||||
int wrote_well;
|
||||
|
||||
|
||||
/* Buffered ISO head from media (should that become part of
|
||||
ecma119_read_opts ?) */
|
||||
uint8_t target_iso_head[Libisoburn_target_head_sizE];
|
||||
/* ISO head buffer to be filled by write run */
|
||||
int target_iso_head_size;
|
||||
uint8_t *target_iso_head;
|
||||
|
||||
/* The 2k offset which was read from a loaded image.
|
||||
*/
|
||||
uint32_t loaded_partition_offset;
|
||||
|
||||
|
||||
/* Libisofs image context */
|
||||
IsoImage *image;
|
||||
@ -221,12 +252,15 @@ int isoburn_get_msc2(struct isoburn *o,
|
||||
/** Get a data source suitable for read from a drive using burn_read_data()
|
||||
function.
|
||||
@param d drive to read from. Must be grabbed.
|
||||
@param displacement will be added or subtracted to any block address
|
||||
@param displacement_sign +1 = add , -1= subtract , else keep unaltered
|
||||
@return the data source, NULL on error. Must be freed with libisofs
|
||||
iso_data_source_unref() function. Note: this doesn't release
|
||||
the drive.
|
||||
*/
|
||||
IsoDataSource *
|
||||
isoburn_data_source_new(struct burn_drive *d);
|
||||
isoburn_data_source_new(struct burn_drive *d,
|
||||
uint32_t displacement, int displacement_sign);
|
||||
|
||||
/** Disable read capabilities of a data source which was originally created
|
||||
by isoburn_data_source_new(). After this any attempt to read will yield
|
||||
@ -242,6 +276,12 @@ isoburn_data_source_new(struct burn_drive *d);
|
||||
int isoburn_data_source_shutdown(IsoDataSource *src, int flag);
|
||||
|
||||
|
||||
/** Check whether the size of target_iso_head matches the given partition
|
||||
offset. Eventually adjust size.
|
||||
*/
|
||||
int isoburn_adjust_target_iso_head(struct isoburn *o,
|
||||
uint32_t offst, int flag);
|
||||
|
||||
/**
|
||||
* Options for image reading.
|
||||
(Comments here may be outdated. API getter/setter function descriptions
|
||||
@ -262,7 +302,7 @@ struct isoburn_read_opts {
|
||||
unsigned int noino:1; /* Discard eventual PX inode numbers */
|
||||
|
||||
/* ts A90810 */
|
||||
unsigned int nomd5:1; /* Do not read eventual MD5 array */
|
||||
unsigned int nomd5:2; /* Do not read eventual MD5 array */
|
||||
|
||||
unsigned int preferjoliet:1;
|
||||
/*< When both Joliet and RR extensions are present, the RR
|
||||
@ -305,6 +345,9 @@ struct isoburn_read_opts {
|
||||
uint32_t size; /**< Will be filled with the size (in 2048 byte block) of
|
||||
* the image, as reported in the PVM. */
|
||||
unsigned int pretend_blank:1; /* always create empty image */
|
||||
|
||||
uint32_t displacement;
|
||||
int displacement_sign;
|
||||
};
|
||||
|
||||
|
||||
@ -318,6 +361,8 @@ struct isoburn_imgen_opts {
|
||||
|
||||
/* Options for image generation */
|
||||
|
||||
int will_cancel :1;
|
||||
|
||||
int level; /**< ISO level to write at. */
|
||||
|
||||
/** Which extensions to support. */
|
||||
@ -335,10 +380,22 @@ struct isoburn_imgen_opts {
|
||||
unsigned int session_md5 :1;
|
||||
|
||||
/* Produce and write MD5 checksums for each single IsoFile.
|
||||
See parameter files of iso_write_opts_set_record_md5().
|
||||
See parameter "files" of iso_write_opts_set_record_md5().
|
||||
*/
|
||||
unsigned int file_md5 :2;
|
||||
|
||||
/* On overwriteable media or random access files do not write the first
|
||||
session to LBA 32, but rather to LBA 0 directly.
|
||||
*/
|
||||
unsigned int no_emul_toc :1;
|
||||
|
||||
/* For empty files, symbolic links, and devices use the old ECMA-119 block
|
||||
addresses in the range [0,31] rather than the address of the dedicated
|
||||
empty block.
|
||||
*/
|
||||
unsigned int old_empty :1;
|
||||
|
||||
|
||||
/* relaxed constraints */
|
||||
|
||||
/*
|
||||
@ -346,11 +403,31 @@ struct isoburn_imgen_opts {
|
||||
* but it is supposed to work on most moderns systems. Use with caution.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Extra Caution: This option breaks any assumptions about names that
|
||||
* are supported by ECMA-119 specifications.
|
||||
* Omit any translation which would make a file name compliant to the
|
||||
* ECMA-119 rules. This includes and exceeds omit_version_numbers,
|
||||
* max_37_char_filenames, no_force_dots bit0, allow_lowercase.
|
||||
*/
|
||||
unsigned int untranslated_name_len;
|
||||
|
||||
/*
|
||||
* Convert directory names for ECMA-119 similar to other file names, but do
|
||||
* not force a dot or add a version number.
|
||||
* This violates ECMA-119 by allowing one "." and especially ISO level 1
|
||||
* by allowing DOS style 8.3 names rather than only 8 characters.
|
||||
* (mkisofs and its clones seem to do this violation.)
|
||||
*/
|
||||
unsigned int allow_dir_id_ext :1;
|
||||
|
||||
/**
|
||||
* Omit the version number (";1") at the end of the ISO-9660 identifiers.
|
||||
* Version numbers are usually not used.
|
||||
* bit0= omit version number with ECMA-119 and Joliet
|
||||
* bit1= omit version number with Joliet alone
|
||||
*/
|
||||
unsigned int omit_version_numbers :1;
|
||||
unsigned int omit_version_numbers :2;
|
||||
|
||||
/**
|
||||
* Allow ISO-9660 directory hierarchy to be deeper than 8 levels.
|
||||
@ -374,8 +451,10 @@ struct isoburn_imgen_opts {
|
||||
* ISO-9660 forces filenames to have a ".", that separates file name from
|
||||
* extension. libisofs adds it if original filename doesn't has one. Set
|
||||
* this to 1 to prevent this behavior
|
||||
* bit0= no forced dot with ECMA-119
|
||||
* bit1= no forced dot with Joliet
|
||||
*/
|
||||
unsigned int no_force_dots :1;
|
||||
unsigned int no_force_dots :2;
|
||||
|
||||
/**
|
||||
* Allow lowercase characters in ISO-9660 filenames. By default, only
|
||||
@ -394,6 +473,12 @@ struct isoburn_imgen_opts {
|
||||
*/
|
||||
unsigned int joliet_longer_paths :1;
|
||||
|
||||
/**
|
||||
* Allow leaf names in the Joliet tree to have up to 103 characters
|
||||
* rather than 64.
|
||||
*/
|
||||
unsigned int joliet_long_names :1;
|
||||
|
||||
/**
|
||||
* Store timestamps as GMT rather than in local time.
|
||||
*/
|
||||
@ -487,6 +572,56 @@ struct isoburn_imgen_opts {
|
||||
char scdbackup_tag_time[19];
|
||||
char *scdbackup_tag_written;
|
||||
|
||||
|
||||
/* Content of an embedded boot image. Valid if not NULL.
|
||||
* In that case it must point to a memory buffer at least 32 kB.
|
||||
*/
|
||||
char *system_area_data;
|
||||
/*
|
||||
* bit0= make bytes 446 - 512 of the system area a partition
|
||||
* table which reserves partition 1 from byte 63*512 to the
|
||||
* end of the ISO image. Assumed are 63 secs/hed, 255 head/cyl.
|
||||
* (GRUB protective msdos label.)
|
||||
* This works with and without system_area_data.
|
||||
*/
|
||||
int system_area_options;
|
||||
|
||||
/* User settable PVD time stamps */
|
||||
time_t vol_creation_time;
|
||||
time_t vol_modification_time;
|
||||
time_t vol_expiration_time;
|
||||
time_t vol_effective_time;
|
||||
/* To eventually override vol_modification_time by unconverted string
|
||||
and timezone 0 */
|
||||
char vol_uuid[17];
|
||||
|
||||
/* The number of unclaimed 2K blocks before start of partition 1 as of
|
||||
the MBR in system area. If not 0 this will cause double volume
|
||||
descriptor sets and double tree.
|
||||
*/
|
||||
uint32_t partition_offset;
|
||||
/* Partition table parameter: 1 to 63, 0= disabled/default */
|
||||
int partition_secs_per_head;
|
||||
/* 1 to 255, 0= disabled/default */
|
||||
int partition_heads_per_cyl;
|
||||
|
||||
/* Parameters and state of Jigdo Template Export environment.
|
||||
*/
|
||||
void *libjte_handle;
|
||||
|
||||
/* A trailing padding of zero bytes which belongs to the image
|
||||
*/
|
||||
uint32_t tail_blocks;
|
||||
|
||||
/* Eventual disk file paths of prepared images which shall be appended
|
||||
after the ISO image and described by partiton table entries in a MBR.
|
||||
*/
|
||||
char *appended_partitions[Libisoburn_max_appended_partitionS];
|
||||
uint8_t appended_part_types[Libisoburn_max_appended_partitionS];
|
||||
|
||||
/* Eventual name of the non-ISO aspect of the image. E.g. SUN ASCII label.
|
||||
*/
|
||||
char ascii_disc_label[Libisoburn_disc_label_sizE];
|
||||
};
|
||||
|
||||
|
||||
@ -522,6 +657,9 @@ struct isoburn_imgen_opts {
|
||||
written by random access before they were written sequentially.
|
||||
In this case, no copy of the session 1 header is maintained and no TOC
|
||||
will be possible. Thus writing begins sequentially at LBA 0.
|
||||
|
||||
IMPORTANT: This macro gives the minimal size of an image header.
|
||||
It has to be enlarged by the eventual partition offset.
|
||||
*/
|
||||
#define Libisoburn_overwriteable_starT \
|
||||
((off_t) (Libisoburn_target_head_sizE/2048))
|
||||
|
@ -6,10 +6,15 @@
|
||||
/*
|
||||
libisofs related functions of libisoburn.
|
||||
|
||||
Copyright 2007 - 2010 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
Copyright 2007 - 2011 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
@ -27,8 +32,8 @@
|
||||
|
||||
#endif /* Xorriso_standalonE */
|
||||
|
||||
#include "isoburn.h"
|
||||
#include "libisoburn.h"
|
||||
#include "isoburn.h"
|
||||
|
||||
#define BP(a,b) [(b) - (a) + 1]
|
||||
|
||||
@ -116,22 +121,24 @@ int isoburn_read_image(struct burn_drive *d,
|
||||
IsoReadOpts *ropts= NULL;
|
||||
IsoReadImageFeatures *features= NULL;
|
||||
uint32_t ms_block;
|
||||
char msg[160];
|
||||
char *msg= NULL;
|
||||
enum burn_disc_status status= BURN_DISC_BLANK;
|
||||
IsoDataSource *ds= NULL;
|
||||
struct isoburn *o= NULL;
|
||||
|
||||
msg= calloc(1, 160);
|
||||
|
||||
if(d != NULL) {
|
||||
ret = isoburn_find_emulator(&o, d, 0);
|
||||
if (ret < 0 || o == NULL)
|
||||
return 0;
|
||||
{ret= 0; goto ex;}
|
||||
status = isoburn_disc_get_status(d);
|
||||
}
|
||||
if(read_opts==NULL) {
|
||||
isoburn_msgs_submit(o, 0x00060000,
|
||||
"Program error: isoburn_read_image: read_opts==NULL",
|
||||
0, "FATAL", 0);
|
||||
return(-1);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
if (d == NULL || status == BURN_DISC_BLANK || read_opts->pretend_blank) {
|
||||
create_blank_image:;
|
||||
@ -145,44 +152,46 @@ create_blank_image:;
|
||||
isoburn_msgs_submit(o, 0x00060000,
|
||||
"Program error: isoburn_read_image: image==NULL",
|
||||
0, "FATAL", 0);
|
||||
return -1;
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
/* create a new image */
|
||||
ret = iso_image_new("ISOIMAGE", image);
|
||||
if (ret < 0) {
|
||||
isoburn_report_iso_error(ret, "Cannot create image", 0, "FATAL", 0);
|
||||
return ret;
|
||||
goto ex;
|
||||
}
|
||||
iso_image_set_ignore_aclea(*image,
|
||||
(!!(read_opts->noacl)) | ((!!read_opts->noea) << 1) );
|
||||
} else {
|
||||
/* Blank new image for the drive */
|
||||
iso_image_unref(o->image);
|
||||
ret = iso_image_new("ISOIMAGE", &o->image);
|
||||
if (ret < 0) {
|
||||
isoburn_report_iso_error(ret, "Cannot create image", 0, "FATAL", 0);
|
||||
return ret;
|
||||
goto ex;
|
||||
}
|
||||
if (image) {
|
||||
if (image != NULL) {
|
||||
*image = o->image;
|
||||
iso_image_ref(*image); /*protects object from premature free*/
|
||||
}
|
||||
}
|
||||
iso_image_set_ignore_aclea(*image,
|
||||
iso_image_set_ignore_aclea(o->image,
|
||||
(!!(read_opts->noacl)) | ((!!read_opts->noea) << 1) );
|
||||
return 1;
|
||||
}
|
||||
{ret= 1; goto ex;}
|
||||
}
|
||||
|
||||
if (status != BURN_DISC_APPENDABLE && status != BURN_DISC_FULL) {
|
||||
isoburn_msgs_submit(o, 0x00060000,
|
||||
"Program error: isoburn_read_image: incorrect disc status",
|
||||
0, "FATAL", 0);
|
||||
return -4;
|
||||
{ret= -4; goto ex;}
|
||||
}
|
||||
|
||||
memset((char *) &ropts, 0, sizeof(ropts));
|
||||
|
||||
ret = isoburn_disc_get_msc1(d, &int_num);
|
||||
if (ret <= 0)
|
||||
return -2;
|
||||
{ret= -2; goto ex;}
|
||||
ms_block= int_num;
|
||||
ret = isoburn_read_iso_head(d, int_num, &dummy, NULL, 0);
|
||||
if (ret <= 0) {
|
||||
@ -191,18 +200,43 @@ create_blank_image:;
|
||||
goto create_blank_image;
|
||||
}
|
||||
|
||||
if(read_opts->displacement != 0 && abs(read_opts->displacement_sign) == 1) {
|
||||
/* Apply reverse displacement to session start */
|
||||
if(read_opts->displacement_sign == -1) {
|
||||
if(ms_block+ read_opts->displacement < ms_block) {
|
||||
displacement_rollover:;
|
||||
sprintf(msg, "Displacement offset leads outside 32 bit range.");
|
||||
isoburn_msgs_submit(o, 0x00060000, msg, 0, "FAILURE", 0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
ms_block+= read_opts->displacement;
|
||||
} else {
|
||||
if(ms_block < read_opts->displacement)
|
||||
goto displacement_rollover;
|
||||
ms_block-= read_opts->displacement;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* create the data source */
|
||||
ret = iso_read_opts_new(&ropts, 0);
|
||||
if (ret < 0) {
|
||||
isoburn_report_iso_error(ret, "Cannot create write opts", 0, "FATAL", 0);
|
||||
return ret;
|
||||
goto ex;
|
||||
}
|
||||
|
||||
/* Important: do not return until iso_read_opts_free() */
|
||||
|
||||
iso_read_opts_set_start_block(ropts, ms_block);
|
||||
iso_read_opts_set_no_rockridge(ropts, read_opts->norock);
|
||||
iso_read_opts_set_no_aaip(ropts, read_opts->noaaip);
|
||||
iso_read_opts_set_no_md5(ropts, read_opts->nomd5);
|
||||
|
||||
if(read_opts->nomd5 == 2)
|
||||
int_num= 2;
|
||||
else if(read_opts->nomd5 == 1)
|
||||
int_num= 1;
|
||||
else
|
||||
int_num= 0;
|
||||
iso_read_opts_set_no_md5(ropts, int_num);
|
||||
iso_read_opts_set_new_inos(ropts, read_opts->noino);
|
||||
|
||||
iso_read_opts_set_no_joliet(ropts, read_opts->nojoliet);
|
||||
@ -214,8 +248,15 @@ create_blank_image:;
|
||||
iso_read_opts_set_default_gid(ropts, read_opts->gid);
|
||||
iso_read_opts_set_input_charset(ropts, read_opts->input_charset);
|
||||
iso_read_opts_auto_input_charset(ropts, read_opts->auto_input_charset);
|
||||
iso_read_opts_load_system_area(ropts, 1);
|
||||
|
||||
ds = isoburn_data_source_new(d);
|
||||
ds = isoburn_data_source_new(d, read_opts->displacement,
|
||||
read_opts->displacement_sign);
|
||||
if (ds == NULL) {
|
||||
isoburn_report_iso_error(ret, "Cannot create IsoDataSource object", 0,
|
||||
"FATAL", 0);
|
||||
goto ex;
|
||||
}
|
||||
if(o->iso_data_source!=NULL)
|
||||
iso_data_source_unref(o->iso_data_source);
|
||||
o->iso_data_source= ds;
|
||||
@ -231,7 +272,7 @@ create_blank_image:;
|
||||
|
||||
if (ret < 0) {
|
||||
isoburn_report_iso_error(ret, "Cannot import image", 0, "FAILURE", 0);
|
||||
return ret;
|
||||
goto ex;
|
||||
}
|
||||
/* Important: do not return until free(features) */
|
||||
if (image!=NULL) {
|
||||
@ -244,7 +285,11 @@ create_blank_image:;
|
||||
read_opts->hasElTorito = iso_read_image_features_has_eltorito(features);
|
||||
read_opts->size = iso_read_image_features_get_size(features);
|
||||
iso_read_image_features_destroy(features);
|
||||
return 1;
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(msg != NULL)
|
||||
free(msg);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
@ -293,34 +338,153 @@ int isoburn_activate_session(struct burn_drive *drive)
|
||||
return 1;
|
||||
|
||||
ret = burn_random_access_write(drive, (off_t) 0, (char*)o->target_iso_head,
|
||||
Libisoburn_target_head_sizE, 1);
|
||||
o->target_iso_head_size, 1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/** API @since 0.6.2
|
||||
*/
|
||||
int isoburn_get_img_partition_offset(struct burn_drive *drive,
|
||||
uint32_t *block_offset_2k)
|
||||
{
|
||||
int ret;
|
||||
struct isoburn *o;
|
||||
|
||||
ret = isoburn_find_emulator(&o, drive, 0);
|
||||
if(ret < 0 || o == NULL)
|
||||
return -1;
|
||||
*block_offset_2k= o->loaded_partition_offset;
|
||||
if(o->loaded_partition_offset == 0)
|
||||
return(0);
|
||||
if(o->target_iso_head_size == (off_t) Libisoburn_target_head_sizE
|
||||
+ (off_t) 2048 * (off_t) o->loaded_partition_offset)
|
||||
return(1);
|
||||
return(2);
|
||||
}
|
||||
|
||||
|
||||
/* Check for MBR signature and a first partition that starts at a 2k block
|
||||
and ends where the image ends.
|
||||
If not too large or too small, accept its start as partition offset.
|
||||
*/
|
||||
static int isoburn_inspect_partition(struct isoburn *o, uint32_t img_size,
|
||||
int flag)
|
||||
{
|
||||
uint8_t *mbr, *part, *buf= NULL;
|
||||
uint32_t offst, numsec;
|
||||
struct ecma119_pri_vol_desc *pvm;
|
||||
off_t data_count;
|
||||
int ret;
|
||||
char *msg= NULL;
|
||||
static int max_offst= 512 - 32;
|
||||
|
||||
buf= (uint8_t *) calloc(1, 2048);
|
||||
msg= calloc(1, 160);
|
||||
if(buf == NULL || msg == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
|
||||
mbr= o->target_iso_head;
|
||||
part= mbr + 446;
|
||||
if(mbr[510] != 0x55 || mbr[511] != 0xAA)
|
||||
{ret= 2; goto ex;} /* not an MBR */
|
||||
|
||||
/* Does the first partition entry look credible ? */
|
||||
if(part[0] != 0x80 && part[0] != 0x00)
|
||||
{ret= 2; goto ex;} /* Invalid partition status */
|
||||
if(part[1] == 0 && part[2] == 0 && part[3] == 0)
|
||||
{ret= 2; goto ex;} /* Zero C/H/S start address */
|
||||
|
||||
/* Does it match the normal ISO image ? */
|
||||
offst= iso_read_lsb(part + 8, 4);
|
||||
numsec= iso_read_lsb(part + 12, 4);
|
||||
if(offst < 64)
|
||||
{ret= 2; goto ex;} /* Zero or unusably small partition start */
|
||||
if((offst % 4) || (numsec % 4))
|
||||
{ret= 2; goto ex;} /* Not aligned to 2k */
|
||||
if(numsec < 72)
|
||||
{ret= 2; goto ex;} /* No room for volume descriptors */
|
||||
offst/= 4;
|
||||
numsec/= 4;
|
||||
if(offst + numsec != img_size)
|
||||
{ret= 2; goto ex;} /* Partition end does not match image end */
|
||||
|
||||
/* Is there a PVD at the partition start ? */
|
||||
ret = burn_read_data(o->drive, (off_t) (offst + 16) * (off_t) 2048,
|
||||
(char*) buf, 2048, &data_count, 2);
|
||||
if(ret <= 0)
|
||||
{ret= 2; goto ex;}
|
||||
pvm = (struct ecma119_pri_vol_desc *) buf;
|
||||
if (strncmp((char*) pvm->std_identifier, "CD001", 5) != 0)
|
||||
{ret= 2; goto ex;} /* not a PVD */
|
||||
if (pvm->vol_desc_type[0] != 1 || pvm->vol_desc_version[0] != 1
|
||||
|| pvm->file_structure_version[0] != 1 )
|
||||
{ret= 2; goto ex;} /* failed sanity check */
|
||||
|
||||
if(iso_read_lsb(pvm->vol_space_size, 4) + offst != img_size)
|
||||
{ret= 2; goto ex;} /* Image ends do not match */
|
||||
|
||||
/* Now it is credible. Not yet clear is whether it is acceptable. */
|
||||
o->loaded_partition_offset= offst;
|
||||
|
||||
/* If the partition start is too large: Report but do not accept. */
|
||||
if(offst > (uint32_t) max_offst) {/* Not more than 1 MB of .target_iso_head */
|
||||
sprintf(msg,
|
||||
"Detected partition offset of %.f blocks. Maximum for load buffer is %d",
|
||||
(double) offst, max_offst);
|
||||
isoburn_msgs_submit(NULL, 0x00060000, msg, 0, "WARNING", 0);
|
||||
{ret= 3; goto ex;}
|
||||
}
|
||||
|
||||
/* Accept partition start and adjust buffer size */
|
||||
ret= isoburn_adjust_target_iso_head(o, offst, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(buf != NULL)
|
||||
free(buf);
|
||||
if(msg != NULL)
|
||||
free(msg);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/** Initialize the emulation of multi-session on random access media.
|
||||
The need for emulation is confirmed already.
|
||||
@param o A freshly created isoburn object. isoburn_create_data_source() was
|
||||
already called, nevertheless.
|
||||
@param flag bit0= read-only
|
||||
@return <=0 error , 1 = success
|
||||
*/
|
||||
int isoburn_start_emulation(struct isoburn *o, int flag)
|
||||
{
|
||||
int ret, i, capacity = -1, role;
|
||||
int ret, i, capacity = -1, role, dummy;
|
||||
off_t data_count, to_read;
|
||||
struct burn_drive *drive;
|
||||
struct ecma119_pri_vol_desc *pvm;
|
||||
|
||||
enum burn_disc_status s;
|
||||
char *path= NULL, *msg= NULL;
|
||||
|
||||
path= calloc(1, BURN_DRIVE_ADR_LEN);
|
||||
msg= calloc(1, 2 * BURN_DRIVE_ADR_LEN);
|
||||
if(path == NULL || msg == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
|
||||
if(o==NULL) {
|
||||
isoburn_msgs_submit(NULL, 0x00060000,
|
||||
"Program error: isoburn_start_emulation: o==NULL",
|
||||
0, "FATAL", 0);
|
||||
return -1;
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
|
||||
drive= o->drive;
|
||||
|
||||
if(flag & 1)
|
||||
o->fabricated_disc_status= BURN_DISC_FULL;
|
||||
|
||||
/* We can assume 0 as start block for image.
|
||||
The data there point to the most recent session.
|
||||
*/
|
||||
@ -328,27 +492,42 @@ int isoburn_start_emulation(struct isoburn *o, int flag)
|
||||
ret = burn_get_read_capacity(drive, &capacity, 0);
|
||||
if (ret <= 0)
|
||||
capacity = -1;
|
||||
if (capacity > 0 || role == 2) {
|
||||
if (role == 5) { /* random access write-only media */
|
||||
s = burn_disc_get_status(drive);
|
||||
o->fabricated_disc_status= s;
|
||||
burn_disc_track_lba_nwa(drive, NULL, 0, &dummy, &(o->nwa));
|
||||
if(o->nwa < o->zero_nwa)
|
||||
o->zero_nwa= 0;
|
||||
{ret= 1; goto ex;}
|
||||
} else if (capacity > 0 || role == 2 || role == 4) {
|
||||
/* Might be a block device on a system where libburn cannot determine its
|
||||
size. Try to read anyway. */
|
||||
memset(o->target_iso_head, 0, Libisoburn_target_head_sizE);
|
||||
to_read = Libisoburn_target_head_sizE;
|
||||
to_read = o->target_iso_head_size;
|
||||
memset(o->target_iso_head, 0, to_read);
|
||||
if(capacity > 0 && (off_t) capacity * (off_t) 2048 < to_read)
|
||||
to_read = (off_t) capacity * (off_t) 2048;
|
||||
ret = burn_read_data(drive, (off_t) 0, (char*)o->target_iso_head,
|
||||
to_read, &data_count, 2);
|
||||
to_read, &data_count, 2 | 8);
|
||||
if (ret <= 0) {
|
||||
/* an error means a disc with no ISO image */
|
||||
if (capacity > 0)
|
||||
o->media_read_error= 1;
|
||||
if (ret == -2) {
|
||||
path[0]= 0;
|
||||
burn_drive_d_get_adr(drive, path);
|
||||
sprintf(msg, "Pseudo drive '%s' does not allow reading", path);
|
||||
isoburn_msgs_submit(NULL, 0x00060000, msg, 0, "NOTE", 0);
|
||||
o->fabricated_disc_status= BURN_DISC_BLANK;
|
||||
} else if (capacity > 0)
|
||||
o->fabricated_disc_status= BURN_DISC_FULL;
|
||||
else
|
||||
o->fabricated_disc_status= BURN_DISC_BLANK;
|
||||
return 1;
|
||||
else if(!(flag & 1))
|
||||
o->fabricated_disc_status= BURN_DISC_BLANK;
|
||||
{ret= 1; goto ex;}
|
||||
}
|
||||
} else {
|
||||
/* No read capacity means blank media */
|
||||
o->fabricated_disc_status= BURN_DISC_BLANK;
|
||||
return 1;
|
||||
if(!(flag & 1))
|
||||
o->fabricated_disc_status= BURN_DISC_BLANK;
|
||||
{ret= 1; goto ex;}
|
||||
}
|
||||
|
||||
/* check first 64K. If 0's, the disc is treated as a blank disc, and thus
|
||||
@ -358,13 +537,14 @@ int isoburn_start_emulation(struct isoburn *o, int flag)
|
||||
--i;
|
||||
|
||||
if (!i) {
|
||||
o->fabricated_disc_status= BURN_DISC_BLANK;
|
||||
return 1;
|
||||
if(!(flag & 1))
|
||||
o->fabricated_disc_status= BURN_DISC_BLANK;
|
||||
{ret= 1; goto ex;}
|
||||
}
|
||||
|
||||
pvm = (struct ecma119_pri_vol_desc *)(o->target_iso_head + 16 * 2048);
|
||||
|
||||
if (!strncmp((char*)pvm->std_identifier, "CD001", 5)) {
|
||||
if (strncmp((char*)pvm->std_identifier, "CD001", 5) == 0) {
|
||||
off_t size;
|
||||
|
||||
/* sanity check */
|
||||
@ -372,24 +552,38 @@ int isoburn_start_emulation(struct isoburn *o, int flag)
|
||||
|| pvm->file_structure_version[0] != 1 ) {
|
||||
/* TODO for now I treat this as a full disc */
|
||||
o->fabricated_disc_status= BURN_DISC_FULL;
|
||||
return 1;
|
||||
{ret= 1; goto ex;}
|
||||
}
|
||||
|
||||
/* ok, PVM found, set size */
|
||||
size = (off_t) iso_read_lsb(pvm->vol_space_size, 4);
|
||||
ret= isoburn_inspect_partition(o, (uint32_t) size, 0);
|
||||
if (ret <= 0)
|
||||
goto ex;
|
||||
size *= (off_t) 2048; /* block size in bytes */
|
||||
isoburn_set_start_byte(o, size, 0);
|
||||
o->fabricated_disc_status= BURN_DISC_APPENDABLE;
|
||||
} else if (!strncmp((char*)pvm->std_identifier, "CDXX1", 5)) {
|
||||
if(!(flag & 1))
|
||||
o->fabricated_disc_status= BURN_DISC_APPENDABLE;
|
||||
} else if (strncmp((char*)pvm->std_identifier, "CDXX1", 5) == 0 ||
|
||||
(strncmp((char*)pvm->std_identifier, "CDxx1", 5) == 0 &&
|
||||
pvm->vol_desc_type[0] == 'x')) {
|
||||
|
||||
/* empty image */
|
||||
isoburn_set_start_byte(o, o->zero_nwa * 2048, 0);
|
||||
o->fabricated_disc_status= BURN_DISC_BLANK;
|
||||
if(!(flag & 1))
|
||||
o->fabricated_disc_status= BURN_DISC_BLANK;
|
||||
} else {
|
||||
/* treat any disc in an unknown format as full */
|
||||
o->fabricated_disc_status= BURN_DISC_FULL;
|
||||
}
|
||||
return 1;
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(path != NULL)
|
||||
free(path);
|
||||
if(msg != NULL)
|
||||
free(msg);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,9 +1,10 @@
|
||||
|
||||
/*
|
||||
API definition of libisoburn.
|
||||
Lower level API definition of libisoburn.
|
||||
|
||||
Copyright 2007-2010 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
Copyright 2007-2011 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
/** Overview
|
||||
@ -17,6 +18,9 @@ The price for that is thorough specialization on data files in ISO-9660
|
||||
filesystem images. So libisoburn is not suitable for audio (CD-DA) or any
|
||||
other CD layout which does not entirely consist of ISO-9660 sessions.
|
||||
|
||||
Note that there is a higher level of API: xorriso.h. One should not mix it
|
||||
with the API calls of libisoburn.h, libisofs.h, and libburn.h.
|
||||
|
||||
|
||||
Connector functions
|
||||
|
||||
@ -132,14 +136,36 @@ file itself: libisoburn/libisoburn.h .
|
||||
They shall link with -lisofs -lburn -lisoburn or with the .o files emerging
|
||||
from building those libraries from their sources.
|
||||
|
||||
Applications must use 64 bit off_t, e.g. on 32-bit Linux by defining
|
||||
Applications must use 64 bit off_t.
|
||||
E.g. on 32-bit GNU/Linux by defining
|
||||
#define _LARGEFILE_SOURCE
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
or take special precautions to interface with the library by 64 bit integers
|
||||
where above .h files prescribe off_t. Not to use 64 bit file i/o will keep
|
||||
the application from producing and processing ISO images of more than 2 GB
|
||||
size.
|
||||
The minimum requirement is to interface with the library by 64 bit signed
|
||||
integers where libisofs.h or libisoburn.h prescribe off_t.
|
||||
Failure to do so may result in surprising malfunction or memory faults.
|
||||
|
||||
Application files which include libisofs/libisofs.h or libisoburn/libisoburn.h
|
||||
must provide definitions for uint32_t and uint8_t.
|
||||
This can be achieved either:
|
||||
- by using autotools which will define HAVE_STDINT_H or HAVE_INTTYPES_H
|
||||
according to its ./configure tests,
|
||||
- or by defining the macros HAVE_STDINT_H resp. HAVE_INTTYPES_H according
|
||||
to the local situation,
|
||||
- or by appropriately defining uint32_t and uint8_t by other means,
|
||||
e.g. by including inttypes.h before including libisofs.h and libisoburn.h
|
||||
|
||||
*/
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#else
|
||||
#ifdef HAVE_INTTYPES_H
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/* Important: If you add a public API function then add its name to file
|
||||
libisoburn/libisoburn.ver
|
||||
*/
|
||||
|
||||
|
||||
@ -160,7 +186,7 @@ int isoburn_initialize(char msg[1024], int flag);
|
||||
major.minor.micro revision triple can be delivered by the library version
|
||||
which is performing this call.
|
||||
An application of libisoburn can easily memorize the version of the
|
||||
libisofs.h header in its own code. Immediately after isoburn_initialize()
|
||||
libisoburn.h header in its own code. Immediately after isoburn_initialize()
|
||||
it should simply do this check:
|
||||
if (! isoburn_is_compatible(isoburn_header_version_major,
|
||||
isoburn_header_version_minor,
|
||||
@ -214,18 +240,26 @@ void isoburn_version(int *major, int *minor, int *micro);
|
||||
at compile time.
|
||||
@since 0.1.0
|
||||
*/
|
||||
#define isoburn_libisofs_req_major 0
|
||||
#define isoburn_libisofs_req_minor 6
|
||||
#define isoburn_libisofs_req_micro 26
|
||||
#define isoburn_libisofs_req_major 1
|
||||
#define isoburn_libisofs_req_minor 1
|
||||
#define isoburn_libisofs_req_micro 4
|
||||
|
||||
/** The minimum version of libburn to be used with this version of libisoburn
|
||||
at compile time.
|
||||
@since 0.1.0
|
||||
*/
|
||||
#define isoburn_libburn_req_major 0
|
||||
#define isoburn_libburn_req_minor 7
|
||||
#define isoburn_libburn_req_micro 6
|
||||
#define isoburn_libburn_req_major 1
|
||||
#define isoburn_libburn_req_minor 1
|
||||
#define isoburn_libburn_req_micro 4
|
||||
|
||||
/** The minimum compile time requirements of libisoburn towards libjte are
|
||||
the same as of a suitable libisofs towards libjte.
|
||||
So use these macros from libisofs.h :
|
||||
iso_libjte_req_major
|
||||
iso_libjte_req_minor
|
||||
iso_libjte_req_micro
|
||||
@since 0.6.4
|
||||
*/
|
||||
|
||||
/** The minimum version of libisofs to be used with this version of libisoburn
|
||||
at runtime. This is checked already in isoburn_initialize() which will
|
||||
@ -240,6 +274,17 @@ void isoburn_version(int *major, int *minor, int *micro);
|
||||
int isoburn_libisofs_req(int *major, int *minor, int *micro);
|
||||
|
||||
|
||||
/** The minimum version of libjte to be used with this version of libisoburn
|
||||
at runtime. The use of libjte is optional and depends on configure
|
||||
tests. It can be prevented by ./configure option --disable-libjte .
|
||||
This is checked already in isoburn_initialize() which will refuse on
|
||||
outdated version. So this call is for information purposes after
|
||||
successful startup only.
|
||||
@since 0.6.4
|
||||
*/
|
||||
int isoburn_libjte_req(int *major, int *minor, int *micro);
|
||||
|
||||
|
||||
/** The minimum version of libburn to be used with this version of libisoburn
|
||||
at runtime. This is checked already in isoburn_initialize() which will
|
||||
refuse on outdated version. So this call is for information purposes after
|
||||
@ -258,9 +303,9 @@ int isoburn_libburn_req(int *major, int *minor, int *micro);
|
||||
time.
|
||||
@since 0.1.0
|
||||
*/
|
||||
#define isoburn_header_version_major 0
|
||||
#define isoburn_header_version_minor 4
|
||||
#define isoburn_header_version_micro 8
|
||||
#define isoburn_header_version_major 1
|
||||
#define isoburn_header_version_minor 1
|
||||
#define isoburn_header_version_micro 4
|
||||
/** Note:
|
||||
Above version numbers are also recorded in configure.ac because libtool
|
||||
wants them as parameters at build time.
|
||||
@ -376,8 +421,9 @@ int isoburn_drive_scan_and_grab(struct burn_drive_info *drive_infos[],
|
||||
@param flag bit0= attempt to load the disc tray.
|
||||
Else: failure if not loaded.
|
||||
bit1= regard overwriteable media as blank
|
||||
bit2= if the drive is a regular disk file: truncate it to
|
||||
the write start address
|
||||
bit2= if the drive is a regular disk file:
|
||||
truncate it to the write start address when writing
|
||||
begins
|
||||
bit3= if the drive reports a read-only profile try to read
|
||||
table of content by scanning for ISO image headers.
|
||||
(depending on media type and drive this might
|
||||
@ -432,7 +478,11 @@ int isoburn_drive_set_msgs_submit(struct burn_drive *d,
|
||||
@return The status of the drive, or what kind of disc is in it.
|
||||
Note: BURN_DISC_UNGRABBED indicates wrong API usage
|
||||
*/
|
||||
#ifdef __cplusplus
|
||||
enum burn::burn_disc_status isoburn_disc_get_status(struct burn_drive *drive);
|
||||
#else
|
||||
enum burn_disc_status isoburn_disc_get_status(struct burn_drive *drive);
|
||||
#endif
|
||||
|
||||
|
||||
/** Tells whether the media can be treated by isoburn_disc_erase().
|
||||
@ -574,7 +624,8 @@ void isoburn_toc_session_get_leadout_entry(struct isoburn_toc_session *s,
|
||||
@since 0.1.6
|
||||
@param s The session handle
|
||||
@param num returns the number of tracks in the array
|
||||
@return the address of the array of track handles
|
||||
@return the address of the array of track handles,
|
||||
NULL if no tracks are registered with session s
|
||||
*/
|
||||
struct isoburn_toc_track **isoburn_toc_session_get_tracks(
|
||||
struct isoburn_toc_session *s, int *num);
|
||||
@ -624,7 +675,7 @@ void isoburn_toc_disc_free(struct isoburn_toc_disc *disc);
|
||||
@since 0.1.6
|
||||
@param d The drive with the media to inspect
|
||||
@param lba The block number from where to read
|
||||
@param image_blocks The number of 2048 bytes blocks
|
||||
@param image_blocks Returns the number of 2048 bytes blocks in the session
|
||||
@param info Caller provided memory, enough to take eventual info reply
|
||||
@param flag bit0-7: info return mode
|
||||
0= do not return anything in info (do not even touch it)
|
||||
@ -743,6 +794,11 @@ int isoburn_ropt_destroy(struct isoburn_read_opts **o, int flag);
|
||||
bit9= nomd5
|
||||
@since 0.4.2
|
||||
Do not load the eventual MD5 checksum array.
|
||||
Do not check eventual session_md5 tags.
|
||||
bit10= nomd5tag
|
||||
@since 1.0.4
|
||||
Do not check eventual session_md5 tags although bit9
|
||||
is not set.
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
#define isoburn_ropt_norock 1
|
||||
@ -755,6 +811,7 @@ int isoburn_ropt_destroy(struct isoburn_read_opts **o, int flag);
|
||||
#define isoburn_ropt_noea 128
|
||||
#define isoburn_ropt_noino 256
|
||||
#define isoburn_ropt_nomd5 512
|
||||
#define isoburn_ropt_nomd5tag 1024
|
||||
|
||||
int isoburn_ropt_set_extensions(struct isoburn_read_opts *o, int ext);
|
||||
int isoburn_ropt_get_extensions(struct isoburn_read_opts *o, int *ext);
|
||||
@ -792,7 +849,6 @@ int isoburn_ropt_get_default_dirperms(struct isoburn_read_opts *o,
|
||||
mode_t *mode);
|
||||
|
||||
|
||||
|
||||
/** Set the character set for reading RR file names from ISO images.
|
||||
@since 0.1.0
|
||||
@param o The option set to work on
|
||||
@ -807,6 +863,7 @@ int isoburn_ropt_set_input_charset(struct isoburn_read_opts *o,
|
||||
int isoburn_ropt_get_input_charset(struct isoburn_read_opts *o,
|
||||
char **input_charset);
|
||||
|
||||
|
||||
/**
|
||||
Enable or disable methods to automatically choose an input charset.
|
||||
This eventually overrides the name set via isoburn_ropt_set_input_charset()
|
||||
@ -822,6 +879,38 @@ int isoburn_ropt_set_auto_incharset(struct isoburn_read_opts *o, int mode);
|
||||
int isoburn_ropt_get_auto_incharset(struct isoburn_read_opts *o, int *mode);
|
||||
|
||||
|
||||
/** Control an offset to be applied to all block address pointers in the ISO
|
||||
image in order to compensate for an eventual displacement of the image
|
||||
relative to the start block address for which it was produced.
|
||||
E.g. if track number 2 from CD gets copied into a disk file and shall then
|
||||
be loaded as ISO filesystem, then the directory tree and all data file
|
||||
content of the track copy will become readable by setting the track start
|
||||
address as displacement and -1 as displacement_sign.
|
||||
Data file content outside the track will of course not be accessible and
|
||||
eventually produce read errors.
|
||||
@since 0.6.6
|
||||
@param o The option set to work on
|
||||
@param displacement 0 or a positive number
|
||||
@param displacement_sign Determines wether to add or subtract displacement
|
||||
to block addresses before applying them to the
|
||||
storage object for reading:
|
||||
+1 = add , -1= subtract , else keep unaltered
|
||||
*/
|
||||
int isoburn_ropt_set_displacement(struct isoburn_read_opts *o,
|
||||
uint32_t displacement, int displacement_sign);
|
||||
int isoburn_ropt_get_displacement(struct isoburn_read_opts *o,
|
||||
uint32_t *displacement, int *displacement_sign);
|
||||
|
||||
/* If you get here because of a compilation error like
|
||||
|
||||
/usr/include/libisoburn/libisoburn.h:895: error:
|
||||
expected declaration specifiers or '...' before 'uint32_t'
|
||||
|
||||
then see above paragraph "Application Constraints" about the definition
|
||||
of uint32_t.
|
||||
*/
|
||||
|
||||
|
||||
/** After calling function isoburn_read_image() there are informations
|
||||
available in the option set.
|
||||
This info can be obtained as bits in parameter has_what. Like:
|
||||
@ -846,14 +935,15 @@ int isoburn_ropt_get_auto_incharset(struct isoburn_read_opts *o, int *mode);
|
||||
#define isoburn_ropt_has_iso1999 4
|
||||
#define isoburn_ropt_has_el_torito 8
|
||||
|
||||
int isoburn_ropt_get_size_what(struct isoburn_read_opts *o,
|
||||
uint32_t *size, int *has_what);
|
||||
|
||||
/* ts A90122 */
|
||||
/* >>> to be implemented:
|
||||
#define isoburn_ropt_has_acl 64
|
||||
#define isoburn_ropt_has_ea 128
|
||||
*/
|
||||
|
||||
int isoburn_ropt_get_size_what(struct isoburn_read_opts *o,
|
||||
uint32_t *size, int *has_what);
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
@ -900,6 +990,7 @@ int isoburn_igopt_destroy(struct isoburn_imgen_opts **o, int flag);
|
||||
@param level is a term of the ISO 9660 standard. It should be one of:
|
||||
1= filenames restricted to form 8.3
|
||||
2= filenames allowed up to 31 characters
|
||||
3= file content may be larger than 4 GB - 1.
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
int isoburn_igopt_set_level(struct isoburn_imgen_opts *o, int level);
|
||||
@ -916,7 +1007,7 @@ int isoburn_igopt_get_level(struct isoburn_imgen_opts *o, int *level);
|
||||
advisable if the designed audience has Unix style systems.
|
||||
bit1= joliet
|
||||
Longer filenames for Windows systems.
|
||||
Weaker than RockRidge, but also readable with Linux.
|
||||
Weaker than RockRidge, but also readable with GNU/Linux.
|
||||
bit2= iso1999
|
||||
This is rather exotic. Better do not surprise the readers.
|
||||
bit3= hardlinks
|
||||
@ -931,7 +1022,8 @@ int isoburn_igopt_get_level(struct isoburn_imgen_opts *o, int *level);
|
||||
can encode ACL and XFS-style Extended Attributes.
|
||||
bit6= session_md5
|
||||
@since 0.4.2
|
||||
Produce and write a MD5 checksum of the whole session stream.
|
||||
Produce and write MD5 checksum tags of superblock, directory
|
||||
tree, and the whole session stream.
|
||||
bit7= file_md5
|
||||
@since 0.4.2
|
||||
Produce and write MD5 checksums for each single IsoFile.
|
||||
@ -941,6 +1033,27 @@ int isoburn_igopt_get_level(struct isoburn_imgen_opts *o, int *level);
|
||||
compare this with the MD5 of the actual copying. If they do
|
||||
not match then issue MISHAP event.
|
||||
See also libisofs.h iso_write_opts_set_record_md5()
|
||||
bit9= no_emul_toc
|
||||
@since 0.5.8
|
||||
On overwriteable media or random access files do not write
|
||||
the first session to LBA 32 and do not copy the first 64kB
|
||||
of the first session to LBA 0, but rather write the first
|
||||
session to LBA 0 directly.
|
||||
bit10= will_cancel
|
||||
@since 0.6.6
|
||||
Announce to libisofs that only the image size is desired
|
||||
and that the write thread will be cancelled by
|
||||
isoburn_cancel_prepared_write() before actual image writing
|
||||
occurs. Without this, cancellation can cause a MISHAP event.
|
||||
bit11= old_empty
|
||||
@since 1.0.2
|
||||
Let symbolic links and device files point to block 0, and let
|
||||
empty data files point to the address of the Volume Descriptor
|
||||
Set Terminator. This was done by libisofs in the past.
|
||||
By default there is now a single dedicated block of zero bytes
|
||||
after the end of the directory trees, of which the address
|
||||
is used for all files without own content.
|
||||
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
#define isoburn_igopt_rockridge 1
|
||||
@ -951,6 +1064,9 @@ int isoburn_igopt_get_level(struct isoburn_imgen_opts *o, int *level);
|
||||
#define isoburn_igopt_session_md5 64
|
||||
#define isoburn_igopt_file_md5 128
|
||||
#define isoburn_igopt_file_stability 256
|
||||
#define isoburn_igopt_no_emul_toc 512
|
||||
#define isoburn_igopt_will_cancel 1024
|
||||
#define isoburn_igopt_old_empty 2048
|
||||
int isoburn_igopt_set_extensions(struct isoburn_imgen_opts *o, int ext);
|
||||
int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext);
|
||||
|
||||
@ -961,8 +1077,8 @@ int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext);
|
||||
@param relax Bitfield:
|
||||
bit0= omit_version_numbers
|
||||
Omit the version number (";1") at the end of the
|
||||
ISO-9660 identifiers. Version numbers are usually
|
||||
not used.
|
||||
ISO-9660 and Joliet identifiers.
|
||||
Version numbers are usually not used by readers.
|
||||
bit1= allow_deep_paths
|
||||
Allow ISO-9660 directory hierarchy to be deeper
|
||||
than 8 levels.
|
||||
@ -1011,7 +1127,30 @@ int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext);
|
||||
prefixed ES fields. This saves 5 to 10 bytes per file and
|
||||
might avoid problems with readers which only accept RRIP.
|
||||
SUSP-1.10 allows it, SUSP-1.12 frowns on it.
|
||||
|
||||
bit12= only_iso_numbers
|
||||
Same as bit1 omit_version_number but restricted to the names
|
||||
in the eventual Joliet tree.
|
||||
@since 0.5.4
|
||||
For reasons of backward compatibility it is not possible yet
|
||||
to disable version numbers for ISO 9660 while enabling them
|
||||
for Joliet.
|
||||
bit13= no_j_force_dots
|
||||
Same as no_force_dots but affecting the names in the eventual
|
||||
Joliet tree rather than the ISO 9660 / ECMA-119 names.
|
||||
@since 0.5.4
|
||||
Previous versions added dots to Joliet names unconditionally.
|
||||
bit14= allow_dir_id_ext
|
||||
Convert directory names for ECMA-119 similar to other file
|
||||
names, but do not force a dot or add a version number.
|
||||
This violates ECMA-119 by allowing one "." and especially
|
||||
ISO level 1 by allowing DOS style 8.3 names rather than
|
||||
only 8 characters.
|
||||
(mkisofs and its clones obviously do this violation.)
|
||||
@since 1.0.0
|
||||
bit15= joliet_long_names
|
||||
Allow for Joliet leaf names up to 103 characters rather than
|
||||
up to 64.
|
||||
@since 1.0.6
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
#define isoburn_igopt_omit_version_numbers 1
|
||||
@ -1026,10 +1165,43 @@ int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext);
|
||||
#define isoburn_igopt_rrip_version_1_10 512
|
||||
#define isoburn_igopt_dir_rec_mtime 1024
|
||||
#define isoburn_igopt_aaip_susp_1_10 2048
|
||||
#define isoburn_igopt_only_iso_versions 4096
|
||||
#define isoburn_igopt_no_j_force_dots 8192
|
||||
#define isoburn_igopt_allow_dir_id_ext 16384
|
||||
#define isoburn_igopt_joliet_long_names 32768
|
||||
int isoburn_igopt_set_relaxed(struct isoburn_imgen_opts *o, int relax);
|
||||
int isoburn_igopt_get_relaxed(struct isoburn_imgen_opts *o, int *relax);
|
||||
|
||||
|
||||
/** Caution: This option breaks any assumptions about names that
|
||||
are supported by ECMA-119 specifications.
|
||||
Try to omit any translation which would make a file name compliant to the
|
||||
ECMA-119 rules. This includes and exceeds omit_version_numbers,
|
||||
max_37_char_filenames, no_force_dots bit0, allow_full_ascii. Further it
|
||||
prevents the conversion from local character set to ASCII.
|
||||
The maximum name length is given by this call. If a filename exceeds
|
||||
this length or cannot be recorded untranslated for other reasons, then
|
||||
image production gets aborted.
|
||||
Currently the length limit is 96 characters, because an ECMA-119 directory
|
||||
record may at most have 254 bytes and up to 158 other bytes must fit into
|
||||
the record. Probably 96 more bytes can be made free for the name in future.
|
||||
@since 1.0.0
|
||||
@param o The option set to work on
|
||||
@param len 0 = disable this feature and perform name translation
|
||||
according to other settings.
|
||||
>0 = Omit any translation. Eventually abort image production
|
||||
if a name is longer than the given value.
|
||||
-1 = Like >0. Allow maximum possible length.
|
||||
isoburn_igopt_get_untranslated_name_len() will tell the
|
||||
effectively resulting value.
|
||||
@return >0 success, <=0 failure
|
||||
*/
|
||||
int isoburn_igopt_set_untranslated_name_len(struct isoburn_imgen_opts *o,
|
||||
int len);
|
||||
int isoburn_igopt_get_untranslated_name_len(struct isoburn_imgen_opts *o,
|
||||
int *len);
|
||||
|
||||
|
||||
/** Whether and how files should be sorted.
|
||||
@since 0.1.0
|
||||
@param o The option set to work on
|
||||
@ -1086,7 +1258,7 @@ int isoburn_igopt_get_over_ugid(struct isoburn_imgen_opts *o,
|
||||
int *replace_uid, int *replace_gid,
|
||||
uid_t *uid, gid_t *gid);
|
||||
|
||||
/** Set the charcter set to use for representing filenames in the image.
|
||||
/** Set the charcter set to use for representing RR filenames in the image.
|
||||
@since 0.1.0
|
||||
@param o The option set to work on
|
||||
@param output_charset Set this to NULL to use the default output charset.
|
||||
@ -1145,7 +1317,7 @@ int isoburn_igopt_get_data_start(struct isoburn_imgen_opts *o, int *lba);
|
||||
/** Set resp. get parameters "name" and "timestamp" for a scdbackup checksum
|
||||
tag. It will be appended to the libisofs session tag if the image starts at
|
||||
LBA 0. See isoburn_disc_track_lba_nwa. The scdbackup tag can be used
|
||||
to verify the image by command scdbackup_verify <device> -auto_end.
|
||||
to verify the image by command scdbackup_verify $device -auto_end.
|
||||
See scdbackup/README appendix VERIFY for its inner details.
|
||||
@since 0.4.4
|
||||
@param o The option set to work on
|
||||
@ -1166,6 +1338,271 @@ int isoburn_igopt_get_scdbackup_tag(struct isoburn_imgen_opts *o,
|
||||
char **tag_written);
|
||||
|
||||
|
||||
/** Attach 32 kB of binary data which shall get written to the first 32 kB
|
||||
of the ISO image, the System Area.
|
||||
options can cause manipulations of these data before writing happens.
|
||||
If system area data are giveni or options bit0 is set, then bit1 of
|
||||
el_torito_set_isolinux_options() is automatically disabled.
|
||||
@since 0.5.4
|
||||
@param o The option set to work on
|
||||
@param data Either NULL or 32 kB of data. Do not submit less bytes !
|
||||
@param options Can cause manipulations of submitted data before they
|
||||
get written:
|
||||
bit0= apply a --protective-msdos-label as of grub-mkisofs.
|
||||
This means to patch bytes 446 to 512 of the system
|
||||
area so that one partition is defined which begins
|
||||
at the second 512-byte block of the image and ends
|
||||
where the image ends.
|
||||
This works with and without system_area_data.
|
||||
bit1= apply isohybrid MBR patching to the system area.
|
||||
This works only with system area data from
|
||||
SYSLINUX plus an ISOLINUX boot image (see
|
||||
iso_image_set_boot_image()) and only if not bit0
|
||||
is set.
|
||||
bit2-7= System area type
|
||||
0= with bit0 or bit1: MBR
|
||||
else: unspecified type
|
||||
@since 0.6.4
|
||||
1= MIPS Big Endian Volume Header
|
||||
Submit up to 15 MIPS Big Endian boot files by
|
||||
iso_image_add_mips_boot_file() of libisofs.
|
||||
This will overwrite the first 512 bytes of
|
||||
the submitted data.
|
||||
2= DEC Boot Block for MIPS Little Endian
|
||||
The first boot file submitted by
|
||||
iso_image_add_mips_boot_file() will be activated.
|
||||
This will overwrite the first 512 bytes of
|
||||
the submitted data.
|
||||
@since 0.6.6
|
||||
3= SUN Disk Label for SUN SPARC
|
||||
Submit up to 7 SPARC boot images by
|
||||
isoburn_igopt_set_partition_img() for partition
|
||||
numbers 2 to 8.
|
||||
This will overwrite the first 512 bytes of
|
||||
the submitted data.
|
||||
bit8-9= Only with System area type 0 = MBR
|
||||
@since 1.0.4
|
||||
Cylinder alignment mode eventually pads the image
|
||||
to make it end at a cylinder boundary.
|
||||
0 = auto (align if bit1)
|
||||
1 = always align to cylinder boundary
|
||||
2 = never align to cylinder boundary
|
||||
|
||||
@return 1 success, 0 no data to get, <0 failure
|
||||
*/
|
||||
int isoburn_igopt_set_system_area(struct isoburn_imgen_opts *o,
|
||||
char data[32768], int options);
|
||||
int isoburn_igopt_get_system_area(struct isoburn_imgen_opts *o,
|
||||
char data[32768], int *options);
|
||||
|
||||
/** Control production of a second set of volume descriptors (superblock)
|
||||
and directory trees, together with a partition table in the MBR where the
|
||||
first partition has non-zero start address and the others are zeroed.
|
||||
The first partition stretches to the end of the whole ISO image.
|
||||
The additional volume descriptor set and trees will allow to mount the
|
||||
ISO image at the start of the first partition, while it is still possible
|
||||
to mount it via the normal first volume descriptor set and tree at the
|
||||
start of the image resp. storage device.
|
||||
This makes few sense on optical media. But on USB sticks it creates a
|
||||
conventional partition table which makes it mountable on e.g. Linux via
|
||||
/dev/sdb and /dev/sdb1 alike.
|
||||
@since 0.6.2
|
||||
@param opts
|
||||
The option set to be manipulated.
|
||||
@param block_offset_2k
|
||||
The offset of the partition start relative to device start.
|
||||
This is counted in 2 kB blocks. The partition table will show the
|
||||
according number of 512 byte sectors.
|
||||
Default is 0 which causes no second set and trees.
|
||||
If it is not 0 then it must not be smaller than 16.
|
||||
@param secs_512_per_head
|
||||
Number of 512 byte sectors per head. 1 to 63. 0=automatic.
|
||||
@param heads_per_cyl
|
||||
Number of heads per cylinder. 1 to 255. 0=automatic.
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
int isoburn_igopt_set_part_offset(struct isoburn_imgen_opts *opts,
|
||||
uint32_t block_offset_2k,
|
||||
int secs_512_per_head, int heads_per_cyl);
|
||||
int isoburn_igopt_get_part_offset(struct isoburn_imgen_opts *opts,
|
||||
uint32_t *block_offset_2k,
|
||||
int *secs_512_per_head, int *heads_per_cyl);
|
||||
|
||||
|
||||
/** Explicitely set the four timestamps of the emerging ISO image.
|
||||
Default with all parameters is 0.
|
||||
@since 0.5.4
|
||||
@param opts
|
||||
The option set to work on
|
||||
@param creation_time
|
||||
ECMA-119 Volume Creation Date and Time
|
||||
When "the information in the volume was created."
|
||||
A value of 0 means that the timepoint of write start is to be used.
|
||||
@param modification_time
|
||||
ECMA-119 Volume Modification Date and Time
|
||||
When "the informationin the volume was last modified."
|
||||
A value of 0 means that the timepoint of write start is to be used.
|
||||
@param expiration_time
|
||||
ECMA-119 Volume Expiration Date and Time
|
||||
When "the information in the volume may be regarded as obsolete."
|
||||
A value of 0 means that the information never shall expire.
|
||||
@param effective_time
|
||||
ECMA-119 Volume Effective Date and Time
|
||||
When "the information in the volume may be used."
|
||||
A value of 0 means that not such retention is intended.
|
||||
@param uuid
|
||||
If this text is not empty, then it overrides vol_modification_time
|
||||
by copying the first 16 decimal digits from uuid, eventually
|
||||
padding up with decimal '1', and writing a NUL-byte as timezone GMT.
|
||||
It should express a reasonable time in form YYYYMMDDhhmmsscc
|
||||
E.g.: 2010040711405800 = 7 Apr 2010 11:40:58 (+0 centiseconds)
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
int isoburn_igopt_set_pvd_times(struct isoburn_imgen_opts *opts,
|
||||
time_t creation_time, time_t modification_time,
|
||||
time_t expiration_time, time_t effective_time,
|
||||
char *uuid);
|
||||
int isoburn_igopt_get_pvd_times(struct isoburn_imgen_opts *opts,
|
||||
time_t *creation_time, time_t *modification_time,
|
||||
time_t *expiration_time, time_t *effective_time,
|
||||
char uuid[17]);
|
||||
|
||||
|
||||
/** Associate a libjte environment object to the upcomming write run.
|
||||
libjte implements Jigdo Template Extraction as of Steve McIntyre and
|
||||
Richard Atterer.
|
||||
A non-NULL libjte_handle will cause failure to write if libjte was not
|
||||
enabled in libisofs at compile time.
|
||||
@since 0.6.4
|
||||
@param opts
|
||||
The option set to work on
|
||||
@param libjte_handle
|
||||
Pointer to a struct libjte_env e.g. created by libjte_new().
|
||||
It must stay existent from the start of image writing by
|
||||
isoburn_prepare_*() until the write thread has ended.
|
||||
E.g. until libburn indicates the end of its write run.
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
int isoburn_igopt_attach_jte(struct isoburn_imgen_opts *opts,
|
||||
void *libjte_handle);
|
||||
|
||||
/** Remove eventual association to a libjte environment handle.
|
||||
@since 0.6.4
|
||||
@param opts
|
||||
The option set to work on
|
||||
@param libjte_handle
|
||||
If not submitted as NULL, this will return the previously set
|
||||
libjte handle.
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
int isoburn_igopt_detach_jte(struct isoburn_imgen_opts *opts,
|
||||
void **libjte_handle);
|
||||
|
||||
|
||||
/** Set resp. get the number of trailing zero byte blocks to be written by
|
||||
libisofs. The image size counter of the emerging ISO image will include
|
||||
them. Eventual checksums will take them into respect.
|
||||
They will be written immediately before the eventual image checksum area
|
||||
which is at the very end of the image.
|
||||
For a motivation see iso_write_opts_set_tail_blocks() in libisofs.h .
|
||||
@since 0.6.4
|
||||
@param opts
|
||||
The option set to work on
|
||||
@aram num_blocks
|
||||
Number of extra 2 kB blocks to be written by libisofs.
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
int isoburn_igopt_set_tail_blocks(struct isoburn_imgen_opts *opts,
|
||||
uint32_t num_blocks);
|
||||
int isoburn_igopt_get_tail_blocks(struct isoburn_imgen_opts *opts,
|
||||
uint32_t *num_blocks);
|
||||
|
||||
|
||||
/** Cause an arbitrary data file to be appended to the ISO image and to be
|
||||
described by a partition table entry in an MBR or SUN Disk Label at the
|
||||
start of the ISO image.
|
||||
The partition entry will bear the size of the image file rounded up to
|
||||
the next multiple of 2048 bytes.
|
||||
MBR or SUN Disk Label are selected by isoburn_igopt_set_system_area()
|
||||
system area type: 0 selects MBR partition table. 3 selects a SUN partition
|
||||
table with 320 kB start alignment.
|
||||
@since 0.6.4
|
||||
@param opts
|
||||
The option set to be manipulated.
|
||||
@param partition_number
|
||||
Depicts the partition table entry which shall describe the
|
||||
appended image.
|
||||
Range with MBR: 1 to 4. 1 will cause the whole ISO image to be
|
||||
unclaimable space before partition 1.
|
||||
@since 0.6.6
|
||||
Range with SUN Disk Label: 2 to 8.
|
||||
@param image_path
|
||||
File address in the local file system.
|
||||
With SUN Disk Label: an empty name causes the partition to become
|
||||
a copy of the next lower partition.
|
||||
@param image_type
|
||||
The MBR partition type. E.g. FAT12 = 0x01 , FAT16 = 0x06,
|
||||
Linux Native Partition = 0x83. See fdisk command L.
|
||||
This parameter is ignored with SUN Disk Label.
|
||||
@return
|
||||
<=0 = error, 1 = success
|
||||
*/
|
||||
int isoburn_igopt_set_partition_img(struct isoburn_imgen_opts *opts,
|
||||
int partition_number, uint8_t partition_type,
|
||||
char *image_path);
|
||||
|
||||
/** Inquire the current settings made by isoburn_igopt_set_partition_img().
|
||||
@since 0.6.4
|
||||
@param opts
|
||||
The option set to be inquired.
|
||||
@param num_entries
|
||||
Number of array elements in partition_types[] and image_paths[].
|
||||
@param partition_types
|
||||
The partition type associated with the partition. Valid only if
|
||||
image_paths[] of the same index is not NULL.
|
||||
@param image_paths
|
||||
Its elements get filled with either NULL or a pointer to a string
|
||||
with a file address resp. an empty text.
|
||||
@return
|
||||
<0 = error
|
||||
0 = no partition image set
|
||||
>0 highest used partition number
|
||||
*/
|
||||
int isoburn_igopt_get_partition_img(struct isoburn_imgen_opts *opts,
|
||||
int num_entries,
|
||||
uint8_t partition_types[],
|
||||
char *image_paths[]);
|
||||
|
||||
|
||||
/** Set a name for the system area. This setting is ignored unless system area
|
||||
type 3 "SUN Disk Label" is in effect by iso_write_opts_set_system_area().
|
||||
In this case it will replace the default text at the start of the image:
|
||||
"CD-ROM Disc with Sun sparc boot created by libisofs"
|
||||
@since 0.6.6
|
||||
@param opts
|
||||
The option set to be manipulated.
|
||||
@param label
|
||||
A text of up to 128 characters.
|
||||
@return
|
||||
<=0 = error, 1 = success
|
||||
*/
|
||||
int isoburn_igopt_set_disc_label(struct isoburn_imgen_opts *opts, char *label);
|
||||
|
||||
/** Inquire the current setting made by isoburn_igopt_set_disc_label().
|
||||
@since 0.6.6
|
||||
@param opts
|
||||
The option set to be inquired.
|
||||
@param label
|
||||
Returns a pointer to the currently set label string.
|
||||
Do not alter this string.
|
||||
Use only as long as the opts object exists.
|
||||
@return
|
||||
<=0 = error, 1 = success
|
||||
*/
|
||||
int isoburn_igopt_get_disc_label(struct isoburn_imgen_opts *opts,
|
||||
char **label);
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/* End of Options for image generation */
|
||||
/* ----------------------------------------------------------------------- */
|
||||
@ -1228,6 +1665,23 @@ int isoburn_set_read_pacifier(struct burn_drive *drive,
|
||||
int (*read_pacifier)(IsoImage*, IsoFileSource*),
|
||||
void *app_handle);
|
||||
|
||||
/** Inquire the partition offset of the loaded image. The first 512 bytes of
|
||||
the image get examined whether they bear an MBR signature and a first
|
||||
partition table entry which matches the size of the image. In this case
|
||||
the start address is recorded as partition offset and internal buffers
|
||||
get adjusted.
|
||||
See also isoburn_igopt_set_part_offset().
|
||||
@since 0.6.2
|
||||
@param drive The drive with the loaded image
|
||||
@param block_offset_2k returns the recognized partition offset
|
||||
@return <0 = error
|
||||
0 = no partition offset recognized
|
||||
1 = acceptable non-zero offset, buffers are adjusted
|
||||
2 = offset is credible but not acceptable for buffer size
|
||||
*/
|
||||
int isoburn_get_img_partition_offset(struct burn_drive *drive,
|
||||
uint32_t *block_offset_2k);
|
||||
|
||||
|
||||
/** Set the IsoImage to be used with a drive. This eventually releases
|
||||
the reference to the old IsoImage attached to the drive.
|
||||
@ -1402,6 +1856,7 @@ int isoburn_prepare_blind_grow(struct burn_drive *in_drive,
|
||||
image stream when one of above three calls is performed. It is mandatory to
|
||||
either run isoburn_disc_write() or to revoke the preparations by the
|
||||
call described here.
|
||||
If this call returns 0 or 1 then the write thread of libisofs has ended.
|
||||
@since 0.1.0
|
||||
@param input_drive The drive resp. in_drive which was used with the
|
||||
preparation call.
|
||||
@ -1415,6 +1870,21 @@ int isoburn_cancel_prepared_write(struct burn_drive *input_drive,
|
||||
struct burn_drive *output_drive, int flag);
|
||||
|
||||
|
||||
/**
|
||||
Override the truncation setting that was made with flag bit2 during the
|
||||
call of isoburn_drive_aquire. This applies only to stdio pseudo drives.
|
||||
@since 0.1.6
|
||||
@param drive The drive which was aquired and shall be used for writing.
|
||||
@param flag Bitfield controlling the setting:
|
||||
bit0= truncate (else do not truncate)
|
||||
bit1= do not warn if call is inappropriate to drive
|
||||
bit2= only set if truncation is currently enabled
|
||||
do not warn if call is inappropriate to drive
|
||||
@return 1 success, 0 inappropriate drive, <0 severe error
|
||||
*/
|
||||
int isoburn_set_truncate(struct burn_drive *drive, int flag);
|
||||
|
||||
|
||||
/** Start writing of the new session.
|
||||
This call is asynchrounous. I.e. it returns quite soon and the progress has
|
||||
to be watched by a loop with call burn_drive_get_status() until
|
||||
@ -1526,3 +1996,7 @@ void isoburn_finish(void);
|
||||
int isoburn_needs_emulation(struct burn_drive *d);
|
||||
|
||||
|
||||
/* ---------------------------- Test area ----------------------------- */
|
||||
|
||||
/* no tests active, currently */
|
||||
|
||||
|
278
libisoburn/libisoburn.ver
Normal file
278
libisoburn/libisoburn.ver
Normal file
@ -0,0 +1,278 @@
|
||||
LIBISOBURN1 {
|
||||
global:
|
||||
isoburn_activate_session;
|
||||
isoburn_attach_image;
|
||||
isoburn_cancel_prepared_write;
|
||||
isoburn_disc_available_space;
|
||||
isoburn_disc_erasable;
|
||||
isoburn_disc_erase;
|
||||
isoburn_disc_get_msc1;
|
||||
isoburn_disc_get_status;
|
||||
isoburn_disc_track_lba_nwa;
|
||||
isoburn_disc_write;
|
||||
isoburn_drive_aquire;
|
||||
isoburn_drive_grab;
|
||||
isoburn_drive_release;
|
||||
isoburn_drive_scan_and_grab;
|
||||
isoburn_drive_set_msgs_submit;
|
||||
isoburn_drive_wrote_well;
|
||||
isoburn_finish;
|
||||
isoburn_get_attached_image;
|
||||
isoburn_get_fifo_status;
|
||||
isoburn_get_min_start_byte;
|
||||
isoburn_get_mount_params;
|
||||
isoburn_igopt_attach_jte;
|
||||
isoburn_igopt_destroy;
|
||||
isoburn_igopt_detach_jte;
|
||||
isoburn_igopt_get_data_start;
|
||||
isoburn_igopt_get_disc_label;
|
||||
isoburn_igopt_get_effective_lba;
|
||||
isoburn_igopt_get_extensions;
|
||||
isoburn_igopt_get_fifo_size;
|
||||
isoburn_igopt_get_level;
|
||||
isoburn_igopt_get_out_charset;
|
||||
isoburn_igopt_get_over_mode;
|
||||
isoburn_igopt_get_over_ugid;
|
||||
isoburn_igopt_get_partition_img;
|
||||
isoburn_igopt_get_pvd_times;
|
||||
isoburn_igopt_get_relaxed;
|
||||
isoburn_igopt_get_scdbackup_tag;
|
||||
isoburn_igopt_get_sort_files;
|
||||
isoburn_igopt_get_system_area;
|
||||
isoburn_igopt_get_tail_blocks;
|
||||
isoburn_igopt_get_untranslated_name_len;
|
||||
isoburn_igopt_new;
|
||||
isoburn_igopt_set_disc_label;
|
||||
isoburn_igopt_set_extensions;
|
||||
isoburn_igopt_set_fifo_size;
|
||||
isoburn_igopt_set_level;
|
||||
isoburn_igopt_set_out_charset;
|
||||
isoburn_igopt_set_over_mode;
|
||||
isoburn_igopt_set_over_ugid;
|
||||
isoburn_igopt_set_partition_img;
|
||||
isoburn_igopt_set_pvd_times;
|
||||
isoburn_igopt_set_relaxed;
|
||||
isoburn_igopt_set_scdbackup_tag;
|
||||
isoburn_igopt_set_sort_files;
|
||||
isoburn_igopt_set_system_area;
|
||||
isoburn_igopt_set_tail_blocks;
|
||||
isoburn_igopt_set_untranslated_name_len;
|
||||
isoburn_initialize;
|
||||
isoburn_is_compatible;
|
||||
isoburn_libburn_req;
|
||||
isoburn_libisofs_req;
|
||||
isoburn_libjte_req;
|
||||
isoburn_needs_emulation;
|
||||
isoburn_prepare_blind_grow;
|
||||
isoburn_prepare_disc;
|
||||
isoburn_prepare_new_image;
|
||||
isoburn_read_image;
|
||||
isoburn_read_iso_head;
|
||||
isoburn_ropt_destroy;
|
||||
isoburn_ropt_get_auto_incharset;
|
||||
isoburn_ropt_get_default_dirperms;
|
||||
isoburn_ropt_get_default_perms;
|
||||
isoburn_ropt_get_displacement;
|
||||
isoburn_ropt_get_extensions;
|
||||
isoburn_ropt_get_input_charset;
|
||||
isoburn_ropt_get_size_what;
|
||||
isoburn_ropt_new;
|
||||
isoburn_ropt_set_auto_incharset;
|
||||
isoburn_ropt_set_default_dirperms;
|
||||
isoburn_ropt_set_default_perms;
|
||||
isoburn_ropt_set_displacement;
|
||||
isoburn_ropt_set_extensions;
|
||||
isoburn_ropt_set_input_charset;
|
||||
isoburn_set_msc1;
|
||||
isoburn_set_msgs_submit;
|
||||
isoburn_set_read_pacifier;
|
||||
isoburn_set_truncate;
|
||||
isoburn_sync_after_write;
|
||||
isoburn_toc_disc_free;
|
||||
isoburn_toc_disc_get_sectors;
|
||||
isoburn_toc_disc_get_sessions;
|
||||
isoburn_toc_drive_get_disc;
|
||||
isoburn_toc_session_get_leadout_entry;
|
||||
isoburn_toc_session_get_sectors;
|
||||
isoburn_toc_session_get_tracks;
|
||||
isoburn_toc_track_get_emul;
|
||||
isoburn_toc_track_get_entry;
|
||||
isoburn_version;
|
||||
Xorriso_change_is_pending;
|
||||
Xorriso_destroy;
|
||||
Xorriso_dialog;
|
||||
Xorriso_eval_problem_status;
|
||||
Xorriso_execute_option;
|
||||
Xorriso__get_patch_level_text;
|
||||
Xorriso_get_problem_status;
|
||||
Xorriso_interpreter;
|
||||
Xorriso__is_compatible;
|
||||
Xorriso_lst_destroy_all;
|
||||
Xorriso_lst_get_next;
|
||||
Xorriso_lst_get_prev;
|
||||
Xorriso_lst_get_text;
|
||||
Xorriso_make_return_value;
|
||||
Xorriso_msgs_submit;
|
||||
Xorriso_msgs_submit_void;
|
||||
Xorriso_new;
|
||||
Xorriso_option_abort_on;
|
||||
Xorriso_option_abstract_file;
|
||||
Xorriso_option_acl;
|
||||
Xorriso_option_add;
|
||||
Xorriso_option_add_plainly;
|
||||
Xorriso_option_alter_date;
|
||||
Xorriso_option_append_partition;
|
||||
Xorriso_option_application_id;
|
||||
Xorriso_option_as;
|
||||
Xorriso_option_assert_volid;
|
||||
Xorriso_option_auto_charset;
|
||||
Xorriso_option_backslash_codes;
|
||||
Xorriso_option_ban_stdio_write;
|
||||
Xorriso_option_biblio_file;
|
||||
Xorriso_option_blank;
|
||||
Xorriso_option_boot_image;
|
||||
Xorriso_option_calm_drive;
|
||||
Xorriso_option_cdi;
|
||||
Xorriso_option_cdx;
|
||||
Xorriso_option_charset;
|
||||
Xorriso_option_check_md5;
|
||||
Xorriso_option_check_media;
|
||||
Xorriso_option_check_media_defaults;
|
||||
Xorriso_option_chgrpi;
|
||||
Xorriso_option_chmodi;
|
||||
Xorriso_option_chowni;
|
||||
Xorriso_option_clone;
|
||||
Xorriso_option_close;
|
||||
Xorriso_option_close_damaged;
|
||||
Xorriso_option_close_filter_list;
|
||||
Xorriso_option_commit;
|
||||
Xorriso_option_commit_eject;
|
||||
Xorriso_option_compare;
|
||||
Xorriso_option_compliance;
|
||||
Xorriso_option_copyright_file;
|
||||
Xorriso_option_cp_clone;
|
||||
Xorriso_option_cpri;
|
||||
Xorriso_option_cpx;
|
||||
Xorriso_option_cut_out;
|
||||
Xorriso_option_dev;
|
||||
Xorriso_option_devices;
|
||||
Xorriso_option_dialog;
|
||||
Xorriso_option_disk_dev_ino;
|
||||
Xorriso_option_disk_pattern;
|
||||
Xorriso_option_displacement;
|
||||
Xorriso_option_drive_class;
|
||||
Xorriso_option_dummy;
|
||||
Xorriso_option_dvd_obs;
|
||||
Xorriso_option_early_drive_test;
|
||||
Xorriso_option_eject;
|
||||
Xorriso_option_end;
|
||||
Xorriso_option_errfile_log;
|
||||
Xorriso_option_error_behavior;
|
||||
Xorriso_option_external_filter;
|
||||
Xorriso_option_extract;
|
||||
Xorriso_option_extract_cut;
|
||||
Xorriso_option_file_size_limit;
|
||||
Xorriso_option_find;
|
||||
Xorriso_option_follow;
|
||||
Xorriso_option_fs;
|
||||
Xorriso_option_getfacli;
|
||||
Xorriso_option_gid;
|
||||
Xorriso_option_grow_blindly;
|
||||
Xorriso_option_hardlinks;
|
||||
Xorriso_option_help;
|
||||
Xorriso_option_hide;
|
||||
Xorriso_option_history;
|
||||
Xorriso_option_iso_rr_pattern;
|
||||
Xorriso_option_jigdo;
|
||||
Xorriso_option_joliet;
|
||||
Xorriso_option_list_delimiter;
|
||||
Xorriso_option_list_formats;
|
||||
Xorriso_option_list_profiles;
|
||||
Xorriso_option_list_speeds;
|
||||
Xorriso_option_load;
|
||||
Xorriso_option_logfile;
|
||||
Xorriso_option_lsi;
|
||||
Xorriso_option_lsx;
|
||||
Xorriso_option_map;
|
||||
Xorriso_option_map_l;
|
||||
Xorriso_option_mark;
|
||||
Xorriso_option_md5;
|
||||
Xorriso_option_mkdiri;
|
||||
Xorriso_option_mount;
|
||||
Xorriso_option_mount_opts;
|
||||
Xorriso_option_mvi;
|
||||
Xorriso_option_no_rc;
|
||||
Xorriso_option_not_leaf;
|
||||
Xorriso_option_not_list;
|
||||
Xorriso_option_not_mgt;
|
||||
Xorriso_option_not_paths;
|
||||
Xorriso_option_options_from_file;
|
||||
Xorriso_option_osirrox;
|
||||
Xorriso_option_overwrite;
|
||||
Xorriso_option_pacifier;
|
||||
Xorriso_option_padding;
|
||||
Xorriso_option_page;
|
||||
Xorriso_option_paste_in;
|
||||
Xorriso_option_path_list;
|
||||
Xorriso_option_pathspecs;
|
||||
Xorriso_option_pkt_output;
|
||||
Xorriso_option_preparer_id;
|
||||
Xorriso_option_print;
|
||||
Xorriso_option_print_size;
|
||||
Xorriso_option_prog;
|
||||
Xorriso_option_prog_help;
|
||||
Xorriso_option_prompt;
|
||||
Xorriso_option_publisher;
|
||||
Xorriso_option_pvd_info;
|
||||
Xorriso_option_pwdi;
|
||||
Xorriso_option_pwdx;
|
||||
Xorriso_option_read_mkisofsrc;
|
||||
Xorriso_option_reassure;
|
||||
Xorriso_option_report_about;
|
||||
Xorriso_option_return_with;
|
||||
Xorriso_option_rmi;
|
||||
Xorriso_option_rollback;
|
||||
Xorriso_option_rom_toc_scan;
|
||||
Xorriso_option_scdbackup_tag;
|
||||
Xorriso_option_scsi_log;
|
||||
Xorriso_option_session_log;
|
||||
Xorriso_option_setfacli;
|
||||
Xorriso_option_setfacl_listi;
|
||||
Xorriso_option_setfattri;
|
||||
Xorriso_option_setfattr_listi;
|
||||
Xorriso_option_set_filter;
|
||||
Xorriso_option_signal_handling;
|
||||
Xorriso_option_speed;
|
||||
Xorriso_option_split_size;
|
||||
Xorriso_option_status;
|
||||
Xorriso_option_status_history_max;
|
||||
Xorriso_option_stdio_sync;
|
||||
Xorriso_option_stream_recording;
|
||||
Xorriso_option_system_id;
|
||||
Xorriso_option_tell_media_space;
|
||||
Xorriso_option_temp_mem_limit;
|
||||
Xorriso_option_toc;
|
||||
Xorriso_option_uid;
|
||||
Xorriso_option_unregister_filter;
|
||||
Xorriso_option_update;
|
||||
Xorriso_option_use_readline;
|
||||
Xorriso_option_version;
|
||||
Xorriso_option_volid;
|
||||
Xorriso_option_volset_id;
|
||||
Xorriso_option_volume_date;
|
||||
Xorriso_option_xattr;
|
||||
Xorriso_option_zisofs;
|
||||
Xorriso_prescan_args;
|
||||
Xorriso__preset_signal_behavior;
|
||||
Xorriso_process_errfile;
|
||||
Xorriso_process_msg_queues;
|
||||
Xorriso_program_arg_bsl;
|
||||
Xorriso_pull_outlists;
|
||||
Xorriso_push_outlists;
|
||||
Xorriso_read_rc;
|
||||
Xorriso_set_problem_status;
|
||||
Xorriso_startup_libraries;
|
||||
Xorriso__version;
|
||||
local: *;
|
||||
};
|
||||
|
32
releng/CHECKLIST
Normal file
32
releng/CHECKLIST
Normal file
@ -0,0 +1,32 @@
|
||||
Release Engineering Check List
|
||||
==============================
|
||||
|
||||
Automated and semi-automated tests
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
TEST: all auto_* tests are to be run by ./run_all_auto
|
||||
FILE: http://people.debian.org/~danchev/libburnia/logs/releng/
|
||||
|
||||
TEST: all manual_* tests are to be run individually and manually.
|
||||
|
||||
TEST: cppcheck
|
||||
FILE: http://people.debian.org/~danchev/libburnia/logs/cppcheck/
|
||||
|
||||
TEST: medistimator (dialog mode, size estimation, processing large trees)
|
||||
requires some specific knowledge of how the tool works, to interpret
|
||||
the results and compare them previous runs (see comments in the source).
|
||||
FILE: http://anonscm.debian.org/gitweb/?p=users/danchev/medistimator.git;a=summary
|
||||
FILE: http://people.debian.org/~danchev/libburnia/logs/medistimator/
|
||||
|
||||
Non-automated tests
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
TEST: valgrind
|
||||
FILE:
|
||||
|
||||
TEST: buildd_logs
|
||||
FILE: http://buildd.debian.org (others are also welcome)
|
||||
FILE: (err/warn from prev. builds for several h/w architectures and kernels: linux, kfreebsd, hurd)
|
||||
|
||||
TEST: gprof
|
||||
FILE: CFLAGS=-pg ./configure && make
|
||||
FILE: run resulting executable; gmon.out to be created in current cirectory
|
||||
FILE: gprof path/to/xorriso gmon.out > gprof.out
|
260
releng/README
Normal file
260
releng/README
Normal file
@ -0,0 +1,260 @@
|
||||
------------------------------------------------------------------------------
|
||||
http:libburnia-project.org
|
||||
------------------------------------------------------------------------------
|
||||
libisoburn/releng. By George Danchev <danchev@spnet.net>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
|
||||
Test suite for xorriso and libburnia libraries.
|
||||
Copyright (C) 2011 George Danchev, Thomas Schmitt
|
||||
Provided under GPL version 2 or later.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
The impatient tester will build libisoburn according to ./README and then do
|
||||
cd ./releng
|
||||
./run_all_auto -x ../xorriso/xorriso
|
||||
|
||||
More patient testers will first read the following description.
|
||||
|
||||
|
||||
The test suite
|
||||
|
||||
+++ introduce the test suite,
|
||||
|
||||
Directory ./releng of libisoburn contains a collection of test scripts and
|
||||
auxiliary data. They exercise some typical use cases of building libisoburn
|
||||
applications and running the ISO 9660 filesystem manipulation and CD/DVD/BD
|
||||
burn program xorriso.
|
||||
|
||||
|
||||
+++ inform about resource needs,
|
||||
|
||||
It is assumed that libburn and libisofs are installed, so that libisoburn
|
||||
can be configured and built. It is not mandatory that libisoburn is already
|
||||
installed. The tests may use an installed xorriso program as well as a
|
||||
freshly built one.
|
||||
|
||||
|
||||
+++ auto and manual tests
|
||||
|
||||
There are two groups of test scripts:
|
||||
|
||||
auto_* gets started and watched by script run_all_auto.
|
||||
These tests have a moderate resource consumption and do
|
||||
not cause mechanical movements of drive trays.
|
||||
|
||||
manual_* get started by the user if desired.
|
||||
Manual tests may create larger sets of temporary files,
|
||||
may download test data from the internet, may need
|
||||
system privileges beyond the reach of a sandbox user,
|
||||
and operate the mechanics of a CD drive.
|
||||
|
||||
|
||||
+++ tell how to run the tests,
|
||||
|
||||
Running automated tests
|
||||
|
||||
The test scripts expect to get run while the working directory is
|
||||
./releng
|
||||
of a libisoburn source tree. E.g.: libisoburn-1.1.4/releng
|
||||
They create all their temporary files underneath
|
||||
./releng/releng_generated_data
|
||||
Some of these files are persistent between tests.
|
||||
Nevertheless it is safe to empty ./releng/releng_generated_data after
|
||||
tests are done. The directory itself must be kept.
|
||||
|
||||
To run the unobtrusive automatic tests, build libisoburn and xorriso,
|
||||
go to directory ./releng, and execute
|
||||
|
||||
./run_all_auto -x ../xorriso/xorriso
|
||||
|
||||
or if you want to use an installed xorriso program:
|
||||
|
||||
./run_all_auto -x $(type -p xorriso)
|
||||
|
||||
|
||||
+++ General options -x , -k, -f, -c, -h, --
|
||||
+++ + All scripts support -h
|
||||
|
||||
There are several options which work with run_all_auto and any single test.
|
||||
-x absolute or relative path to xorriso binary to be run.
|
||||
-k keep self-generated data.
|
||||
-c cleanup temporary data kept from previous run and exit.
|
||||
-f simulate failure.
|
||||
-h print this help text
|
||||
-- end of general options, begin of test specific options.
|
||||
After option "--", there may be given options which are specific to
|
||||
particular manually executable test scripts.
|
||||
|
||||
|
||||
Manually executable tests
|
||||
|
||||
+++ list of manual tests
|
||||
|
||||
Currently there are the following tests which should have the attention of
|
||||
the user or require sysadmin considerations before they are run:
|
||||
|
||||
./manual_isojigdo -x ../xorriso/xorriso
|
||||
Exercises the production of a bootable Debian GNU/Linux image and its Jigdo
|
||||
files. This test downloads a Debian daily image for i386 of about 70 MB,
|
||||
extracts its content and composes a new image.
|
||||
Thus it needs about 250 MB of disk space in releng/releng_generated_data .
|
||||
This test will only work with GNU xorriso or if libjte was installed already
|
||||
when libisofs was built. libjte is part of package jigit, version >= 1.18,
|
||||
available at:
|
||||
http://www.einval.com/~steve/software/JTE/
|
||||
|
||||
./manual_devices -x ../xorriso/xorriso [-- [--dev device_file_to_use]]
|
||||
Exercises listing of all accessible optical drives and the examination of
|
||||
a one of these drives. The user needs the permission to operate the CD
|
||||
drives. This might involve the need for superuser authority.
|
||||
The media tray of the examined drive will get loaded if it is not already.
|
||||
If no option --dev is given, then the user gets asked which of the listed
|
||||
drives to examine more closely.
|
||||
|
||||
./manual_burn -x ../xorriso/xorriso [-- [--dev device_file_to_use]
|
||||
[--what ...directory...] [--any_media]]
|
||||
Burns the content of the directory given with --what onto re-usable
|
||||
media: CD-RW, DVD-RW, DVD-RAM, DVD+RW, BD-RE.
|
||||
Other media types get refused, unless option --any_media is given.
|
||||
Data, which are possibly present on the media, get overwritten.
|
||||
The result gets check read and compared with the state of the input
|
||||
directory. MD5 mismatch causes a test failure. Differences to the directory
|
||||
state are reported but still regarded as success.
|
||||
|
||||
|
||||
>>> ./run_all_manual
|
||||
|
||||
>>> + Any auto_* script can be run on its own, regardless.
|
||||
>>> List auto tests
|
||||
|
||||
|
||||
+++ give hints what to do with FAIL results.
|
||||
|
||||
The text output of the automatic tests is recorded in file
|
||||
releng_generated_data/log.run_all_auto
|
||||
|
||||
Script ./run_all_auto will detect failure of perticular tests and report
|
||||
lines from the log file which contain problem indicating key words:
|
||||
NEVER|ABORT|FATAL|FAILURE|MISHAP|SORRY|WARNING|HINT|FAIL|ERROR|WRONG
|
||||
|
||||
If the program messages in log.run_all_auto do not explain the failure,
|
||||
please contact mailing list libburn-hackers@pykix.org .
|
||||
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
Creating a new test script
|
||||
|
||||
+++ * DELIVERING A NEW TEST SCRIPT
|
||||
+++ + Start a new test script over the top of template_new_releng
|
||||
+++ + Each completed script starts with auto_ or manual_ prefix
|
||||
|
||||
If you want to provide an own test, manual or auto, then first invent a name
|
||||
for it
|
||||
test_name="releng/manual_"...some.name...
|
||||
or
|
||||
test_name="releng/auto_"...some.name...
|
||||
Then copy file releng/template_new to $test_name .
|
||||
Edit $test_name and process any line that begins by "# === TEMPLATE:".
|
||||
Do what the line prescribes and then remove it from the script. You are
|
||||
not done as long as such a line remains.
|
||||
|
||||
+++ + Each script' self-generated data are to be stored in
|
||||
+++ ./releng_generated_data/scriptname/ directory
|
||||
|
||||
Your test must not start if no file
|
||||
./inc/releng_getopts.inc
|
||||
exists, i.e. if the current working direcoty is not ./releng.
|
||||
If your test creates own files on disk, then it must do this underneath
|
||||
directory ./releng_generated_data/$test_name (resp. $GEN_DATA_DIR, see below).
|
||||
|
||||
+++ + Throw FAIL string to stdout if any failure is detected
|
||||
+++ + Return exit code 0 on success, non-zero on failure
|
||||
+++ + Use different exit codes for any failure (range 0-31)
|
||||
|
||||
In case of failure, issue a line to stdout that begins by the word "FAIL",
|
||||
followed by " : " and the name of the test (e.g. $SELF, see below).
|
||||
Make sure that the test script finally returns a non-zero exit value.
|
||||
This value should be between 1 and 28. Each type of failure should have its
|
||||
own exit value.
|
||||
Predefined are:
|
||||
31 = Unknown option or unusable argument with known option
|
||||
30 = Unexpected state of own directory for self generated files
|
||||
29 = Not in ./releng directory or missing essential parts of ./releng
|
||||
|
||||
When exiting prematurely, make sure to call function cleanup.
|
||||
|
||||
|
||||
General options, variables, and functions
|
||||
|
||||
+++ inc/releng_getopts.inc variables, functions, initializations
|
||||
|
||||
The code piece inc/releng_getopts.inc should get executed inline at the
|
||||
start of a test script.
|
||||
It initializes the following variables and sets some of them according
|
||||
to the general options of the test suite:
|
||||
|
||||
SELF basename $0
|
||||
|
||||
GEN_DATA_DIR releng_generated_data/${SELF}
|
||||
|
||||
RELENG_XORRISO Path to xorriso binary. "" or "0" means no xorriso.
|
||||
Default "0". Adjustable by option -x.
|
||||
|
||||
SIMULATE_FAILURE 0=normal operation, 1=test script shall simulate a failure.
|
||||
Default 0. Setable to 1 by option -f.
|
||||
|
||||
CLEANUP 0=do not cleanup temporary data, 1=normal operation
|
||||
Default 1. Setable to 0 by option -k.
|
||||
|
||||
SPECIFIC_HELP 0=normal operation, 1=print help text of script and exit 0
|
||||
Default 0. Setable to 1 by option -h
|
||||
|
||||
The code piece inc/releng_getopts.inc defines the follwoing functions
|
||||
for use by the single tests:
|
||||
|
||||
print_help Prints the help text for general options.
|
||||
|
||||
check_for_xorriso [-x]
|
||||
Will exit with value 31 if no path to a xorriso binary
|
||||
was defined by option -x of ./run_all_auto or a single
|
||||
test.
|
||||
Option -x of check_for_xorriso additionally tests whether
|
||||
the given path leads to an executable program.
|
||||
|
||||
cleanup Removes the directory tree GEN_DATA_DIR after making
|
||||
some safety checks.
|
||||
|
||||
boldify Try to set the terminal mode for future output to a more
|
||||
noticable style of writing.
|
||||
unboldify Reset terminal mode to normal style of writing.
|
||||
|
||||
|
||||
Specific options
|
||||
|
||||
+++ + Keep the newly added script options in sync with other scripts
|
||||
|
||||
Options which are specific to the test should begin with a double dash.
|
||||
They may have further arguments.
|
||||
Implement them in the prepared interpreter loop which begins after line
|
||||
next_is=ignore
|
||||
|
||||
Specific options shall only be interpreted by tests which get run manually.
|
||||
If you plan to introduce a specific option, look at the description of
|
||||
existing tests whether one of them would match your needs. In that case,
|
||||
please re-use the name of that existing option.
|
||||
|
||||
|
||||
=============================================================================
|
||||
TODO:
|
||||
|
||||
|
||||
* Delete debian-testing-i386-businesscard.iso with ./run_all_auto -c
|
||||
|
||||
* Have a script ./run_all_manual
|
||||
|
||||
* derive a GNU xorriso test suite from libisoburn test suite
|
||||
|
||||
* auto_ tests should know whether they work underneath run_all_auto
|
||||
or whether they run standalone
|
||||
|
28
releng/README.old
Normal file
28
releng/README.old
Normal file
@ -0,0 +1,28 @@
|
||||
Release Engineering
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
* SOFTWARE TO TEST
|
||||
+ Use latest libburnia libraries code base from svn and bzr
|
||||
(see top-level README for aditional library dependencies)
|
||||
+ Alternatively, use latest all-in-one development tarball from:
|
||||
http://www.gnu.org/software/xorriso/
|
||||
|
||||
* SETUP THE TEST ENVIRONMENT AND RUN THE TEST SUITE
|
||||
+ All tests have to be run from the releng/ directory, within
|
||||
libisoburn source tree. Self-generated data are stored in
|
||||
./releng_generated_data/ directory, and the required space for
|
||||
these data is about 300 megabytes. There is a 'master' script
|
||||
called run_all_auto, which runs all scripts prefixed with auto_*.
|
||||
+ Any auto_* script can be run on its own, regardless.
|
||||
+ Any manual_* script is to be run on its own, only.
|
||||
+ All scripts support -h, -help, --help and
|
||||
print usage help when run without options.
|
||||
|
||||
* DELIVERING A NEW TEST SCRIPT
|
||||
+ Start a new test script over the top of template_new_releng
|
||||
+ Each completed script starts with auto_ or manual_ prefix
|
||||
+ Each script' self-generated data are to be stored in
|
||||
./releng_generated_data/scriptname/ directory
|
||||
+ Keep the newly added script options in sync with other scripts
|
||||
+ Throw FAIL string to stdout if any failure is detected
|
||||
+ Return exit code 0 on success, non-zero on failure
|
||||
+ Use different exit codes for any failure (range 0-31)
|
27
releng/TODO
Normal file
27
releng/TODO
Normal file
@ -0,0 +1,27 @@
|
||||
|
||||
* Manpage examples turned into tests
|
||||
Convert most examples from xorriso(1) manpage into tests.
|
||||
|
||||
* Enhance 'auto_isocontent'
|
||||
Extend it to use some more demanding directory tree.
|
||||
MD5s should be checked. ACLs and xattr (if we are on Linux).
|
||||
All file types as of stat(2) should be tested.
|
||||
Test various comparisons:
|
||||
xorriso provides built-in means for comparison:
|
||||
xorriso -compare_r disk_path iso_rr_path
|
||||
xorriso -indev my.iso -find / vs. find input_dir
|
||||
bsdtar -xf my.iso vs. input_dir
|
||||
|
||||
* Test for wrong CD sizes would need a new test and probably an
|
||||
automatic CD changer.
|
||||
|
||||
* Burning tests - maybe a new 'manual_burning' test?
|
||||
Further if we want to have a burn test (with MD5 and checkreading)
|
||||
then we will need configuration means to enable this. By default
|
||||
it should not risk to burn one-time media which sit in the drive
|
||||
by mere accident.
|
||||
|
||||
* Library unit tests - investigate the possibility to write some
|
||||
cunit-based tests (http://cunit.sourceforge.net) for both
|
||||
xorriso.h and libisoburn.h API's. The code samples could be put into
|
||||
codesamples/ directory and run by auto_cxx or a separate auto_ script.
|
88
releng/auto_cxx
Executable file
88
releng/auto_cxx
Executable file
@ -0,0 +1,88 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright 2011 George Danchev <danchev@spnet.net>
|
||||
# Licensed under GNU GPL version 2 or later
|
||||
|
||||
set -e
|
||||
|
||||
not_in_releng_exit() {
|
||||
printf "\nPlease execute the tests from releng directory.\n\n"
|
||||
exit 1
|
||||
}
|
||||
|
||||
. inc/releng_getopts.inc || not_in_releng_exit
|
||||
|
||||
print_specific_help() {
|
||||
cat << HLP
|
||||
Specific options:
|
||||
none yet.
|
||||
Overview:
|
||||
Tests both xorriso/xorriso.h and libisoburn/libisoburn.h
|
||||
APIs for C++ cleanness.
|
||||
HLP
|
||||
}
|
||||
|
||||
if test "$SPECIFIC_HELP" = 1; then
|
||||
print_specific_help
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# xorriso binary is not needed for that particular test
|
||||
SAMPLE_CODE_DIR=codesamples
|
||||
CC=g++
|
||||
|
||||
# check compiler
|
||||
if ! which "${CC}" >/dev/null 2>&1; then
|
||||
printf "\n${SELF}: Not found: ${CC}. Install ${CC}.\n"
|
||||
cleanup
|
||||
exit 5
|
||||
fi
|
||||
|
||||
# check data dir
|
||||
if [ -d "${GEN_DATA_DIR}" ]; then
|
||||
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
|
||||
printf "\n${SELF}: use '${SELF} -c' to remove.\n"
|
||||
exit 6
|
||||
else
|
||||
mkdir "${GEN_DATA_DIR}"
|
||||
fi
|
||||
|
||||
# process sample code tests
|
||||
# if test -f "${SAMPLE_CODE_DIR}"/*.cpp; then
|
||||
for SMPL in `ls "${SAMPLE_CODE_DIR}"/*.cpp`; do
|
||||
CMD_CPL="${CC} -I../ -L ../libisoburn/.libs/ -lisoburn -o ${SMPL}.obj ${SMPL}"
|
||||
printf "${SELF}: ${CMD_CPL}\n"
|
||||
set +e
|
||||
${CMD_CPL}
|
||||
RET_CPL="$?"
|
||||
if [ ${RET_CPL} == 0 -a -f ${SMPL}.obj ]; then
|
||||
mv ${SMPL}.obj ${GEN_DATA_DIR}
|
||||
else
|
||||
printf "\nFAIL : ${SELF}: Compilation of ${SMPL}\n"
|
||||
cleanup
|
||||
exit 7
|
||||
fi
|
||||
BASE=$(basename ${SMPL}.obj)
|
||||
printf "${SELF}: Running LD_LIBRARY_PATH=../libisoburn/.libs/:${LD_LIBRARY_PATH} ${GEN_DATA_DIR}/${BASE}"
|
||||
LD_LIBRARY_PATH=../libisoburn/.libs/:${LD_LIBRARY_PATH} ${GEN_DATA_DIR}/${BASE}
|
||||
RET_SMPL="$?"
|
||||
case ${RET_SMPL} in
|
||||
0)
|
||||
printf "...ok\n"
|
||||
;;
|
||||
*)
|
||||
printf "exit code: ${RET_SMPL}\n"
|
||||
cleanup
|
||||
exit 8
|
||||
;;
|
||||
esac
|
||||
set -e
|
||||
done
|
||||
#else
|
||||
# printf "\n${SELF}: No C++ code samples found in ${SAMPLE_CODE_DIR}\n"
|
||||
#fi
|
||||
|
||||
# clean
|
||||
cleanup
|
||||
|
||||
exit 0
|
215
releng/auto_isocontent
Executable file
215
releng/auto_isocontent
Executable file
@ -0,0 +1,215 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
# Copyright 2011 George Danchev <danchev@spnet.net>
|
||||
# Licensed under GNU GPL version 2 or later
|
||||
|
||||
# Test the correct handling of hardlinks by xorriso options
|
||||
# -update_r , -hardlinks perform_update , and -extract
|
||||
|
||||
not_in_releng_exit() {
|
||||
printf "\nPlease execute the tests from releng directory.\n\n"
|
||||
exit 1
|
||||
}
|
||||
|
||||
. inc/releng_getopts.inc || not_in_releng_exit
|
||||
|
||||
print_specific_help() {
|
||||
cat << HLP
|
||||
Specific options:
|
||||
none yet.
|
||||
Overview:
|
||||
Tests ISO image contents by performing various
|
||||
image generation, extractions and comparisons.
|
||||
HLP
|
||||
}
|
||||
|
||||
if test "$SPECIFIC_HELP" = 1; then
|
||||
print_specific_help
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ ! -x $RELENG_XORRISO ]; then
|
||||
print_help
|
||||
printf "\n${SELF}: -x absolute or relative path to binary to be run.\n\n"
|
||||
exit 31
|
||||
fi
|
||||
|
||||
# check data dir, if any and after checking -x xorriso
|
||||
if [ -d "${GEN_DATA_DIR}" ]; then
|
||||
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
|
||||
printf "\n${SELF}: use '${SELF} -c' to remove.\n"
|
||||
exit 8
|
||||
else
|
||||
mkdir "${GEN_DATA_DIR}"
|
||||
fi
|
||||
|
||||
export xorriso=${RELENG_XORRISO}
|
||||
export workdir=${GEN_DATA_DIR}
|
||||
export image_file="$workdir"/xorriso_hardlinks.iso
|
||||
export on_disk="$workdir"/xorriso_hardlinks_test_dir
|
||||
export in_iso=""
|
||||
export copy_on_disk="$workdir"/xorriso_hardlinks_copy_dir
|
||||
export failure=0
|
||||
export simulate_failure=${SIMULATE_FAILURE}
|
||||
export next_is_xorriso=0
|
||||
export next_is_rc=0
|
||||
export bad=0
|
||||
export report_about="-report_about UPDATE"
|
||||
|
||||
test -z "$in_iso" && in_iso="$on_disk"
|
||||
|
||||
# mkdir "$workdir" || bad=1
|
||||
mkdir "$on_disk" || bad=1
|
||||
if test "$bad" = 1
|
||||
then
|
||||
echo -e "\nFAIL : ${SELF} : Test environment error : Cannot make directories"
|
||||
exit 3
|
||||
fi
|
||||
|
||||
# All must be set at this point
|
||||
printf "\n${SELF}: Setting up $on_disk with several hardlinks\n" >&2
|
||||
echo test_content >"$on_disk"/file_1 || exit 1
|
||||
echo test_content >"$on_disk"/file_2 || exit 1
|
||||
ln "$on_disk"/file_1 "$on_disk"/file_1_link_a || exit 1
|
||||
ln "$on_disk"/file_1 "$on_disk"/file_1_link_b || exit 1
|
||||
ln "$on_disk"/file_2 "$on_disk"/file_2_link_a || exit 1
|
||||
ls -l "$on_disk"/*
|
||||
|
||||
# trivial ISO 9660 image validation routine
|
||||
is_valid_iso9660() {
|
||||
ISOfile="$1"
|
||||
if [ ! -f ${ISOfile} ]; then
|
||||
failure=1
|
||||
printf "\nFAIL : ${SELF} : Not found: ${ISOfile}\n"
|
||||
fi
|
||||
if file ${ISOfile} | grep -P "ISO\s+9660\s+CD-ROM\s+filesystem\s+data" >/dev/null 2>&1; then
|
||||
printf "\n${SELF}: Resulting ${ISOfile} OK. Looks like ISO 9660 filesystem.\n"
|
||||
else
|
||||
failure=1
|
||||
printf "\nFAIL : ${SELF} : ${ISOfile} DOES NOT look like ISO 9660 filesystem data.\n"
|
||||
fi
|
||||
}
|
||||
|
||||
echo -e "\n${SELF}: Producing simple image via -o" >&2
|
||||
"$xorriso" -as mkisofs "$on_disk" -o "$workdir"/image_minus_o.iso
|
||||
is_valid_iso9660 "$workdir"/image_minus_o.iso
|
||||
echo -e "\n${SELF}: Producing simple image via redirect" >&2
|
||||
"$xorriso" -as mkisofs "$on_disk" > "$workdir"/image_redirected.iso
|
||||
is_valid_iso9660 "$workdir"/image_redirected.iso
|
||||
echo -e "\n${SELF}: Producing simple image via pipe" >&2
|
||||
"$xorriso" -as mkisofs "$on_disk" | cat > "$workdir"/image_piped.iso
|
||||
is_valid_iso9660 "$workdir"/image_piped.iso
|
||||
|
||||
echo -e "\n${SELF}: Producing simple image with for_backup/update_r/hardlinks" >&2
|
||||
"$xorriso" \
|
||||
$report_about \
|
||||
-version \
|
||||
-for_backup \
|
||||
-padding 0 \
|
||||
-outdev "$image_file" \
|
||||
-volid TEST_AUTO_ISOCONTENT \
|
||||
-update_r "$on_disk" "$in_iso" \
|
||||
-hardlinks perform_update
|
||||
ret=$?
|
||||
if test "$ret" -gt 0 -a "$ret" -lt 32
|
||||
then
|
||||
printf "\n${SELF}: xorriso write run failed\n\n" >&2
|
||||
cleanup
|
||||
printf "${SELF}: FAILED\n"
|
||||
exit 1
|
||||
fi
|
||||
is_valid_iso9660 "$image_file"
|
||||
|
||||
|
||||
# It must refuse to load and go on with -assert_volid and non-matching pattern.
|
||||
msg=$(\
|
||||
"$xorriso" \
|
||||
-abort_on FATAL \
|
||||
-return_with FAILURE 32 \
|
||||
-assert_volid 'NON_MATCHING*' FATAL \
|
||||
-indev "$image_file" \
|
||||
2>&1
|
||||
)
|
||||
ret=$?
|
||||
if test "$ret" -gt 0 -a "$ret" -lt 32
|
||||
then
|
||||
printf "\n${SELF}: Ok. -assert_volid snapped.\n"
|
||||
elif test "$ret" -ne 0
|
||||
then
|
||||
failure=1
|
||||
echo >&2
|
||||
echo "$msg" >&2
|
||||
printf "\nFAIL : ${SELF} : -assert_volid test not properly performed\n\n" >&2
|
||||
else
|
||||
failure=1
|
||||
printf "\nFAIL : ${SELF} : -assert_volid did not snap\n\n" >&2
|
||||
fi
|
||||
|
||||
echo -e "\n${SELF}: Copying from image to temporary disk tree" >&2
|
||||
"$xorriso" \
|
||||
$report_about \
|
||||
-for_backup \
|
||||
-assert_volid 'TEST_AUTO_ISOCONT*' FATAL \
|
||||
-indev "$image_file" \
|
||||
-osirrox on \
|
||||
-find "$in_iso" -exec lsdl -- \
|
||||
-extract "$in_iso" "$copy_on_disk"
|
||||
ret=$?
|
||||
if test "$ret" -gt 0 -a "$ret" -lt 32
|
||||
then
|
||||
printf "\n${SELF}: xorriso file extraction run failed\n\n" >&2
|
||||
cleanup
|
||||
printf "${SELF}: FAILED\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test "$simulate_failure" = 1
|
||||
then
|
||||
echo -e "\n${SELF}: SIMULATING FAILURE BY REMOVING AN EXTRACTED FILE" >&2
|
||||
echo -e "\nFAIL : ${SELF} : Simulated failure caused by option -fail"
|
||||
rm "$copy_on_disk"/file_1_link_b
|
||||
fi
|
||||
|
||||
|
||||
printf "\n${SELF}: Comparing original disk tree and temporary one..." >&2
|
||||
diff -r "$on_disk" "$copy_on_disk"
|
||||
if test "$?" -ne 0
|
||||
then
|
||||
echo -e "\nFAIL : ${SELF} : diff -r $on_disk $copy_on_disk reports differences" >&2
|
||||
echo -e "\nFAIL : ${SELF} : diff -r reports differences"
|
||||
failure=1
|
||||
else
|
||||
printf "OK" >&2
|
||||
fi
|
||||
|
||||
printf "\n${SELF}: Checking for hardlinks being siblings...\n"
|
||||
ls -l "$copy_on_disk"/*
|
||||
x=$(echo $(ls -l "$copy_on_disk"/* | awk '{print $2}'))
|
||||
expected="3 3 3 2 2"
|
||||
if test x"$x" = x"$expected"
|
||||
then
|
||||
printf "\n${SELF}: Checking for hardlinks being siblings. Done. OK.\n" >&2
|
||||
else
|
||||
printf "\nFAIL : ${SELF} : Link count of extracted files is not as expected." >&2
|
||||
printf "\n${SELF}: Expected: $expected" >&2
|
||||
printf "\n${SELF}: Got : $x\n" >&2
|
||||
failure=1
|
||||
fi
|
||||
|
||||
#
|
||||
cleanup
|
||||
|
||||
# Report result
|
||||
echo
|
||||
if test "$failure" = 1
|
||||
then
|
||||
printf "${SELF}: FAILED"
|
||||
echo
|
||||
exit 1
|
||||
else
|
||||
printf "${SELF}: Passed"
|
||||
echo
|
||||
fi
|
||||
|
||||
exit 0
|
111
releng/auto_printsize
Executable file
111
releng/auto_printsize
Executable file
@ -0,0 +1,111 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright 2011 George Danchev <danchev@spnet.net>
|
||||
# Licensed under GNU GPL version 2 or later
|
||||
|
||||
set -e
|
||||
|
||||
not_in_releng_exit() {
|
||||
printf "\nPlease execute the tests from releng directory.\n\n"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Include common bits
|
||||
. inc/releng_getopts.inc || not_in_releng_exit
|
||||
|
||||
print_specific_help() {
|
||||
cat << HLP
|
||||
Specific options:
|
||||
none yet.
|
||||
Overview:
|
||||
Test performance of print_size against various input tree.
|
||||
Optionally compare with genisoimage and mkisofs.
|
||||
HLP
|
||||
}
|
||||
|
||||
if test "$SPECIFIC_HELP" = 1; then
|
||||
print_specific_help
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Each test should decide whether or not it needs
|
||||
# a xorriso binary to test, since some do compilations only.
|
||||
if [ ! -x $RELENG_XORRISO ]; then
|
||||
print_help
|
||||
printf "\n${SELF}: -x absolute or relative path to binary to be run.\n\n"
|
||||
exit 31
|
||||
fi
|
||||
|
||||
# check data dir, if any and after checking -x xorriso
|
||||
if [ -d "${GEN_DATA_DIR}" ]; then
|
||||
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
|
||||
printf "\n${SELF}: use '${SELF} -c' to remove.\n"
|
||||
exit 8
|
||||
else
|
||||
mkdir "${GEN_DATA_DIR}"
|
||||
fi
|
||||
|
||||
#
|
||||
DIR_UPPER=32
|
||||
FILE_UPPER=10
|
||||
|
||||
# All must be set at this point
|
||||
# TODO: work out a smarter way to quickly generate different
|
||||
# types of trees (long, deep, etc)
|
||||
printf "\n${SELF}: Generating sample tree in ${GEN_DATA_DIR} :\n"
|
||||
count=0
|
||||
date
|
||||
for ((i1=0; i1 < ${DIR_UPPER}/4; i1++))
|
||||
do
|
||||
for ((i2=0; i2 < ${DIR_UPPER}/2; i2++))
|
||||
do
|
||||
for ((i3=0; i3 < ${DIR_UPPER}; i3++))
|
||||
do
|
||||
mkdir -p ${GEN_DATA_DIR}/DirOne$i1/DirTwo$i2/DirThree$i3
|
||||
for ((i_file=0; i_file < ${FILE_UPPER}; i_file++))
|
||||
do
|
||||
echo -n \
|
||||
> ${GEN_DATA_DIR}/DirOne$i1/DirTwo$i2/DirThree$i3/File_${i_file}
|
||||
count=$((count + 1))
|
||||
done
|
||||
done
|
||||
done
|
||||
echo " ${count} files created ..."
|
||||
done
|
||||
printf "done.\n"
|
||||
date
|
||||
du -s "${GEN_DATA_DIR}"
|
||||
|
||||
printf "\n${SELF}: Performing several print size runs to neutralize possible disk cache impact.\n"
|
||||
|
||||
# run xorriso
|
||||
if [ -x ${RELENG_XORRISO} ]; then
|
||||
for run in 1 2 3; do
|
||||
printf "\n${SELF}: Running ${RELENG_XORRISO} -as mkisofs -quiet -print-size ${GEN_DATA_DIR}. Trial: ${run}.\n"
|
||||
time ${RELENG_XORRISO} -as mkisofs -quiet -print-size ${GEN_DATA_DIR}
|
||||
done
|
||||
fi
|
||||
|
||||
# try to run genisoimage
|
||||
if which genisoimage >/dev/null 2>&1; then
|
||||
RELENG_GENISOIMAGE=`which genisoimage`
|
||||
for run in 1 2 3; do
|
||||
printf "\n${SELF}: Running ${RELENG_GENISOIMAGE} -quiet -print-size ${GEN_DATA_DIR}. Trial: ${run}.\n"
|
||||
time ${RELENG_GENISOIMAGE} -quiet -print-size ${GEN_DATA_DIR}
|
||||
done
|
||||
fi
|
||||
|
||||
# try to run mkisofs
|
||||
if which mkisofs >/dev/null 2>&1; then
|
||||
RELENG_MKISOFS=`which mkisofs`
|
||||
for run in 1 2 3; do
|
||||
printf "\n${SELF}: Running ${RELENG_MKISOFS} -quiet -print-size ${GEN_DATA_DIR}. Trial: ${run}.\n"
|
||||
time ${RELENG_MKISOFS} -quiet -print-size ${GEN_DATA_DIR}
|
||||
done
|
||||
fi
|
||||
|
||||
#
|
||||
cleanup
|
||||
|
||||
#
|
||||
exit 0
|
34
releng/codesamples/api_3lib.cpp
Normal file
34
releng/codesamples/api_3lib.cpp
Normal file
@ -0,0 +1,34 @@
|
||||
// Just to ensure we are C++-clean. This should not spit too much noise
|
||||
|
||||
/* Copyright 2011 George Danchev <danchev@spnet.net>
|
||||
* Licensed under GNU GPL version 2
|
||||
*/
|
||||
|
||||
#if __WORDSIZE == 32
|
||||
#define _LARGEFILE_SOURCE 1
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
#endif
|
||||
|
||||
#include <iostream>
|
||||
#include <inttypes.h>
|
||||
|
||||
extern "C" {
|
||||
#include <libburn/libburn.h>
|
||||
#include <libisofs/libisofs.h>
|
||||
// using namespace burn;
|
||||
// (this was needed to before rev.4062 of libisoburn)
|
||||
#include <libisoburn/libisoburn.h>
|
||||
}
|
||||
|
||||
int main() {
|
||||
int major=-1, minor=-1, micro=-1;
|
||||
isoburn_version(&major, &minor, µ);
|
||||
if (major<0 || minor<0 || micro<0)
|
||||
return -1;
|
||||
std::cout
|
||||
<< " major:" << major
|
||||
<< " minor:" << minor
|
||||
<< " micro:" << micro
|
||||
;
|
||||
return 0;
|
||||
}
|
30
releng/codesamples/api_xorriso.cpp
Normal file
30
releng/codesamples/api_xorriso.cpp
Normal file
@ -0,0 +1,30 @@
|
||||
// Just to ensure we are C++-clean. This should not spit too much noise
|
||||
|
||||
/* Copyright 2011 George Danchev <danchev@spnet.net>
|
||||
* Licensed under GNU GPL version 2
|
||||
*/
|
||||
|
||||
#if __WORDSIZE == 32
|
||||
#define _LARGEFILE_SOURCE 1
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
#endif
|
||||
|
||||
#include <iostream>
|
||||
#include <inttypes.h>
|
||||
|
||||
extern "C" {
|
||||
#include "xorriso/xorriso.h"
|
||||
}
|
||||
|
||||
int main() {
|
||||
int major=-1, minor=-1, micro=-1;
|
||||
Xorriso__version(&major, &minor, µ);
|
||||
if (major<0 || minor<0 || micro<0)
|
||||
return -1;
|
||||
std::cout
|
||||
<< " major:" << major
|
||||
<< " minor:" << minor
|
||||
<< " micro:" << micro
|
||||
;
|
||||
return 0;
|
||||
}
|
167
releng/inc/releng_getopts.inc
Normal file
167
releng/inc/releng_getopts.inc
Normal file
@ -0,0 +1,167 @@
|
||||
# Copyright 2011 George Danchev <danchev@spnet.net>
|
||||
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
# Licensed under GNU GPL version 2 or later
|
||||
|
||||
SELF=$(basename $0)
|
||||
RELENG_XORRISO=0
|
||||
SIMULATE_FAILURE=0
|
||||
CLEANUP=1
|
||||
SPECIFIC_HELP=0
|
||||
|
||||
START_DIR_DONT_CHANGE=`pwd`
|
||||
GEN_DATA_DIR=releng_generated_data/${SELF}
|
||||
|
||||
#############################################
|
||||
print_help() {
|
||||
cat << EOF
|
||||
|
||||
Usage: $SELF -x path/to/xorriso [-k] [-f] [-c] [-h]
|
||||
[-- ...test specific options...]
|
||||
General options:
|
||||
-x absolute or relative path to xorriso binary to be run.
|
||||
-k keep self-generated data.
|
||||
-c cleanup self-generated data kept from previous run and exit.
|
||||
-f simulate failure.
|
||||
-h print this help text
|
||||
-- end of general options, begin of test specific options.
|
||||
EOF
|
||||
}
|
||||
|
||||
boldify() {
|
||||
if which tput >/dev/null 2>&1; then tput smso; fi
|
||||
}
|
||||
|
||||
unboldify() {
|
||||
if which tput >/dev/null 2>&1; then tput rmso; fi
|
||||
}
|
||||
|
||||
#############################################
|
||||
cleanup() {
|
||||
if [ ${CLEANUP} -eq 1 ]; then
|
||||
# safety net, just in case -> we want to be in the starting
|
||||
# directory before removing whatever self-generated stuff
|
||||
if [ -d "${GEN_DATA_DIR}" ]; then
|
||||
cd "${START_DIR_DONT_CHANGE}" || exit 2
|
||||
|
||||
# Verify once again we are in the releng_generated_data directory
|
||||
# Check for both returned code of grep and returned matching string
|
||||
READ_CANON_EXISTS=`readlink -e "${GEN_DATA_DIR}"`
|
||||
DIR_NAME_GEN_DATA=`dirname "${READ_CANON_EXISTS}"`
|
||||
set +e
|
||||
RET_NON_EMPTY_STRING=`echo "${DIR_NAME_GEN_DATA}" | grep -P "\w+\/releng_generated_data$"`
|
||||
GREP_RET_GEN_DATA="$?"
|
||||
case "${GREP_RET_GEN_DATA}" in
|
||||
0)
|
||||
if [ x"${RET_NON_EMPTY_STRING}" != x"" ]; then
|
||||
# now call the nastiness
|
||||
chmod +w -R ${GEN_DATA_DIR}
|
||||
rm -rf ${GEN_DATA_DIR}
|
||||
boldify
|
||||
printf "${SELF}: Removed (self-generated) %s\n" ${GEN_DATA_DIR}
|
||||
unboldify
|
||||
else
|
||||
printf "FAIL : ${SELF} : Safety check for being in releng_generated_data directory.\n"
|
||||
printf "FAIL : ${SELF} : GREP returned empty string: ${RET_NON_EMPTY_STRING}.\n"
|
||||
printf "FAIL : ${SELF} : Skipped trying to remove ${GEN_DATA_DIR} directory. Exiting.\n"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
printf "FAIL : ${SELF} : Safety check for being in releng_generated_data directory.\n"
|
||||
printf "FAIL : ${SELF} : GREP returned code: ${GREP_RET_GEN_DATA}.\n"
|
||||
printf "FAIL : ${SELF} : Skipped trying to remove ${GEN_DATA_DIR} directory. Exiting.\n"
|
||||
exit 30
|
||||
;;
|
||||
esac
|
||||
else
|
||||
printf "${SELF}: ${GEN_DATA_DIR} does not exist. Nothing to clean.\n"
|
||||
fi
|
||||
else
|
||||
boldify
|
||||
printf "${SELF}: Leaving (self-generated) %s\n" ${GEN_DATA_DIR}
|
||||
unboldify
|
||||
fi
|
||||
}
|
||||
|
||||
#############################################
|
||||
|
||||
check_for_xorriso() {
|
||||
# $1: if "-x" then check executability
|
||||
|
||||
if test -z "$RELENG_XORRISO" -o "$RELENG_XORRISO" = "0"
|
||||
then
|
||||
print_help
|
||||
# print_specific_help
|
||||
echo
|
||||
echo "${SELF}: Need -x absolute or relative path to xorriso binary."
|
||||
echo
|
||||
exit 31
|
||||
fi
|
||||
if [ x"$1" = x"-x" -a ! -x "$RELENG_XORRISO" ]
|
||||
then
|
||||
print_help
|
||||
# print_specific_help
|
||||
echo
|
||||
echo "${SELF}: Path given by option -x does not lead to an executable file."
|
||||
echo "Given is: '$RELENG_XORRISO'"
|
||||
if test "$RELENG_XORRISO" = "xorriso"
|
||||
then
|
||||
xorriso=$(type -p xorriso)
|
||||
if test -n "xorriso"
|
||||
then
|
||||
echo "Hint: Try '$xorriso'"
|
||||
fi
|
||||
fi
|
||||
echo
|
||||
exit 31
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
#############################################
|
||||
|
||||
next_is=
|
||||
for i in "$@"
|
||||
do
|
||||
if test "$next_is" = "ignore"
|
||||
then :
|
||||
elif test "$next_is" = "x"
|
||||
then
|
||||
RELENG_XORRISO="$i"
|
||||
next_is=
|
||||
elif test x"$i" = x"-x"
|
||||
then
|
||||
next_is="x"
|
||||
elif test x"$i" = x"-k"
|
||||
then
|
||||
CLEANUP=0
|
||||
elif test x"$i" = x"-c"
|
||||
then
|
||||
CLEANUP=1
|
||||
cleanup
|
||||
exit 0
|
||||
elif test x"$i" = x"-f"
|
||||
then
|
||||
SIMULATE_FAILURE=1
|
||||
elif test x"$i" = x"-h"
|
||||
then
|
||||
print_help
|
||||
SPECIFIC_HELP=1
|
||||
elif test x"$i" = x"--"
|
||||
then
|
||||
# Begin of private arguments for caller
|
||||
next_is="ignore"
|
||||
else
|
||||
echo >&2
|
||||
echo "Unknown general option: $i" >&2
|
||||
print_help
|
||||
exit 31
|
||||
fi
|
||||
done
|
||||
|
||||
if test "$next_is" = x
|
||||
then
|
||||
echo >&2
|
||||
echo "Option -x expects an argument (the path to the xorriso program)" >&2
|
||||
print_help
|
||||
exit 31
|
||||
fi
|
12
releng/inc/test_releng_getopt
Executable file
12
releng/inc/test_releng_getopt
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
. releng_getopts.inc
|
||||
|
||||
printf "\nRELENG_XORRISO =${RELENG_XORRISO}"
|
||||
printf "\nCLEANUP =${CLEANUP}"
|
||||
printf "\nSIMULATE_FAILURE =${SIMULATE_FAILURE}"
|
||||
printf "\n"
|
||||
|
||||
exit 0
|
214
releng/manual_burn
Executable file
214
releng/manual_burn
Executable file
@ -0,0 +1,214 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright 2011 George Danchev <danchev@spnet.net>
|
||||
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
#
|
||||
# Licensed under GNU GPL version 2 or later
|
||||
|
||||
set -e
|
||||
# set -x
|
||||
|
||||
print_specific_help() {
|
||||
cat << HLP
|
||||
Specific options:
|
||||
--dev path use path as drive address. Default: /dev/cdrw
|
||||
--what path use path as address of the directory which shall
|
||||
be copied into an ISO 9660 filesystem on media.
|
||||
--any_media allow non re-usable MMC media, like CD-R or DVD+R.
|
||||
Allow paths to non-existing files, but disallow paths
|
||||
to existing regular files.
|
||||
Overview:
|
||||
Test burning to re-usable media CD-RW, DVD-RW, DVD-RAM, DVD+RW, BD-RE.
|
||||
By default, one-time usable media will be rejected deliberately.
|
||||
HLP
|
||||
}
|
||||
|
||||
getopts_inc=inc/releng_getopts.inc
|
||||
if test -e "$getopts_inc"
|
||||
then
|
||||
. "$getopts_inc"
|
||||
if test "$SPECIFIC_HELP" = 1
|
||||
then
|
||||
print_specific_help
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
echo >&2
|
||||
echo "File not found: $getopts_inc" >&2
|
||||
echo "Are we in the ./releng directory of a libisoburn SVN checkout ?" >&2
|
||||
echo "(Please execute the tests from that ./releng directory.)" >&2
|
||||
echo >&2
|
||||
exit 29
|
||||
fi
|
||||
|
||||
# Set default values for specific option variables.
|
||||
dev=/dev/cdrw
|
||||
what=../xorriso
|
||||
any_media=0
|
||||
# Interpret specific options, they begin after the first --.
|
||||
next_is=ignore
|
||||
for i in "$@"
|
||||
do
|
||||
if test "$next_is" = "ignore"
|
||||
then
|
||||
if test "$i" = "--"
|
||||
then
|
||||
next_is=""
|
||||
fi
|
||||
elif test "$next_is" = "dev"
|
||||
then
|
||||
dev="$i"
|
||||
next_is=""
|
||||
elif test "$next_is" = "what"
|
||||
then
|
||||
what="$i"
|
||||
next_is=""
|
||||
elif test "$i" = "--dev"
|
||||
then
|
||||
next_is="dev"
|
||||
elif test "$i" = "--what"
|
||||
then
|
||||
next_is="what"
|
||||
elif test "$i" = "--any_media"
|
||||
then
|
||||
any_media=1
|
||||
else
|
||||
echo >&2
|
||||
echo "Unknown test specific option: $i" >&2
|
||||
print_help
|
||||
print_specific_help
|
||||
exit 31
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
check_for_xorriso -x
|
||||
|
||||
|
||||
# check data dir, if any and after checking -x xorriso
|
||||
if [ -d "${GEN_DATA_DIR}" ]; then
|
||||
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
|
||||
printf "\n${SELF}: use '${SELF} -c' to remove.\n"
|
||||
exit 30
|
||||
else
|
||||
mkdir "${GEN_DATA_DIR}"
|
||||
fi
|
||||
|
||||
|
||||
#####################################################################
|
||||
|
||||
# Inspect drive address
|
||||
if test -e "$dev"
|
||||
then
|
||||
if test "$any_media" = 1 -a -f "$dev"
|
||||
then
|
||||
echo "FAIL : ${SELF} : --dev $dev leads to an existing regular file"
|
||||
echo
|
||||
cleanup
|
||||
exit 31
|
||||
fi
|
||||
else
|
||||
if test "$any_media" = "0"
|
||||
then
|
||||
echo "FAIL : ${SELF} : --dev $dev does not lead to an existing file"
|
||||
echo
|
||||
cleanup
|
||||
exit 31
|
||||
fi
|
||||
fi
|
||||
|
||||
# Inspect media
|
||||
set +e
|
||||
res=$("$RELENG_XORRISO" -outdev "$dev" 2>&1)
|
||||
ret=$?
|
||||
set -e
|
||||
if test "$ret" -ne 0
|
||||
then
|
||||
echo "$res" >&2
|
||||
echo "FAIL : ${SELF} : Non-zero exit value $ret with: $RELENG_XORRISO -outdev $dev"
|
||||
echo
|
||||
cleanup
|
||||
exit 1
|
||||
elif echo "$res" | grep '^Media current:' >/dev/null 2>&1
|
||||
then
|
||||
media=$(echo "$res" | grep '^Media current:' | \
|
||||
sed -e 's/^Media current: //')
|
||||
echo "Detected media: '$media'"
|
||||
if test "$media" = "CD-RW" -o "$media" = "DVD-RW sequential recording" -o \
|
||||
"$media" = "DVD-RW restricted overwrite" -o "$media" = "DVD-RAM" -o \
|
||||
"$media" = "DVD+RW" -o "$media" = "BD-RE"
|
||||
then
|
||||
echo "Recognized as re-usable."
|
||||
elif test "$media" = "is not recognizable"
|
||||
then
|
||||
echo "FAIL : ${SELF} : No recognizable media detected in: '$dev'"
|
||||
echo
|
||||
cleanup
|
||||
exit 2
|
||||
elif test "$any_media" = 1
|
||||
then
|
||||
echo "Accepted media only because of option --any_media : '$media'"
|
||||
else
|
||||
echo "FAIL : ${SELF} : No re-usable media detected, but: '$media'"
|
||||
echo
|
||||
cleanup
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
|
||||
# Perform burn run
|
||||
echo "$RELENG_XORRISO" -for_backup -outdev "$dev" -blank as_needed -map "$what" /test
|
||||
set +e
|
||||
"$RELENG_XORRISO" \
|
||||
-for_backup \
|
||||
-outdev "$dev" \
|
||||
-blank as_needed \
|
||||
-map "$what" /test
|
||||
ret=$?
|
||||
set -e
|
||||
if test "$ret" -ne 0
|
||||
then
|
||||
echo "FAIL : ${SELF} : Non-zero exit value with burn run: $ret"
|
||||
echo
|
||||
cleanup
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test "$SIMULATE_FAILURE" = 1
|
||||
then
|
||||
echo "FAIL : ${SELF} : Simulated failure caused by option -f"
|
||||
if test -f "$dev"
|
||||
then
|
||||
# Alter image
|
||||
dd if=/dev/urandom bs=2K count=1 \
|
||||
of="$dev" conv=notrunc seek=400
|
||||
else
|
||||
cleanup
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check read
|
||||
echo "$RELENG_XORRISO" -for_backup -indev "$dev" \
|
||||
-check_media event=FATAL -- \ -check_md5_r FATAL / --
|
||||
set +e
|
||||
"$RELENG_XORRISO" \
|
||||
-for_backup \
|
||||
-indev "$dev" \
|
||||
-print '---check_media:' -check_media event=FATAL -- \
|
||||
-print '---check_md5_r:' -check_md5_r FATAL / -- \
|
||||
-print '---compare_r:' -md5 off -compare_r "$what" /test
|
||||
ret=$?
|
||||
set -e
|
||||
if test "$ret" -ne 0
|
||||
then
|
||||
echo "FAIL : ${SELF} : Non-zero exit value with checkread run: $ret"
|
||||
echo
|
||||
cleanup
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Ok. Burn test passed."
|
||||
echo
|
||||
cleanup
|
||||
exit 0
|
174
releng/manual_devices
Executable file
174
releng/manual_devices
Executable file
@ -0,0 +1,174 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright 2011 George Danchev <danchev@spnet.net>
|
||||
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
# Licensed under GNU GPL version 2 or later
|
||||
|
||||
# set -e
|
||||
|
||||
print_specific_help() {
|
||||
cat << HLP
|
||||
Specific options:
|
||||
--dev path Suppress dialog and use path as drive address.
|
||||
Overview:
|
||||
Test device scanning and list of speeds.
|
||||
HLP
|
||||
}
|
||||
|
||||
# Include common bits and interpret general options
|
||||
getopts_inc=inc/releng_getopts.inc
|
||||
if test -e "$getopts_inc"
|
||||
then
|
||||
. "$getopts_inc"
|
||||
|
||||
if test "$SPECIFIC_HELP" = 1
|
||||
then
|
||||
print_specific_help
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
echo >&2
|
||||
echo "File not found: $getopts_inc" >&2
|
||||
echo "Are we in the ./releng directory of a libisoburn SVN checkout ?" >&2
|
||||
echo "(Please execute the tests from that ./releng directory.)" >&2
|
||||
echo >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# Interpret private options, they begin after the first --.
|
||||
dev=
|
||||
next_is=ignore
|
||||
for i in "$@"
|
||||
do
|
||||
if test "$next_is" = "ignore"
|
||||
then
|
||||
if test "$i" = "--"
|
||||
then
|
||||
next_is=""
|
||||
fi
|
||||
elif test "$next_is" = "dev"
|
||||
then
|
||||
dev="$i"
|
||||
next_is=""
|
||||
elif test "$i" = "--dev"
|
||||
then
|
||||
next_is="dev"
|
||||
else
|
||||
echo >&2
|
||||
echo "Unknown test specific option: $i" >&2
|
||||
print_help
|
||||
print_specific_help
|
||||
exit 31
|
||||
fi
|
||||
done
|
||||
|
||||
# Insist in having a xorriso
|
||||
check_for_xorriso -x
|
||||
|
||||
has_device_links=$("$RELENG_XORRISO" -help 2>/dev/null | fgrep ' -device_links')
|
||||
if test -n "$has_device_links"
|
||||
then
|
||||
devices_opt="-device_links"
|
||||
else
|
||||
devices_opt="-devices"
|
||||
fi
|
||||
|
||||
#
|
||||
get_speeds() {
|
||||
echo -e "\n${SELF}: Running: ${RELENG_XORRISO} -report_about WARNING -outdev ${1} -toc -list_formats -list_profiles out -list_speeds"
|
||||
"$RELENG_XORRISO" -report_about WARNING -outdev "$1" \
|
||||
-print '---toc :' -toc \
|
||||
-print '---list_formats :' -list_formats \
|
||||
-print '---list_profiles :' -list_profiles out \
|
||||
-print '---list_speeds :' -list_speeds
|
||||
}
|
||||
|
||||
cat_var() {
|
||||
# $1 = variable to put out with line feeds
|
||||
cat <<+
|
||||
$1
|
||||
+
|
||||
}
|
||||
|
||||
get_devices() {
|
||||
# $1 = if not empty: device lines from xorriso -devices or -device_links
|
||||
# $2 = if not empty: suppress dialog and use $2 as input
|
||||
|
||||
if test -n "$1"
|
||||
then
|
||||
DEVICES="$1"
|
||||
else
|
||||
DEVICES=$("$RELENG_XORRISO" $devices_opt 2>/dev/null | grep "\-dev")
|
||||
fi
|
||||
NUM_DEV=$(cat_var "$DEVICES" | wc -l)
|
||||
case "${NUM_DEV}" in
|
||||
0)
|
||||
echo -e "\n${SELF}: No drives found."
|
||||
exit 1
|
||||
;;
|
||||
1)
|
||||
echo -e "\n${SELF}: 1 drive found:\n"
|
||||
;;
|
||||
*)
|
||||
echo -e "\n${SELF}: ${NUM_DEV} drives found:\n"
|
||||
;;
|
||||
esac
|
||||
echo =================================================================
|
||||
echo "$DEVICES"
|
||||
echo =================================================================
|
||||
|
||||
OUTDEV=$( cat_var "$DEVICES" | head -1 | \
|
||||
sed -e "s/[0-9] *-dev '\//\//" -e "s/'.*$//" )
|
||||
if test -n "$2"
|
||||
then
|
||||
x="$2"
|
||||
else
|
||||
echo >&2
|
||||
echo "WARNING: The following tests might pull in the drive tray." >&2
|
||||
echo " Best is if you now put in a suitable media and" >&2
|
||||
echo " load it manually, so nobody gets surprised. :))" >&2
|
||||
echo >&2
|
||||
echo "Which drive to examine ? (Empty input = ${OUTDEV})" >&2
|
||||
read x
|
||||
fi
|
||||
if test -n "$x"
|
||||
then
|
||||
OUTDEV="$x"
|
||||
fi
|
||||
|
||||
get_speeds "$OUTDEV"
|
||||
}
|
||||
|
||||
# main
|
||||
"$RELENG_XORRISO" -version
|
||||
echo -e "\n${SELF}: Running: $RELENG_XORRISO $devices_opt ..."
|
||||
devices=$("$RELENG_XORRISO" -report_about WARNING $devices_opt | grep "\-dev")
|
||||
RET="$?"
|
||||
if test "$SIMULATE_FAILURE" = 1
|
||||
then
|
||||
echo "===" >&2
|
||||
echo "=== SIMULATING FAILURE BY OVERRIDING EXIT VALUE OF XORRISO" >&2
|
||||
echo "===" >&2
|
||||
echo "FAIL : ${SELF} : Simulated failure caused by option -f"
|
||||
RET=1
|
||||
fi
|
||||
case ${RET} in
|
||||
0)
|
||||
get_devices "$devices" "$dev"
|
||||
RET="$?"
|
||||
if test "$RET" = 0
|
||||
then :
|
||||
else
|
||||
echo "FAIL : ${SELF} : Device scan or single drive listing failed"
|
||||
exit "$RET"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
boldify
|
||||
echo -ne "\n${SELF}: ${RELENG_XORRISO} $devices_opt returned ${RET}."
|
||||
unboldify
|
||||
echo -e "\n${SELF}: Already mounted?"
|
||||
df -kh
|
||||
esac
|
||||
|
||||
exit 0
|
256
releng/manual_isojigdo
Executable file
256
releng/manual_isojigdo
Executable file
@ -0,0 +1,256 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
# Copyright 2011 George Danchev <danchev@spnet.net>
|
||||
# Licensed under GNU GPL version 2 or later
|
||||
|
||||
set -e
|
||||
|
||||
not_in_releng_exit() {
|
||||
printf "\nPlease execute the tests from releng directory.\n\n"
|
||||
exit 1
|
||||
}
|
||||
|
||||
. inc/releng_getopts.inc || not_in_releng_exit
|
||||
|
||||
print_specific_help() {
|
||||
cat << HLP
|
||||
Specific options:
|
||||
none yet.
|
||||
Overview:
|
||||
Match the resulting ISO image representation
|
||||
against the jigdo representation.
|
||||
HLP
|
||||
}
|
||||
|
||||
if test "$SPECIFIC_HELP" = 1; then
|
||||
print_specific_help
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ ! -x $RELENG_XORRISO ]; then
|
||||
print_help
|
||||
printf "\n${SELF}: -x absolute or relative path to binary to be run.\n\n"
|
||||
exit 30
|
||||
fi
|
||||
|
||||
# check data dir, if any and after checking -x xorriso
|
||||
if [ -d "${GEN_DATA_DIR}" ]; then
|
||||
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
|
||||
printf "\n${SELF}: use '${SELF} -c' to remove.\n"
|
||||
exit 1
|
||||
else
|
||||
mkdir "${GEN_DATA_DIR}"
|
||||
fi
|
||||
|
||||
TMP_DATA_DIR=releng_generated_data
|
||||
IMG_EXTRACT_DIR=${GEN_DATA_DIR}/${SELF}_extracted_tree
|
||||
RELENG_DIR="${IMG_EXTRACT_DIR}"
|
||||
RELENG_ISOLINUX_BIN="isolinux/isolinux.bin"
|
||||
RELENG_BOOT_CAT="isolinux/boot.cat"
|
||||
RELENG_IMG=t1
|
||||
RES=""
|
||||
REMOTE_URL="http://cdimage.debian.org/cdimage/daily-builds/daily/current/i386/iso-cd"
|
||||
REMOTE_IMG="debian-testing-i386-businesscard.iso"
|
||||
|
||||
# check for required items
|
||||
if [ "${RELENG_XORRISO}" == "" -o "${RELENG_DIR}" == "" -o "${RELENG_IMG}" == "" ]; then
|
||||
echo -e "\n${SELF}: xorriso_cmd IN_dir and OUT_image are required\n"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# All must be set at this point
|
||||
printf "${SELF}: Config items:"
|
||||
printf "\n\txorriso_cmd=${RELENG_XORRISO}\n\tIN_dir=${RELENG_DIR}\n\tOUT_image=${RELENG_IMG}.iso"
|
||||
printf "\n\tIN_isolinux=${RELENG_ISOLINUX_BIN}\n\tOUT_bootcat=${RELENG_BOOT_CAT}\n"
|
||||
RES="${RELENG_IMG}.iso ${RELENG_IMG}.new ${RELENG_IMG}.md5 ${RELENG_IMG}.jigdo ${RELENG_IMG}.template"
|
||||
|
||||
# xorriso version details, incl. underlying libraries
|
||||
# "${RELENG_XORRISO}" -version
|
||||
|
||||
# check whether the binary support JTE
|
||||
set +e
|
||||
RETSTR_VER_JTE=`"${RELENG_XORRISO}" --version 2>/dev/null | grep -P "(libjte\s+in\s+use)"`
|
||||
RETCODE_VER_JTE="$?"
|
||||
set -e
|
||||
case ${RETCODE_VER_JTE} in
|
||||
0)
|
||||
printf "\n${SELF}: Found JTE support with ${RELENG_XORRISO} : ${RETSTR_VER_JTE}"
|
||||
;;
|
||||
*)
|
||||
printf "\nFAIL : ${SELF} : Not found JTE support in ${RELENG_XORRISO}. Quit."
|
||||
printf "\n${SELF}: JTE not supported with this xorriso build. Install jigit >=1.18 and rebuild."
|
||||
printf "\n${SELF}: http://www.einval.com/~steve/software/JTE/\n"
|
||||
cleanup
|
||||
exit 4
|
||||
;;
|
||||
esac
|
||||
|
||||
# grab remote ISO image, to decompose
|
||||
if [ ! -f "${TMP_DATA_DIR}"/"${REMOTE_IMG}" ]; then
|
||||
printf "\n${SELF}: Downloading ${REMOTE_URL}/${REMOTE_IMG}\n"
|
||||
wget --no-check-certificate -T20 -t3 -O \
|
||||
"${TMP_DATA_DIR}"/"${REMOTE_IMG}" "${REMOTE_URL}"/"${REMOTE_IMG}"
|
||||
WGET_RET="$?"
|
||||
case ${WGET_RET} in
|
||||
0)
|
||||
echo -e "\n${SELF}: Downloading successfully completed.\n"
|
||||
;;
|
||||
*)
|
||||
echo -e "\nFAIL : ${SELF} : wget returned code: $WGET_RET\n"
|
||||
cleanup
|
||||
exit 5
|
||||
;;
|
||||
esac
|
||||
else
|
||||
printf "\n${SELF}: Found ISO image: ${TMP_DATA_DIR}/${REMOTE_IMG}\n"
|
||||
fi
|
||||
|
||||
# check for extraction directory existence
|
||||
if [ -d "${IMG_EXTRACT_DIR}" ]; then
|
||||
printf "\n${SELF}: Found ${IMG_EXTRACT_DIR}. Please cleanup.\n"
|
||||
cleanup
|
||||
exit 6
|
||||
else
|
||||
mkdir "${IMG_EXTRACT_DIR}"
|
||||
fi
|
||||
|
||||
# extract image content
|
||||
CMD_EXTRACT="${RELENG_XORRISO} -indev ${TMP_DATA_DIR}/${REMOTE_IMG} \
|
||||
-osirrox on:auto_chmod_on \
|
||||
-extract / ${IMG_EXTRACT_DIR} \
|
||||
"
|
||||
|
||||
# TODO: drop set +e|-e block, catch exit code instead when
|
||||
# the boot catalog warnings get completely resolved.
|
||||
echo -e "${SELF}: Extracting ISO image:\n${CMD_EXTRACT}\n"
|
||||
set +e
|
||||
${CMD_EXTRACT}
|
||||
set -e
|
||||
|
||||
# grab an MBR
|
||||
ISOHYBRID_MBR="${GEN_DATA_DIR}/isohybrid.mbr"
|
||||
dd if="${TMP_DATA_DIR}/${REMOTE_IMG}" bs=1K count=32 of="${ISOHYBRID_MBR}"
|
||||
|
||||
# create FAT partition
|
||||
APPEND_PART="${GEN_DATA_DIR}/fatpart.fat"
|
||||
MKFS_MSDOS="/sbin/mkfs.msdos"
|
||||
if [ -x "${MKFS_MSDOS}" ]; then
|
||||
"${MKFS_MSDOS}" -n Bla -C "${APPEND_PART}" 8192
|
||||
else
|
||||
printf "\n${SELF}: Not found: "${MKFS_MSDOS}". Install dosfstools."
|
||||
printf "\n${SELF}: http://www.daniel-baumann.ch/software/dosfstools/\n"
|
||||
cleanup
|
||||
exit 7
|
||||
fi
|
||||
|
||||
# GENERAL section
|
||||
CMD="${RELENG_XORRISO} \
|
||||
-as mkisofs \
|
||||
-quiet \
|
||||
-o ${GEN_DATA_DIR}/${RELENG_IMG}.iso \
|
||||
-R \
|
||||
-V ISOJIGDO \
|
||||
-partition_offset 16 \
|
||||
-J -joliet-long \
|
||||
"
|
||||
|
||||
# BOOT section
|
||||
if [ -f "${IMG_EXTRACT_DIR}"/"${RELENG_ISOLINUX_BIN}" -a -f "${ISOHYBRID_MBR}" -a -f "${APPEND_PART}" ]; then
|
||||
CMD+="\
|
||||
-b ${RELENG_ISOLINUX_BIN} \
|
||||
-c ${RELENG_BOOT_CAT} \
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||
-isohybrid-mbr ${ISOHYBRID_MBR} \
|
||||
-partition_offset 16 \
|
||||
-append_partition 2 0x01 ${APPEND_PART} \
|
||||
"
|
||||
else
|
||||
printf "\n${SELF}: FAIL to compose the boot section.\n"
|
||||
cleanup
|
||||
exit 8
|
||||
fi
|
||||
|
||||
# JIGDO section
|
||||
JIGDO_JIGDO=${GEN_DATA_DIR}/${RELENG_IMG}.jigdo
|
||||
JIGDO_TEMPLATE=${GEN_DATA_DIR}/${RELENG_IMG}.template
|
||||
JIGDO_MAP_RHV=`readlink -e ${RELENG_DIR}`
|
||||
JIGDO_MAP="Debian=${JIGDO_MAP_RHV}/"
|
||||
|
||||
# create jigdo MD5 list in base64 format
|
||||
JIGDO_GEN_MD5=${GEN_DATA_DIR}/${RELENG_IMG}.md5
|
||||
if which jigdo-gen-md5-list >/dev/null 2>&1; then
|
||||
printf "${SELF}: Creating MD5 list in hex format in ${JIGDO_GEN_MD5}..."
|
||||
jigdo-gen-md5-list ${RELENG_DIR} > ${JIGDO_GEN_MD5}
|
||||
printf "Done.\n"
|
||||
else
|
||||
printf "\n${SELF}: Not found: jigdo-gen-md5-list. Install jigit >= 1.18."
|
||||
printf "\n${SELF}: http://www.einval.com/~steve/software/JTE/\n"
|
||||
cleanup
|
||||
exit 9
|
||||
fi
|
||||
|
||||
CMD+="\
|
||||
-jigdo-template-compress gzip \
|
||||
-checksum_algorithm_iso md5,sha1,sha256,sha512 \
|
||||
-checksum_algorithm_template md5,sha1,sha256,sha512 \
|
||||
-jigdo-jigdo ${JIGDO_JIGDO} \
|
||||
-jigdo-template ${JIGDO_TEMPLATE} \
|
||||
-jigdo-map ${JIGDO_MAP} \
|
||||
-md5-list ${JIGDO_GEN_MD5} \
|
||||
-jigdo-min-file-size 1024 \
|
||||
"
|
||||
|
||||
CMD+="${RELENG_DIR}"
|
||||
|
||||
# Run the whole compound command
|
||||
echo -e "${SELF}: Creating ISO and jigdo representations:\n$CMD\n"
|
||||
${CMD}
|
||||
|
||||
# Create another imange this time from jigdo files
|
||||
if which jigit-mkimage >/dev/null 2>&1; then
|
||||
printf "${SELF}: Creating new ISO from jigdo files..."
|
||||
jigit-mkimage \
|
||||
-t ${JIGDO_TEMPLATE} \
|
||||
-j ${JIGDO_JIGDO} \
|
||||
-m ${JIGDO_MAP} \
|
||||
-o ${GEN_DATA_DIR}/${RELENG_IMG}.new
|
||||
printf "Done.\n"
|
||||
else
|
||||
printf "\n${SELF}: Not found: jigit-mkimage. Install jigit."
|
||||
printf "\n${SELF}: http://www.einval.com/~steve/software/JTE/\n"
|
||||
cleanup
|
||||
exit 10
|
||||
fi
|
||||
|
||||
# trap the exit code of diff and let the Universe explode
|
||||
diff ${GEN_DATA_DIR}/${RELENG_IMG}.iso ${GEN_DATA_DIR}/${RELENG_IMG}.new
|
||||
DIFF_RET="$?"
|
||||
case ${DIFF_RET} in
|
||||
0)
|
||||
echo -e "${SELF}: Match: diff ${GEN_DATA_DIR}/${RELENG_IMG}.iso ${GEN_DATA_DIR}/${RELENG_IMG}.new"
|
||||
;;
|
||||
*)
|
||||
echo -e "FAIL : ${SELF} : diff returned code: $DIFF_RET\n"
|
||||
;;
|
||||
esac
|
||||
|
||||
# sort out the cruft
|
||||
cleanup
|
||||
|
||||
# warn about downloaded image left behind
|
||||
if [ -f "${TMP_DATA_DIR}"/"${REMOTE_IMG}" ]; then
|
||||
printf "${SELF}: Leaving "
|
||||
ls -sh "${TMP_DATA_DIR}"/"${REMOTE_IMG}"
|
||||
fi
|
||||
|
||||
# last hints
|
||||
if [ -d ${GEN_DATA_DIR} ]; then
|
||||
printf "\n${SELF}: HINT: manual checks remained to be done:\n"
|
||||
printf " * ${GEN_DATA_DIR}/${RELENG_IMG}.iso boots from USB stick and/or optical media.\n"
|
||||
printf " * appended FAT partition is mountable.\n"
|
||||
printf " * xorriso -indev ${GEN_DATA_DIR}/${RELENG_IMG}.iso -pvd_info\n"
|
||||
printf " * fdisk -lu ${GEN_DATA_DIR}/${RELENG_IMG}.iso\n"
|
||||
fi
|
||||
|
||||
exit 0
|
226
releng/run_all_auto
Executable file
226
releng/run_all_auto
Executable file
@ -0,0 +1,226 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright 2011 George Danchev <danchev@spnet.net>
|
||||
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
# Licensed under GNU GPL version 2 or later
|
||||
|
||||
set -e
|
||||
|
||||
SELF=$(basename "$0")
|
||||
GEN_DATA_DIR=releng_generated_data
|
||||
CLOG=${GEN_DATA_DIR}/log.${SELF}
|
||||
PASSED_OPTIONS="$@"
|
||||
RELENG_XORRISO=
|
||||
CLEANUP_LOG=0
|
||||
|
||||
not_in_releng_exit() {
|
||||
printf "\nPlease execute the tests from releng directory.\n\n"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# To catch the exit value of a command in a pipe
|
||||
return_value_file="$GEN_DATA_DIR"/run_all_"$$"_return_value
|
||||
return_wrapper()
|
||||
{
|
||||
cmd="$1"
|
||||
shift 1
|
||||
"$cmd" "$@"
|
||||
RET="$?"
|
||||
echo "$RET" >"$return_value_file"
|
||||
return "$RET"
|
||||
}
|
||||
|
||||
# Using only bash builtin commands.
|
||||
# On 4 year old amd64 x2 3000 MHz, xterm local,it counts 22471 lines per second
|
||||
# On 2 year old amd64 x4 2600 MHz, ssh remote, it counts 35348 lines per second
|
||||
count_lines()
|
||||
{
|
||||
# $1 if not empty: start count
|
||||
line=
|
||||
if test -n "$1"
|
||||
then
|
||||
count="$1"
|
||||
else
|
||||
count=0
|
||||
fi
|
||||
while read line
|
||||
do
|
||||
count=$(($count + 1))
|
||||
printf "\r %4d lines logged ... " "$count" >&2
|
||||
printf "%s\n" "$line"
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
# It is not a good idea to include inc/releng_getopts.inc with the
|
||||
# master script as it calls the subordinate scripts and they include
|
||||
# this file too, and we want to avoid sharing variable with subshells
|
||||
if [ ! -f inc/releng_getopts.inc ]; then
|
||||
not_in_releng_exit
|
||||
fi
|
||||
|
||||
#############################################
|
||||
next_is=
|
||||
for i in "$@"
|
||||
do
|
||||
if test "$next_is" = "ignore"
|
||||
then :
|
||||
elif test "$next_is" = "x"
|
||||
then
|
||||
RELENG_XORRISO="$i"
|
||||
next_is=
|
||||
elif test x"$i" = x"-x"
|
||||
then
|
||||
next_is="x"
|
||||
elif test x"$i" = x"-c"
|
||||
then
|
||||
CLEANUP_LOG=1
|
||||
fi
|
||||
done
|
||||
#############################################
|
||||
if test "$next_is" = x
|
||||
then
|
||||
echo
|
||||
echo "Option -x expects an argument (the path to the xorriso program)"
|
||||
exit 31
|
||||
fi
|
||||
|
||||
if [ ! "${1}" ]; then
|
||||
cat << HLP
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
${SELF} runs executables from CWD starting
|
||||
with auto_*, passing them its own options.
|
||||
stdout/stderr output stored in:
|
||||
${CLOG}
|
||||
|
||||
examples:
|
||||
# run xorriso and keep the self-generated data
|
||||
$ ./${SELF} -x path/to/xorriso [-k]
|
||||
|
||||
# clean up self-generated data from previous run
|
||||
$ ./${SELF} -c
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
HLP
|
||||
exit 31
|
||||
fi
|
||||
|
||||
########################################################
|
||||
if [ -f "${CLOG}" ]; then
|
||||
mv "${CLOG}" "${CLOG}".prev
|
||||
fi
|
||||
> ${CLOG}
|
||||
if [ -x "${RELENG_XORRISO}" ]; then
|
||||
echo -e "_OVERVIEW_______________________________________________________________" >> ${CLOG}
|
||||
date --utc >> ${CLOG}
|
||||
${RELENG_XORRISO} --version >> ${CLOG}
|
||||
echo -e "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" >> ${CLOG}
|
||||
fi
|
||||
DSTART=`date --utc`
|
||||
echo -ne "${SELF}: Started at ${DSTART}" | tee -a ${CLOG}
|
||||
E1=`date '+%s'`
|
||||
# require ^auto_, avoid running (your)self explicitly
|
||||
for s in `ls | grep ^auto_ | grep -v ${SELF} | sort -n`; do
|
||||
if [ -x ${s} -a ! -d ${s} ]; then
|
||||
echo -ne "\n\n_STARTING_TEST_________________________________________________________" >> ${CLOG}
|
||||
echo -ne "\n${SELF}: Running ./${s} ${PASSED_OPTIONS} :\n" \
|
||||
| tee -a ${CLOG}
|
||||
T1=`date '+%s'`
|
||||
set +e
|
||||
|
||||
if test -n "$PIPESTATUS"
|
||||
then
|
||||
# PIPESTATUS[0] should be available in bash
|
||||
./${s} ${PASSED_OPTIONS} 2>&1 | count_lines >> ${CLOG}
|
||||
RET="${PIPESTATUS[0]}"
|
||||
else
|
||||
# a more portable method which uses a temporary file to record exit value
|
||||
return_wrapper ./${s} ${PASSED_OPTIONS} 2>&1 | count_lines >> ${CLOG}
|
||||
RET=$(cat "$return_value_file")
|
||||
rm "$return_value_file"
|
||||
fi
|
||||
# echo "RET='$RET'" >/dev/tty
|
||||
|
||||
T2=`date '+%s'`
|
||||
let TS="${T2} - ${T1}"
|
||||
case ${RET} in
|
||||
0)
|
||||
printf "done in ${TS} sec. ok."
|
||||
;;
|
||||
*)
|
||||
printf "done in ${TS} sec. "
|
||||
which tput >/dev/null 2>&1 && tput smso
|
||||
printf "FAIL -> EXIT CODE $RET"
|
||||
which tput >/dev/null 2>&1 && tput rmso
|
||||
;;
|
||||
esac
|
||||
set -e
|
||||
fi
|
||||
done
|
||||
|
||||
DEND=`date --utc`
|
||||
echo -ne "\n${SELF}: Stopped at ${DEND}." | tee -a ${CLOG}
|
||||
if [ "${CLEANUP_LOG}" -eq 1 ]; then
|
||||
if [ -f "${CLOG}" ]; then
|
||||
rm -f "${CLOG}"
|
||||
echo -ne "\n${SELF}: Removed my own log ${CLOG}." # | tee -a ${CLOG}
|
||||
fi
|
||||
if [ -f "${CLOG}".prev ]; then
|
||||
rm -f "${CLOG}".prev
|
||||
echo -e "\n${SELF}: Removed my own log ${CLOG}.prev." # | tee -a ${CLOG}
|
||||
fi
|
||||
else
|
||||
E2=`date '+%s'`
|
||||
if [ ${E2} -eq ${E1} ]; then
|
||||
echo -e " Total elapsed 0 sec." | tee -a ${CLOG}
|
||||
else
|
||||
let ES="${E2} - ${E1}"
|
||||
echo -e " Total elapsed ${ES} sec." | tee -a ${CLOG}
|
||||
fi
|
||||
#####
|
||||
echo -e "\n_SUMMARY________________________________________________________________" >> ${CLOG}
|
||||
echo -e "${SELF}: Trivial log examination: ${CLOG}" | tee -a ${CLOG}
|
||||
echo -e "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" | tee -a ${CLOG}
|
||||
# severity classes of libdax_msgs.h in libburn and libisofs
|
||||
# List of boring keywords:
|
||||
# 'UPDATE|NOTE|DEBUG|ALL' - not considered interesting for lazy log inspection.
|
||||
# List of interesting keywords:
|
||||
# thrown by xorriso and underlying libraries
|
||||
LIST_KWD="(NEVER|ABORT|FATAL|FAILURE|MISHAP|SORRY|WARNING|HINT"
|
||||
# thrown by others
|
||||
LIST_KWD+="|FAIL|ERROR|WRONG)"
|
||||
|
||||
if [ -f "${CLOG}" ]; then
|
||||
set +e
|
||||
# lines, perl regex, leading tabs
|
||||
grep -n -P "${LIST_KWD}" "${CLOG}"
|
||||
RET_GREP="$?"
|
||||
case ${RET_GREP} in
|
||||
0) # found
|
||||
;;
|
||||
1) # not found
|
||||
echo -e "${SELF}: Log file looks clear." # | tee -a ${CLOG}
|
||||
;;
|
||||
*) #
|
||||
echo -e "${SELF}: grep returned EXIT CODE: ${RET_GREP}." # | tee -a ${CLOG}
|
||||
;;
|
||||
esac
|
||||
set -e
|
||||
fi
|
||||
echo -e "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" | tee -a ${CLOG}
|
||||
|
||||
##### TODO: work out a less noisy diff'ing technique!
|
||||
if [ -f "${CLOG}".prev -a -f "${CLOG}" ]; then
|
||||
echo -e "${SELF}: See diff against previous log file (might be long):" | tee -a ${CLOG}
|
||||
echo -e "diff -Naur ${CLOG}.prev ${CLOG} | less" | tee -a ${CLOG}
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
#
|
||||
which tput >/dev/null 2>&1 && tput smso
|
||||
echo -e "\n${SELF}: Leaving the following cruft in ${GEN_DATA_DIR}:" # | tee -a ${CLOG}
|
||||
which tput >/dev/null 2>&1 && tput rmso
|
||||
ls -lth "${GEN_DATA_DIR}" # | tee -a ${CLOG}
|
||||
|
||||
# Fin
|
||||
exit 0
|
135
releng/template_new
Executable file
135
releng/template_new
Executable file
@ -0,0 +1,135 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright 2011 George Danchev <danchev@spnet.net>
|
||||
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
# === TEMPLATE: Add your own copyright here
|
||||
#
|
||||
# Licensed under GNU GPL version 2 or later
|
||||
|
||||
# === TEMPLATE: Remove this remark before releasing this script.
|
||||
#
|
||||
# This is a template for creating a new libisoburn/releng test.
|
||||
# It is supposed that you have read releng/README before you begin to work
|
||||
# here.
|
||||
#
|
||||
# Step 1: Invent a name for your test
|
||||
# test_name="manual_"...some.name...
|
||||
# or
|
||||
# test_name="auto_"...some.name...
|
||||
#
|
||||
# Step 2: Copy releng/template_new to $test_name
|
||||
#
|
||||
# Step 3: Edit $test_name and process any line that begins by
|
||||
# "# === TEMPLATE:". Do what the line prescribes and then remove it
|
||||
# from the script. You are not done as long as such a line remains.
|
||||
#
|
||||
# === TEMPLATE: End of remark to remove
|
||||
|
||||
set -e
|
||||
|
||||
|
||||
# === TEMPLATE: Describe your own specific options (if any) and the test
|
||||
print_specific_help() {
|
||||
cat << HLP
|
||||
Specific options:
|
||||
--option Explanation of specific option
|
||||
Overview:
|
||||
Short explanation of test purpose and activities.
|
||||
HLP
|
||||
}
|
||||
|
||||
|
||||
getopts_inc=inc/releng_getopts.inc
|
||||
if test -e "$getopts_inc"
|
||||
then
|
||||
. "$getopts_inc"
|
||||
|
||||
if test "$SPECIFIC_HELP" = 1
|
||||
then
|
||||
print_specific_help
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
echo >&2
|
||||
echo "File not found: $getopts_inc" >&2
|
||||
echo "Are we in the ./releng directory of a libisoburn SVN checkout ?" >&2
|
||||
echo "(Please execute the tests from that ./releng directory.)" >&2
|
||||
echo >&2
|
||||
exit 29
|
||||
fi
|
||||
|
||||
|
||||
# === TEMPLATE: Decide whether the test will have own options,
|
||||
# === TEMPLATE: apart from those interpreted by inc/releng_getopts.inc
|
||||
# === TEMPLATE: If not, then remove this interpreter code.
|
||||
# Set default values for specific option variables. E.g.:
|
||||
# dev=
|
||||
# Interpret specific options, they begin after the first --.
|
||||
next_is=ignore
|
||||
for i in "$@"
|
||||
do
|
||||
if test "$next_is" = "ignore"
|
||||
then
|
||||
if test "$i" = "--"
|
||||
then
|
||||
next_is=""
|
||||
fi
|
||||
|
||||
# === TEMPLATE: Implement interpretation of specific options. Like:
|
||||
# elif test "$next_is" = "dev"
|
||||
# then
|
||||
# dev="$i"
|
||||
# next_is=""
|
||||
# elif test "$i" = "--dev"
|
||||
# then
|
||||
# next_is="dev"
|
||||
|
||||
else
|
||||
echo >&2
|
||||
echo "Unknown test specific option: $i" >&2
|
||||
print_help
|
||||
print_specific_help
|
||||
exit 31
|
||||
fi
|
||||
done
|
||||
# === TEMPLATE: End of own option interpreter code.
|
||||
|
||||
|
||||
# Each test should decide whether or not it needs
|
||||
# a xorriso binary to test, since some do compilations only.
|
||||
# === TEMPLATE: Decide whether you need a xorriso program.
|
||||
# === TEMPLATE: If not, then remove this function call
|
||||
check_for_xorriso -x
|
||||
|
||||
|
||||
# check data dir, if any and after checking -x xorriso
|
||||
# === TEMPLATE: Decide whether your test will possibly create own files.
|
||||
# === TEMPLATE: If yes, then make sure to remove this directory if not
|
||||
# ===
|
||||
# === TEMPLATE: If not, then remove this if ... fi statement.
|
||||
if [ -d "${GEN_DATA_DIR}" ]; then
|
||||
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
|
||||
printf "\n${SELF}: use '${SELF} -c' to remove.\n"
|
||||
exit 30
|
||||
else
|
||||
mkdir "${GEN_DATA_DIR}"
|
||||
fi
|
||||
|
||||
|
||||
#####################################################################
|
||||
|
||||
|
||||
# === TEMPLATE: Perform your test activities here.
|
||||
|
||||
|
||||
# === TEMPLATE: In case of failure, issue a line to stdout that begins by
|
||||
# === TEMPLATE: the word "FAIL", and make sure that the test script finally
|
||||
# === TEMPLATE: returns a non-zero exit value.
|
||||
# === TEMPLATE: 31 = Unknown option or unusable argument with known option
|
||||
# === TEMPLATE: 30 = Unexpected state of own directory for self generated files
|
||||
# === TEMPLATE: 29 = Not in ./releng directory or missing essential parts
|
||||
# === TEMPLATE: 1 to 28 = test specific exit values
|
||||
# === TEMPLATE: When exiting prematurely, make sure to call cleanup.
|
||||
|
||||
cleanup
|
||||
exit 0
|
@ -13,6 +13,10 @@
|
||||
cc -g -o compare_file compare_file.c
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
@ -126,11 +130,13 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag)
|
||||
differs= 1;
|
||||
}
|
||||
if(s1.st_uid != s2.st_uid) {
|
||||
printf("%s : st_uid : %d <> %d\n", a, s1.st_uid, s2.st_uid);
|
||||
printf("%s : st_uid : %lu <> %lu\n",
|
||||
a, (unsigned long) s1.st_uid, (unsigned long) s2.st_uid);
|
||||
differs= 1;
|
||||
}
|
||||
if(s1.st_gid != s2.st_gid) {
|
||||
printf("%s : st_gid : %d <> %d\n", a, s1.st_gid, s2.st_gid);
|
||||
printf("%s : st_gid : %lu <> %lu\n",
|
||||
a, (unsigned long) s1.st_gid, (unsigned long) s2.st_gid);
|
||||
differs= 1;
|
||||
}
|
||||
if((S_ISCHR(s1.st_mode) && S_ISCHR(s2.st_mode)) ||
|
||||
@ -248,6 +254,12 @@ int main(int argc, char **argv)
|
||||
int ret, i, with_ctime= 1;
|
||||
char adr1[4096], adr2[4096], adrc[4096];
|
||||
|
||||
if(sizeof(off_t) < 8) {
|
||||
fprintf(stderr,
|
||||
"%s : FATAL : Compile time misconfiguration. sizeof(off_t) too small.\n\n",
|
||||
argv[0]);
|
||||
exit(4);
|
||||
}
|
||||
if(argc<4) {
|
||||
fprintf(stderr, "usage: %s path prefix1 prefix2\n", argv[0]);
|
||||
exit(2);
|
||||
@ -257,7 +269,7 @@ int main(int argc, char **argv)
|
||||
with_ctime= 0;
|
||||
else {
|
||||
fprintf(stderr, "%s : Option not recognized: '%s'\n", argv[0], argv[i]);
|
||||
exit(1);
|
||||
exit(2);
|
||||
}
|
||||
}
|
||||
|
||||
|
15
xorriso/AUTHORS_gnu_xorriso
Normal file
15
xorriso/AUTHORS_gnu_xorriso
Normal file
@ -0,0 +1,15 @@
|
||||
Derek Foreman
|
||||
Ben Jansens
|
||||
Thomas Schmitt
|
||||
Mario Danic
|
||||
Vreixo Formoso Lopes
|
||||
Colin Plumb
|
||||
Tatu Ylonen
|
||||
Jim Kingdon
|
||||
Scott G. Miller
|
||||
Ulrich Drepper
|
||||
Richard Atterer
|
||||
Steve McIntyre
|
||||
George Danchev
|
||||
and possibly others who gave their copyright to Free Software Foundation, Inc.
|
||||
|
674
xorriso/COPYING_gnu_xorriso
Normal file
674
xorriso/COPYING_gnu_xorriso
Normal file
@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
34
xorriso/COPYRIGHT_gnu_xorriso
Normal file
34
xorriso/COPYRIGHT_gnu_xorriso
Normal file
@ -0,0 +1,34 @@
|
||||
Derek Foreman <derek@signalmarketing.com>
|
||||
Ben Jansens <xor@orodu.net>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
Mario Danic <mario.danic@gmail.com>,
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
Steve McIntyre <steve@einval.com>
|
||||
George Danchev <danchev@spnet.net>
|
||||
|
||||
GNU xorriso is a compilation of modules from libburnia-project.org :
|
||||
xorriso Copyright (C) 2007-2011 Thomas Schmitt
|
||||
libisoburn Copyright (C) 2007-2011 Vreixo Formoso, Thomas Schmitt
|
||||
libisofs Copyright (C) 2007-2011 Vreixo Formoso, Mario Danic, Thomas Schmitt
|
||||
libburn Copyright (C) 2002-2006 Derek Foreman, Ben Jansens
|
||||
2006-2011 Mario Danic, Thomas Schmitt
|
||||
Further included is :
|
||||
libjte Copyright (C) 2000-2007 Free Software Foundation, Inc.
|
||||
2004-2011 Steve McIntyre
|
||||
2010-2011 George Danchev, Thomas Schmitt
|
||||
|
||||
Originally they all are licensed directly or indirectly as GPLv2+.
|
||||
GNU xorriso is licensed by the following statement:
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 3
|
||||
or later as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
@ -1,11 +1,11 @@
|
||||
------------------------------------------------------------------------------
|
||||
libburnia-project.org scdbackup.sourceforge.net/xorriso_eng.html
|
||||
Contribution of libburnia-project.org to the GNU Operating System
|
||||
------------------------------------------------------------------------------
|
||||
xorriso. By Thomas Schmitt <scdbackup@gmx.net>
|
||||
Integrated sub project of libburnia-project.org but also published via:
|
||||
http://scdbackup.sourceforge.net/xorriso_eng.html
|
||||
http://scdbackup.sourceforge.net/xorriso-0.4.8.pl00.tar.gz
|
||||
Copyright (C) 2006-2010 Thomas Schmitt, provided under GPL version 2 or later.
|
||||
GNU xorriso. By Thomas Schmitt <scdbackup@gmx.net>
|
||||
Derived from and supported by libburnia-project.org, published via:
|
||||
http://www.gnu.org/software/xorriso/xorriso_eng.html
|
||||
http://www.gnu.org/software/xorriso/xorriso-1.1.4.tar.gz
|
||||
Provided under GPL version 3 or later. No warranty.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@ -20,8 +20,9 @@ A special property of xorriso is that it needs neither an external ISO 9660
|
||||
formatter program nor an external burn program for CD or DVD but rather
|
||||
incorporates the libraries of libburnia-project.org .
|
||||
|
||||
Currently it is fully supported on Linux with kernels >= 2.4 and on
|
||||
FreeBSD versions with ATAPI/CAM support enabled in the kernel, see atapicam(4).
|
||||
Currently it is fully supported on GNU/Linux with kernels >= 2.4,
|
||||
on FreeBSD with ATAPI/CAM support enabled in the kernel, see atapicam(4),
|
||||
and on OpenSolaris (tested with kernel 5.11).
|
||||
On other X/Open compliant systems there will only be POSIX i/o with disk
|
||||
file objects, but no direct MMC operation on CD/DVD/BD drives.
|
||||
|
||||
@ -31,8 +32,7 @@ By using this software you agree to the disclaimer at the end of this text:
|
||||
|
||||
Compilation, First Glimpse, Installation
|
||||
|
||||
The most simple way to get xorriso from source code is the xorriso standalone
|
||||
tarball.
|
||||
The most simple way to get xorriso from source code is the GNU xorriso tarball.
|
||||
|
||||
Prerequisites:
|
||||
The tarball contains everything that is needed except the following system
|
||||
@ -41,15 +41,15 @@ components:
|
||||
plus on FreeBSD: libiconv, libcam, IDE and SATA drives need atapicam
|
||||
Optional at compile time are:
|
||||
libreadline and the readline-dev headers make dialog mode more convenient.
|
||||
on Linux: libacl and libacl-devel allow getting and setting ACLs.
|
||||
zlib and zlib-devel allow zisofs compression.
|
||||
on GNU/Linux: libacl and libacl-devel allow getting and setting ACLs.
|
||||
If they were present at compile time, then the optional libraries have to
|
||||
be present at runtime, too.
|
||||
|
||||
Obtain xorriso-0.4.8.pl00.tar.gz, take it to a directory of your choice and do:
|
||||
Obtain xorriso-1.1.4.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf xorriso-0.4.8.pl00.tar.gz
|
||||
cd xorriso-0.4.8
|
||||
tar xzf xorriso-1.1.4.tar.gz
|
||||
cd xorriso-1.1.4
|
||||
|
||||
Within that directory execute:
|
||||
|
||||
@ -71,22 +71,23 @@ or you may execute as superuser:
|
||||
make install
|
||||
|
||||
For general concepts, options and usage examples see
|
||||
info xorriso
|
||||
info xorrisofs
|
||||
man 1 xorriso
|
||||
man 1 xorrisofs
|
||||
|
||||
This man page is part of the tarball as
|
||||
xorriso/xorriso.1
|
||||
You may get a first glimpse by
|
||||
info ./xorriso/xorriso.info
|
||||
info ./xorriso/xorrisofs.info
|
||||
man ./xorriso/xorriso.1
|
||||
|
||||
It gets installed with "make install" but may also be placed manually in the
|
||||
./man1 directory below one of the directories mentioned in environment
|
||||
variable $MANPATH.
|
||||
man ./xorriso/xorrisofs.1
|
||||
|
||||
The installation creates several alias links pointing to the xorriso binary:
|
||||
xorrisofs starts xorriso with -as mkisofs emulation already enabled
|
||||
xorrecord starts xorriso with -as cdrecord emulation already enabled
|
||||
osirrox starts with -osirrox image-to-disk copying already enabled
|
||||
|
||||
|
||||
If you want to avoid dependecy on libreadline although the libreadline
|
||||
development package is installed, then rather build xorriso by:
|
||||
./configure --prefix=/usr --disable-libreadline
|
||||
@ -95,11 +96,13 @@ Never omit the "make clean" command after switching libreadline enabling.
|
||||
Other deliberate dependency reduction options of ./configure are:
|
||||
--disable-libacl avoid use of ACL functions like acl_to_text()
|
||||
--disable-xattr avoid use of xattr functions like listxattr()
|
||||
--disable-zlib avoid use of zlib functions like compress2()
|
||||
--disable-zlib avoid use of zlib functions like compress2()
|
||||
this also avoids the use of libjte and option -jigdo.
|
||||
|
||||
xorriso brings own system adapters which allow burning optical media on Linux
|
||||
and FreeBSD. Alternatively it can use libcdio-0.83 or later for sending
|
||||
commands to optical drives:
|
||||
xorriso brings own system adapters which allow burning optical media on
|
||||
GNU/Linux, FreeBSD, Solaris.
|
||||
Alternatively it can use libcdio-0.83 or later for sending commands to
|
||||
optical drives:
|
||||
--enable-libcdio
|
||||
|
||||
xorriso allows to use external processes as file content filters. This is
|
||||
@ -110,14 +113,14 @@ By default the filter feature is disabled if effective user id and real
|
||||
user id differ. This ban can be lifted by
|
||||
--enable-external-filters-setuid
|
||||
|
||||
Sometimes xorriso will yield better write performance on Linux if 64 KB are
|
||||
Sometimes xorriso will yield better write performance on GNU/Linux if 64 KB are
|
||||
transmitted in each write operation rather than 32 KB. See option -dvd_obs .
|
||||
64k can be made default at configure time by:
|
||||
--enable-dvd-obs-64k
|
||||
|
||||
For xorriso -as cdrecord emulation only:
|
||||
In some situations Linux may deliver a better write performance to drives if
|
||||
the track input is read with O_DIRECT (see man 2 open). The included libburn
|
||||
In some situations GNU/Linux may deliver a better write performance to drives
|
||||
if the track input is read with O_DIRECT (see man 2 open). The included libburn
|
||||
and the cdrecord emulation of xorriso can be told to use this peculiar read
|
||||
mode by:
|
||||
--enable-track-src-odirect
|
||||
@ -131,24 +134,29 @@ A list of rw-accessible drives can be obtained by
|
||||
|
||||
xorriso -devices
|
||||
|
||||
CD devices which offer no rw-permission are invisible to normal users.
|
||||
CD devices which offer not enough permission are invisible to normal users.
|
||||
The superuser should be able to see any usable drive and then set the
|
||||
permissions as needed.
|
||||
On Linux and FreeBSD, rw-permissions are needed.
|
||||
On Solaris, the privilege "sys_devices" and r-permission are needed.
|
||||
|
||||
The output of xorriso -devices might look like
|
||||
|
||||
0 -dev '/dev/sr0' rwrw-- : 'TSSTcorp' 'CDDVDW SH-S203B'
|
||||
1 -dev '/dev/hda' rwrw-- : 'HL-DT-ST' 'DVD-ROM GDR8162B'
|
||||
|
||||
Full and insecure enabling of both for everybody would look like
|
||||
On Linux, full and insecure enabling of both for everybody would look like
|
||||
chmod a+rw /dev/sr0 /dev/hda
|
||||
This is equivalent to the traditional setup chmod a+x,u+s cdrecord.
|
||||
|
||||
On FreeBSD, device permissions are to be set in /etc/devfs.rules.
|
||||
On Solaris, pfexec privileges may be restricted to "basic,sys_devices".
|
||||
See below "System Dependend Drive Permission Examples".
|
||||
|
||||
I strongly discourage to run xorriso with setuid root or via sudo !
|
||||
It is not checked for the necessary degree of hacker safety.
|
||||
|
||||
Consider to put all authorized users into group "floppy", to chgrp the
|
||||
device file to that group and to disallow w-access to others.
|
||||
Better consider to grant the necessary permissions to group "floppy"
|
||||
and to add users to it.
|
||||
|
||||
|
||||
A possible source of problems are hald or other automounters.
|
||||
@ -158,7 +166,7 @@ your desired drive, then consider to kill it.
|
||||
If you cannot get rid of the automounter that easily, try whether it helps
|
||||
to always load the drive tray manually before starting a write run of
|
||||
xorriso. Wait until the drive light is off.
|
||||
Better try to unmount an eventually mounted media before a write run.
|
||||
Better try to unmount a mounted media before a write run.
|
||||
|
||||
|
||||
Besides true optical drives, xorriso can also address disk files as input or
|
||||
@ -229,7 +237,7 @@ any file but rather tell the MD5 of a certain range of data blocks.
|
||||
The superblock checksum tag is written after the ECMA-119 volume descriptors.
|
||||
The tree checksum tag is written after the ECMA-119 directory entries.
|
||||
The session checksum tag is written after all payload including the checksum
|
||||
array. (Then follows eventual padding.)
|
||||
array. (Then follows padding.)
|
||||
|
||||
The tags are single lines of printable text, padded by 0 bytes. They have
|
||||
the following format:
|
||||
@ -245,12 +253,12 @@ Tag_id distinguishes the following tag types
|
||||
"libisofs_checksum_tag_v1" Session end tag
|
||||
|
||||
A relocated superblock may appear at LBA 0 of an image which was produced for
|
||||
being stored in a disk file or on overwriteable media (e.g. DVD+R, BD-RE).
|
||||
xorriso records the first session at LBA 32. An eventual follow-up session
|
||||
being stored in a disk file or on overwriteable media (e.g. DVD+RW, BD-RE).
|
||||
xorriso records the first session at LBA 32. A follow-up session
|
||||
begins at the next block address which is divisible by 32 and higher than the
|
||||
address of the previous session's end tag. Normally no session starts after the
|
||||
address given by relocated superblock parameter session_start=.
|
||||
Session oriented media like CD-R[W], DVD+R, BD-R will have no relocated
|
||||
Session oriented media like CD-R[W], DVD-R, DVD+R, BD-R will have no relocated
|
||||
superblock but rather bear a table-of-content on media level.
|
||||
|
||||
A tag is valid if pos= tells its own block address and self= tells its own MD5
|
||||
@ -263,37 +271,115 @@ The newline character at the end is mandatory.
|
||||
|
||||
libisoburn
|
||||
|
||||
xorriso is based on libisofs which does ISO 9600 filesystem aspects and on
|
||||
xorriso is based on libisofs which does ISO 9660 filesystem aspects and on
|
||||
libburn which does the input and output aspects. Parts of this foundation
|
||||
are accessed via libisoburn, which is closely related to xorriso.
|
||||
|
||||
libisoburn provides two services:
|
||||
libisoburn provides several services:
|
||||
- Encapsulation of coordination between libisofs and libburn.
|
||||
- Emulation of ISO 9660 multi-session on overwriteable media
|
||||
or random access files.
|
||||
- Implementation of the xorriso API.
|
||||
|
||||
The sourcecode of all three libraries is included in the xorriso standalone
|
||||
tarball. It is compiled with xorriso and linked statically.
|
||||
But you may as well get and install releases of libburn and libisofs, in order
|
||||
to be able to install a release of libisoburn which produces libisoburn.so.1
|
||||
and a matching dynamically linked xorriso binary.
|
||||
This binary is leaner but depends on properly installed libraries of suitable
|
||||
revision.
|
||||
This binary is very lean but depends on properly installed libraries of
|
||||
suitable revision.
|
||||
|
||||
Dynamic library and compile time header requirements for libisoburn-0.4.8 :
|
||||
- libburn.so.4 , version libburn-0.7.6 or higher
|
||||
- libisofs.so.6 , version libisofs-0.6.26 or higher
|
||||
Dynamic library and compile time header requirements for libisoburn-1.1.4 :
|
||||
- libburn.so.4 , version libburn-1.1.4 or higher
|
||||
- libisofs.so.6 , version libisofs-1.1.4 or higher
|
||||
libisoburn and xorriso will not start with libraries which are older than their
|
||||
headers seen at compile time. So compile in the oldest possible installation
|
||||
setup unless you have reason to enforce a newer bug fix level.
|
||||
|
||||
Standalone xorriso has less runtime dependencies and can be moved more freely.
|
||||
GNU xorriso has less runtime dependencies and can be moved more freely.
|
||||
|
||||
|
||||
System Dependend Drive Permission Examples
|
||||
|
||||
Accessing the optical drives requires privileges which usually are granted
|
||||
only to the superuser. GNU/Linux, FreeBSD and Solaris offer quite different
|
||||
approaches for avoiding the need for unrestricted privileges.
|
||||
|
||||
First check whether some friendly system setting already allows you to
|
||||
access the drives as normal user:
|
||||
xorriso -devices
|
||||
Those drives of which you see address and type strings are already usable.
|
||||
|
||||
If there remain drives invisible which the superuser can see by the same
|
||||
command, then the following examples might help:
|
||||
|
||||
---------------------
|
||||
On all three systems:
|
||||
---------------------
|
||||
Add the authorized users of CD drives to group "floppy" in /etc/group.
|
||||
If missing: create this group.
|
||||
Changes to /etc/group often only affect new login sessions. So log out and in
|
||||
before making the first tests.
|
||||
|
||||
-------------
|
||||
On GNU/Linux:
|
||||
-------------
|
||||
Allow rw-access to the drives
|
||||
chgrp floppy /dev/sr0 /dev/sr1
|
||||
chmod g+rw /dev/sr0 /dev/sr1
|
||||
It might be necessary to perform chgrp and chmod after each reboot or to
|
||||
edit distro dependent device configuration files for permanent settings.
|
||||
|
||||
-----------
|
||||
On FreeBSD:
|
||||
-----------
|
||||
Edit /etc/devfs.rules and make sure to have these lines
|
||||
[localrules=10]
|
||||
add path 'acd*' mode 0664 group floppy
|
||||
add path 'cd*' mode 0664 group floppy
|
||||
add path 'pass*' mode 0664 group floppy
|
||||
add path 'xpt*' mode 0664 group floppy
|
||||
[localrules=5]
|
||||
add path 'pass*' mode 0664 group floppy
|
||||
add path 'cd*' mode 0664 group floppy
|
||||
add path 'xpt*' mode 0664 group floppy
|
||||
add path 'acd*' mode 0664 group floppy
|
||||
|
||||
Edit /etc/rc.conf and add the following line if missing
|
||||
devfs_system_ruleset="localrules"
|
||||
|
||||
This gets into effect by reboot or by command
|
||||
/etc/rc.d/devfs start
|
||||
|
||||
-----------
|
||||
On Solaris:
|
||||
-----------
|
||||
Run xorriso by
|
||||
pfexec xorriso ...arguments...
|
||||
|
||||
The following settings will make pfexec keep original UID and EUID and prevent
|
||||
most superuser powers. Be aware that you still can manipulate all device files
|
||||
if you have the file permissions for that.
|
||||
Full root privileges for xorriso can then be aquired only by command su.
|
||||
|
||||
Edit /etc/security/exec_attr and add this line to the other "Media Backup"
|
||||
lines:
|
||||
Media Backup:solaris:cmd:::/usr/local/bin/xorriso:privs=basic,sys_devices
|
||||
Edit /etc/user_attr and add profile "Media Backup" to the user's line:
|
||||
thomas::::profiles=Media Backup,Primary Administrator;roles=root
|
||||
See also man privileges, man exec_attr, man user_attr.
|
||||
|
||||
Then allow the group r-access to the drives
|
||||
pfexec chgrp floppy /dev/rdsk/c3t0d0s2 /dev/rdsk/c4t0d0s2
|
||||
pfexec chmod g+r /dev/rdsk/c3t0d0s2 /dev/rdsk/c4t0d0s2
|
||||
The last two commands have to be executed after each boot. I do not know
|
||||
the relevant device configuration files yet.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 or later
|
||||
it under the terms of the GNU General Public License version 3 or later
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
@ -306,16 +392,42 @@ Standalone xorriso has less runtime dependencies and can be moved more freely.
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Based on and sub project of:
|
||||
libburnia-project.org
|
||||
By Mario Danic <mario.danic@gmail.com>,
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-2010 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
||||
|
||||
libburnia-project.org is inspired by and in other components still containing
|
||||
parts of old
|
||||
GNU xorriso is feature-wise equivalent to the dynamic compilation of
|
||||
libburnia libraries and libburnia program xorriso.
|
||||
It restricts itself to a technical form where the legal commitments of the
|
||||
libburnia project and the legal intentions of FSF match completely.
|
||||
|
||||
Libburnia project is committed to provide support for this copy in the same
|
||||
way as for its own software releases. It is further committed to keep its
|
||||
own licenses open for obtaining future copies under GPLv2+.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
libburnia program xorriso is based on and sub project of:
|
||||
libburnia-project.org
|
||||
By Mario Danic <mario.danic@gmail.com>, libburn, libisofs
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>, libisofs, libisoburn
|
||||
Thomas Schmitt <scdbackup@gmx.net>, libburn, libisofs,
|
||||
libisoburn, xorriso
|
||||
Copyright (C) 2006-2011 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
||||
|
||||
libburnia-project.org is inspired by and in libburn still containing parts
|
||||
of old
|
||||
Libburn. By Derek Foreman <derek@signalmarketing.com> and
|
||||
Ben Jansens <xor@orodu.net>
|
||||
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
|
||||
GNU xorriso contains libjte out of source package jigit >= 1.17
|
||||
Copyright (C) 2000-2007 Free Software Foundation, Inc.
|
||||
2004-2011 Steve McIntyre
|
||||
2010-2011 George Danchev, Thomas Schmitt
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This text itself is
|
||||
Copyright (c) 2007 - 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
and is freely distributable.
|
||||
It shall only be modified in sync with the technical properties of xorriso.
|
||||
If you make use of the license to derive modified versions of xorriso
|
||||
then you are entitled to modify this text under that same license.
|
||||
|
1019
xorriso/aux_objects.c
Normal file
1019
xorriso/aux_objects.c
Normal file
File diff suppressed because it is too large
Load Diff
183
xorriso/aux_objects.h
Normal file
183
xorriso/aux_objects.h
Normal file
@ -0,0 +1,183 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of classes:
|
||||
|
||||
- SplitparT which represents byte intervals of data files.
|
||||
|
||||
- DirseQ which crawls along a directory's content list.
|
||||
|
||||
- ExclusionS which manages the list of excluded file paths and
|
||||
leaf patterns.
|
||||
|
||||
- Xorriso_lsT which provides a generic double-linked list.
|
||||
|
||||
- LinkiteM, PermiteM which temporarily record relations and states.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_auxobj_includeD
|
||||
#define Xorriso_pvt_auxobj_includeD yes
|
||||
|
||||
struct SplitparT;
|
||||
|
||||
int Splitparts_new(struct SplitparT **o, int count, int flag);
|
||||
|
||||
int Splitparts_destroy(struct SplitparT **o, int count, int flag);
|
||||
|
||||
int Splitparts_set(struct SplitparT *o, int idx,
|
||||
char *name, int partno, int total_parts,
|
||||
off_t offset, off_t bytes, off_t total_bytes, int flag);
|
||||
|
||||
int Splitparts_get(struct SplitparT *o, int idx, char **name, int *partno,
|
||||
int *total_parts, off_t *offset, off_t *bytes,
|
||||
off_t *total_bytes, int flag);
|
||||
|
||||
int Splitpart__parse(char *name, int *partno, int *total_parts,
|
||||
off_t *offset, off_t *bytes, off_t *total_bytes, int flag);
|
||||
|
||||
int Splitpart__is_part_path(char *path, int flag);
|
||||
|
||||
int Splitpart__compose(char *adr, int partno, int total_parts,
|
||||
off_t offset, off_t bytes, off_t total_bytes, int flag);
|
||||
|
||||
int Splitpart__read_next_num(char *base_pt, char **next_pt, off_t *num,
|
||||
int flag);
|
||||
|
||||
int Splitparts_sort(struct SplitparT *o, int count, int flag);
|
||||
|
||||
|
||||
|
||||
struct DirseQ;
|
||||
|
||||
int Dirseq_new(struct DirseQ **o, char *adr, int flag);
|
||||
|
||||
int Dirseq_destroy(struct DirseQ **o, int flag);
|
||||
|
||||
int Dirseq_next_adr(struct DirseQ *o, char reply[SfileadrL], int flag);
|
||||
|
||||
int Dirseq_rewind(struct DirseQ *o, int flag);
|
||||
|
||||
|
||||
|
||||
struct Xorriso_lsT {
|
||||
char *text;
|
||||
struct Xorriso_lsT *prev,*next;
|
||||
};
|
||||
|
||||
/** Create a new list item with arbitrary byte content.
|
||||
@param lstring The newly created object or NULL on failure
|
||||
@param data An array of bytes to be copied into the new object
|
||||
@param data_len Number of bytes to be copied
|
||||
@param link Xorriso_lsT object to which the new object shall be linked
|
||||
@param flag Bitfield for control purposes
|
||||
bit0= insert before link rather than after it
|
||||
bit1= do not copy data (e.g. because *data is invalid)
|
||||
bit2= attach data directly by pointer rather than by copying
|
||||
@return <=0 error, 1 ok
|
||||
*/
|
||||
int Xorriso_lst_new_binary(struct Xorriso_lsT **lstring, char *data,
|
||||
int data_len, struct Xorriso_lsT *link, int flag);
|
||||
|
||||
|
||||
/** Create a new list item with a 0-terminated text as content.
|
||||
@param lstring The newly created object or NULL on failure
|
||||
@param text A 0-terminated array of bytes
|
||||
@param link Xorriso_lsT object to which the new object shall be linked
|
||||
@param flag see Xorriso_lst_new_binary
|
||||
@return <=0 error, 1 ok
|
||||
*/
|
||||
int Xorriso_lst_new(struct Xorriso_lsT **lstring, char *text,
|
||||
struct Xorriso_lsT *link, int flag);
|
||||
|
||||
|
||||
/** Create a new list item at the end of a given list.
|
||||
@param entry Contains as input a pointer to a pointer to any existing
|
||||
list item. As output this list item pointer may be
|
||||
changed to the address of the new list item:
|
||||
if ((*entry == 0) || (flag & 1))
|
||||
@param data An array of bytes to be copied into the new object
|
||||
@param data_len Number of bytes to be copied
|
||||
@param flag Bitfield for control purposes
|
||||
bit0= Return new object address in *entry
|
||||
bit1= do not copy data (e.g. because *data is invalid)
|
||||
bit2= attach data directly by pointer rather than by copying
|
||||
bit2= attach data directly by pointer rather than by copying
|
||||
@return <=0 error, 1 ok
|
||||
*/
|
||||
int Xorriso_lst_append_binary(struct Xorriso_lsT **entry,
|
||||
char *data, int data_len, int flag);
|
||||
|
||||
|
||||
/** Destroy a single list item and connect its eventual list neighbors.
|
||||
@param lstring pointer to the pointer to be freed and set to NULL
|
||||
@param flag unused yet, submit 0
|
||||
@return 0= *lstring was alredy NULL, 1= ok
|
||||
*/
|
||||
int Xorriso_lst_destroy(struct Xorriso_lsT **lstring, int flag);
|
||||
|
||||
|
||||
struct Xorriso_lsT *Xorriso_lst_get_next(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
struct Xorriso_lsT *Xorriso_lst_get_prev(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
char *Xorriso_lst_get_text(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
int Xorriso_lst_detach_text(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
int Xorriso_lst_get_last(struct Xorriso_lsT *entry, struct Xorriso_lsT **last,
|
||||
int flag);
|
||||
|
||||
|
||||
int Exclusions_new(struct ExclusionS **o, int flag);
|
||||
|
||||
int Exclusions_destroy(struct ExclusionS **o, int flag);
|
||||
|
||||
int Exclusions_get_descrs(struct ExclusionS *o,
|
||||
struct Xorriso_lsT **not_paths_descr,
|
||||
struct Xorriso_lsT **not_leafs_descr, int flag);
|
||||
|
||||
/* @param flag bit0= whole subtree is banned with -not_paths
|
||||
@return 0=no match , 1=not_paths , 2=not_leafs, <0=error
|
||||
*/
|
||||
int Exclusions_match(struct ExclusionS *o, char *abs_path, int flag);
|
||||
|
||||
int Exclusions_add_not_leafs(struct ExclusionS *o, char *not_leafs_descr,
|
||||
regex_t *re, int flag);
|
||||
|
||||
int Exclusions_add_not_paths(struct ExclusionS *o, int descrc, char **descrs,
|
||||
int pathc, char **paths, int flag);
|
||||
|
||||
|
||||
|
||||
struct LinkiteM; /* Trace of hops during symbolic link resolution */
|
||||
|
||||
int Linkitem_new(struct LinkiteM **o, char *link_path, dev_t target_dev,
|
||||
ino_t target_ino, struct LinkiteM *next, int flag);
|
||||
|
||||
int Linkitem_destroy(struct LinkiteM **o, int flag);
|
||||
|
||||
int Linkitem_reset_stack(struct LinkiteM **o, struct LinkiteM *to, int flag);
|
||||
|
||||
int Linkitem_find(struct LinkiteM *stack, dev_t target_dev, ino_t target_ino,
|
||||
struct LinkiteM **result, int flag);
|
||||
|
||||
int Linkitem_get_link_count(struct LinkiteM *item, int flag);
|
||||
|
||||
|
||||
struct PermiteM; /* Stack of temporarily altered access permissions */
|
||||
|
||||
int Permstack_push(struct PermiteM **o, char *disk_path, struct stat *stbuf,
|
||||
int flag);
|
||||
|
||||
int Permstack_pop(struct PermiteM **o, struct PermiteM *stopper,
|
||||
struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_auxobj_includeD */
|
||||
|
647
xorriso/base_obj.c
Normal file
647
xorriso/base_obj.c
Normal file
@ -0,0 +1,647 @@
|
||||
|
||||
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which are needed to read data
|
||||
from ISO image.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#else
|
||||
#ifdef HAVE_INTTYPES_H
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef Xorriso_standalonE
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
#include "../libjte/libjte.h"
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
#include <libjte/libjte.h>
|
||||
#endif
|
||||
|
||||
#endif /* ! Xorriso_standalonE */
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
|
||||
#include "base_obj.h"
|
||||
#include "lib_mgt.h"
|
||||
|
||||
|
||||
|
||||
/* See Xorriso__preset_signal_behavior() */
|
||||
static int Xorriso_signal_behavioR= 1;
|
||||
|
||||
|
||||
void Xorriso__version(int *major, int *minor, int *micro)
|
||||
{
|
||||
*major= Xorriso_header_version_majoR;
|
||||
*minor= Xorriso_header_version_minoR;
|
||||
*micro= Xorriso_header_version_micrO;
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__is_compatible(int major, int minor, int micro, int flag)
|
||||
{
|
||||
int own_major, own_minor, own_micro;
|
||||
|
||||
Xorriso__version(&own_major, &own_minor, &own_micro);
|
||||
return(own_major > major ||
|
||||
(own_major == major && (own_minor > minor ||
|
||||
(own_minor == minor && own_micro >= micro))));
|
||||
}
|
||||
|
||||
|
||||
char *Xorriso__get_patch_level_text(int flag)
|
||||
{
|
||||
return(Xorriso_program_patch_leveL);
|
||||
}
|
||||
|
||||
|
||||
/** The list of startup file names */
|
||||
#define Xorriso_rc_nuM 4
|
||||
|
||||
static char Xorriso_sys_rc_nameS[Xorriso_rc_nuM][80]= {
|
||||
"/etc/default/xorriso",
|
||||
"/etc/opt/xorriso/rc",
|
||||
"/etc/xorriso/xorriso.conf",
|
||||
"placeholder for $HOME/.xorrisorc"
|
||||
};
|
||||
|
||||
|
||||
int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
|
||||
{
|
||||
int i, ret;
|
||||
struct XorrisO *m;
|
||||
char *leafname= NULL;
|
||||
|
||||
leafname= TSOB_FELD(char, SfileadrL);
|
||||
if(leafname == NULL)
|
||||
return(-1);
|
||||
*xorriso= m= TSOB_FELD(struct XorrisO,1);
|
||||
if(m==NULL) {
|
||||
free(leafname);
|
||||
return(-1);
|
||||
}
|
||||
m->libs_are_started= 0;
|
||||
strncpy(m->progname,progname,sizeof(m->progname)-1);
|
||||
m->progname[sizeof(m->progname)-1]= 0;
|
||||
if(getcwd(m->initial_wdx,sizeof(m->initial_wdx)-1)==NULL)
|
||||
m->initial_wdx[0]= 0;
|
||||
m->no_rc= 0;
|
||||
m->argument_emulation= 0;
|
||||
|
||||
m->rc_filename_count= Xorriso_rc_nuM;
|
||||
for(i=0;i<m->rc_filename_count-1;i++)
|
||||
strcpy(m->rc_filenames[i],Xorriso_sys_rc_nameS[i]);
|
||||
m->rc_filenames[m->rc_filename_count-1][0]= 0;
|
||||
m->mkisofsrc_done= 0;
|
||||
|
||||
m->wdi[0]= 0;
|
||||
strcpy(m->wdx, m->initial_wdx);
|
||||
m->did_something_useful= 0;
|
||||
m->add_plainly= 0;
|
||||
m->split_size= 0;
|
||||
strcpy(m->list_delimiter, "--");
|
||||
m->ino_behavior= 7;
|
||||
m->iso_level= 3;
|
||||
m->do_joliet= 0;
|
||||
m->do_iso1999= 0;
|
||||
m->do_aaip= 0;
|
||||
m->do_md5= 0;
|
||||
m->no_emul_toc= 0;
|
||||
m->do_old_empty= 0;
|
||||
m->scdbackup_tag_name[0]= 0;
|
||||
m->scdbackup_tag_time[0]= 0;
|
||||
m->scdbackup_tag_written[0]= 0;
|
||||
m->scdbackup_tag_listname[0]= 0;
|
||||
m->relax_compliance= 0;
|
||||
m->untranslated_name_len= 0;
|
||||
m->do_follow_pattern= 1;
|
||||
m->do_follow_param= 0;
|
||||
m->do_follow_links= 0;
|
||||
m->follow_link_limit= 100;
|
||||
m->do_follow_mount= 1;
|
||||
m->do_global_uid= 0;
|
||||
m->global_uid= 0;
|
||||
strcpy(m->volid, "ISOIMAGE");
|
||||
m->volid_default= 1;
|
||||
m->loaded_volid[0]= 0;
|
||||
m->assert_volid[0]= 0;
|
||||
m->assert_volid_sev[0]= 0;
|
||||
m->preparer_id[0]= 0;
|
||||
m->publisher[0]= 0;
|
||||
m->application_id[0]= 0;
|
||||
m->system_id[0]= 0;
|
||||
m->volset_id[0]= 0;
|
||||
m->copyright_file[0]= 0;
|
||||
m->biblio_file[0]= 0;
|
||||
m->abstract_file[0]= 0;
|
||||
m->session_logfile[0]= 0;
|
||||
m->session_lba= -1;
|
||||
m->session_blocks= 0;
|
||||
m->do_global_gid= 0;
|
||||
m->global_gid= 0;
|
||||
m->do_global_mode= 0;
|
||||
m->global_dir_mode= 0555;
|
||||
m->global_file_mode= 0444;
|
||||
m->filters= NULL;
|
||||
m->filter_list_closed= 0;
|
||||
m->zlib_level_default= m->zlib_level= 6;
|
||||
m->zisofs_block_size= m->zisofs_block_size_default= (1 << 15);
|
||||
m->zisofs_by_magic= 0;
|
||||
m->do_overwrite= 2;
|
||||
m->do_reassure= 0;
|
||||
m->drive_blacklist= NULL;
|
||||
m->drive_greylist= NULL;
|
||||
m->drive_whitelist= NULL;
|
||||
m->toc_emulation_flag= 0;
|
||||
m->image_start_mode= 0;
|
||||
m->image_start_value[0]= 0;
|
||||
m->displacement= 0;
|
||||
m->displacement_sign= 0;
|
||||
m->drives_exclusive= 1;
|
||||
m->early_stdio_test= 0;
|
||||
m->do_calm_drive= 1;
|
||||
m->indev[0]= 0;
|
||||
m->in_drive_handle= NULL;
|
||||
m->in_volset_handle= NULL;
|
||||
m->in_charset= NULL;
|
||||
m->isofs_st_out= time(0) - 1;
|
||||
m->indev_is_exclusive= 1;
|
||||
m->isofs_st_in= 0;
|
||||
m->volset_change_pending= 0;
|
||||
m->no_volset_present= 0;
|
||||
m->in_sector_map= NULL;
|
||||
m->check_media_default= NULL;
|
||||
m->check_media_bad_limit= Xorriso_read_quality_invaliD;
|
||||
m->outdev[0]= 0;
|
||||
m->out_drive_handle= NULL;
|
||||
m->out_charset= NULL;
|
||||
m->dev_fd_1= -1;
|
||||
m->outdev_is_exclusive= 1;
|
||||
m->grow_blindly_msc2= -1;
|
||||
m->ban_stdio_write= 0;
|
||||
m->do_dummy= 0;
|
||||
m->do_close= 0;
|
||||
m->speed= 0;
|
||||
m->fs= 4*512; /* 4 MiB */
|
||||
m->padding= 300*1024;
|
||||
m->do_padding_by_libisofs= 0;
|
||||
m->alignment= 0;
|
||||
m->do_stream_recording= 0;
|
||||
m->dvd_obs= 0;
|
||||
m->stdio_sync= 0;
|
||||
m->keep_boot_image= 0;
|
||||
m->boot_image_cat_path[0]= 0;
|
||||
m->boot_image_cat_hidden= 0;
|
||||
m->boot_count= 0;
|
||||
m->boot_platform_id= 0x00; /* El Torito Boot Catalog Platform ID: 0 = 80x86 */
|
||||
m->patch_isolinux_image= 0;
|
||||
m->boot_image_bin_path[0]= 0;
|
||||
m->boot_image_bin_form[0]= 0;
|
||||
m->boot_image_emul= 0;
|
||||
m->boot_image_load_size= 4 * 512; /* hearsay out of libisofs/demo/iso.c */
|
||||
memset(m->boot_id_string, 0, sizeof(m->boot_id_string));
|
||||
memset(m->boot_selection_crit, 0, sizeof(m->boot_selection_crit));
|
||||
|
||||
#ifdef Xorriso_with_isohybriD
|
||||
m->boot_image_isohybrid= 1;
|
||||
#else
|
||||
m->boot_image_isohybrid= 0;
|
||||
#endif
|
||||
|
||||
m->boot_efi_default= 0;
|
||||
m->system_area_disk_path[0]= 0;
|
||||
m->system_area_options= 0;
|
||||
m->patch_system_area= 0;
|
||||
m->partition_offset= 0;
|
||||
m->partition_secs_per_head= 0;
|
||||
m->partition_heads_per_cyl= 0;
|
||||
for(i= 0; i < Xorriso_max_appended_partitionS; i++) {
|
||||
m->appended_partitions[i]= NULL;
|
||||
m->appended_part_types[i]= 0;
|
||||
}
|
||||
m->ascii_disc_label[0]= 0;
|
||||
m->vol_creation_time= 0;
|
||||
m->vol_modification_time= 0;
|
||||
m->vol_expiration_time= 0;
|
||||
m->vol_effective_time= 0;
|
||||
m->vol_uuid[0]= 0;
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
m->libjte_handle= NULL;
|
||||
#endif
|
||||
|
||||
m->jigdo_params= NULL;
|
||||
m->jigdo_values= NULL;
|
||||
m->libjte_params_given= 0;
|
||||
m->loaded_boot_bin_lba= 0;
|
||||
m->loaded_boot_cat_path[0]= 0;
|
||||
m->allow_graft_points= 0;
|
||||
m->allow_restore= 0;
|
||||
m->do_concat_split= 1;
|
||||
m->do_auto_chmod= 0;
|
||||
m->do_restore_sort_lba= 0;
|
||||
m->dialog= 0;
|
||||
m->bsl_interpretation= 0;
|
||||
m->search_mode= 0;
|
||||
m->structured_search= 1;
|
||||
m->do_iso_rr_pattern= 1;
|
||||
m->do_disk_pattern= 2;
|
||||
m->temp_mem_limit= 16*1024*1024;
|
||||
m->file_size_limit= Xorriso_default_file_size_limiT;
|
||||
m->disk_exclusions= NULL;
|
||||
m->iso_rr_hidings= NULL;
|
||||
m->joliet_hidings= NULL;
|
||||
m->disk_excl_mode= 1;
|
||||
m->use_stdin= 0;
|
||||
m->result_page_length= 0;
|
||||
m->result_page_width= 80;
|
||||
m->mark_text[0]= 0;
|
||||
m->packet_output= 0;
|
||||
for(i=0; i<4; i++) {
|
||||
m->logfile[i][0]= 0;
|
||||
m->logfile_fp[i]= NULL;
|
||||
}
|
||||
m->pktlog_fp= NULL;
|
||||
for(i= 0; i < Xorriso_max_outlist_stacK; i++) {
|
||||
m->result_msglists[i]= NULL;
|
||||
m->info_msglists[i]= NULL;
|
||||
m->msglist_flags[i]= 0;
|
||||
}
|
||||
m->msglist_stackfill= 0;
|
||||
m->status_history_max= Xorriso_status_history_maX;
|
||||
m->scsi_log= 0;
|
||||
strcpy(m->report_about_text, "UPDATE");
|
||||
Xorriso__text_to_sev(m->report_about_text, &m->report_about_severity, 0);
|
||||
m->library_msg_direct_print= 0;
|
||||
strcpy(m->abort_on_text,"FAILURE");
|
||||
Xorriso__text_to_sev(m->abort_on_text, &m->abort_on_severity, 0);
|
||||
m->abort_on_is_default= 1;
|
||||
m->problem_status= 0;
|
||||
m->problem_status_text[0]= 0;
|
||||
m->errfile_log[0]= 0;
|
||||
m->errfile_mode= 0;
|
||||
m->errfile_fp= NULL;
|
||||
|
||||
m->img_read_error_mode= 1; /* abort faulty image reading with FAILURE */
|
||||
m->extract_error_mode= 1; /* keep extracted files after read error */
|
||||
strcpy(m->return_with_text, "SORRY");
|
||||
Xorriso__text_to_sev(m->return_with_text, &m->return_with_severity, 0);
|
||||
m->return_with_value= 32;
|
||||
m->eternal_problem_status= 0;
|
||||
m->eternal_problem_status_text[0]= 0;
|
||||
m->re= NULL;
|
||||
/* >>> ??? how to initialize m->match[0] ? */
|
||||
m->re_constants= NULL;
|
||||
m->re_count= 0;
|
||||
m->re_fill= 0;
|
||||
m->reg_expr[0]= 0;
|
||||
m->run_state= 0;
|
||||
m->is_dialog= 0;
|
||||
m->bar_is_fresh= 0;
|
||||
m->pending_option[0]= 0;
|
||||
m->request_to_abort= 0;
|
||||
m->request_not_to_ask= 0;
|
||||
m->idle_time= 0.0;
|
||||
m->re_failed_at= -1;
|
||||
m->prepended_wd= 0;
|
||||
m->insert_count= 0;
|
||||
m->insert_bytes= 0;
|
||||
m->error_count= 0;
|
||||
m->pacifier_style= 0;
|
||||
m->pacifier_interval= 1.0;
|
||||
m->pacifier_count= 0;
|
||||
m->pacifier_total= 0;
|
||||
m->pacifier_byte_count= 0;
|
||||
m->pacifier_fifo= NULL;
|
||||
m->start_time= 0.0;
|
||||
m->last_update_time= 0.0;
|
||||
m->find_compare_result= 1;
|
||||
m->find_check_md5_result= 0;
|
||||
m->last_abort_file_time= 0.0;
|
||||
|
||||
m->node_counter= 0;
|
||||
m->node_array_size= 0;
|
||||
m->node_array= NULL;
|
||||
m->node_disk_prefixes= NULL;
|
||||
m->node_img_prefixes= NULL;
|
||||
|
||||
m->hln_count= 0;
|
||||
m->hln_array= NULL;
|
||||
m->hln_targets= NULL;
|
||||
m->hln_change_pending= 0;
|
||||
m->di_do_widen= NULL;
|
||||
m->di_disk_paths= NULL;
|
||||
m->di_iso_paths= NULL;
|
||||
|
||||
m->node_targets_availmem= 0;
|
||||
|
||||
m->di_count= 0;
|
||||
m->di_array= NULL;
|
||||
|
||||
m->perm_stack= NULL;
|
||||
|
||||
m->update_flags= 0;
|
||||
|
||||
m->result_line[0]= 0;
|
||||
m->result_line_counter= 0;
|
||||
m->result_page_counter= 0;
|
||||
m->result_open_line_len= 0;
|
||||
|
||||
m->info_text[0]= 0;
|
||||
|
||||
ret= Sfile_leafname(progname, leafname, 0);
|
||||
if(ret<=0)
|
||||
goto failure;
|
||||
if(strcmp(leafname, "osirrox")==0) {
|
||||
m->allow_restore= 1;
|
||||
m->drives_exclusive= 0;
|
||||
} else if(strcmp(leafname, "xorrisofs")==0 || strcmp(leafname, "genisofs")==0 ||
|
||||
strcmp(leafname, "mkisofs")==0 || strcmp(leafname, "genisoimage")==0) {
|
||||
m->argument_emulation= 1;
|
||||
m->pacifier_style= 1;
|
||||
Xorriso_protect_stdout(*xorriso, 0);
|
||||
} else if(strcmp(leafname, "xorrecord")==0 || strcmp(leafname, "wodim")==0 ||
|
||||
strcmp(leafname, "cdrecord")==0 || strcmp(leafname, "cdrskin")==0) {
|
||||
m->argument_emulation= 2;
|
||||
m->pacifier_style= 2;
|
||||
}
|
||||
ret= Exclusions_new(&(m->disk_exclusions), 0);
|
||||
if(ret<=0)
|
||||
goto failure;
|
||||
ret= Exclusions_new(&(m->iso_rr_hidings), 0);
|
||||
if(ret<=0)
|
||||
goto failure;
|
||||
ret= Exclusions_new(&(m->joliet_hidings), 0);
|
||||
if(ret<=0)
|
||||
goto failure;
|
||||
Xorriso_relax_compliance(m, "default", 0);
|
||||
ret= Xorriso_lst_new(&(m->drive_greylist), "/dev", m->drive_greylist, 1);
|
||||
if(ret <= 0)
|
||||
goto failure;
|
||||
Xorriso_preparer_string(m, m->preparer_id, 1); /* avoids library calls */
|
||||
|
||||
if(leafname != NULL)
|
||||
free(leafname);
|
||||
return(1);
|
||||
failure:;
|
||||
Xorriso_destroy(xorriso, 0);
|
||||
if(leafname != NULL)
|
||||
free(leafname);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_re(struct XorrisO *m, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(m->re!=NULL) {
|
||||
for(i=0;i<m->re_fill;i++) {
|
||||
if(m->re_constants!=NULL)
|
||||
if(m->re_constants[i]!=NULL)
|
||||
continue; /* ,->re[i] was never subject to regcomp() */
|
||||
regfree(&(m->re[i]));
|
||||
}
|
||||
free((char *) m->re);
|
||||
m->re= NULL;
|
||||
}
|
||||
|
||||
if(m->re_constants!=NULL) {
|
||||
for(i=0;i<m->re_fill;i++)
|
||||
if(m->re_constants[i]!=NULL)
|
||||
free(m->re_constants[i]);
|
||||
free((char *) m->re_constants);
|
||||
m->re_constants= NULL;
|
||||
}
|
||||
m->re_count= 0;
|
||||
m->re_fill= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= global shutdown of libraries */
|
||||
int Xorriso_destroy(struct XorrisO **xorriso, int flag)
|
||||
{
|
||||
struct XorrisO *m;
|
||||
int i;
|
||||
|
||||
m= *xorriso;
|
||||
if(m==NULL)
|
||||
return(0);
|
||||
|
||||
/* Give up drives and image to unref all connected xorriso objects */
|
||||
Xorriso_give_up_drive(m, 3);
|
||||
|
||||
if(m->in_charset!=NULL)
|
||||
free(m->in_charset);
|
||||
if(m->out_charset!=NULL)
|
||||
free(m->out_charset);
|
||||
Xorriso_destroy_re(m,0);
|
||||
Exclusions_destroy(&(m->disk_exclusions), 0);
|
||||
Exclusions_destroy(&(m->iso_rr_hidings), 0);
|
||||
Exclusions_destroy(&(m->joliet_hidings), 0);
|
||||
Xorriso_destroy_all_extf(m, 0);
|
||||
Xorriso_lst_destroy_all(&(m->drive_blacklist), 0);
|
||||
Xorriso_lst_destroy_all(&(m->drive_greylist), 0);
|
||||
Xorriso_lst_destroy_all(&(m->drive_whitelist), 0);
|
||||
Xorriso_destroy_node_array(m, 0);
|
||||
Xorriso_destroy_hln_array(m, 0);
|
||||
Xorriso_destroy_di_array(m, 0);
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
if(m->libjte_handle)
|
||||
libjte_destroy(&(m->libjte_handle));
|
||||
#endif
|
||||
|
||||
Xorriso_lst_destroy_all(&(m->jigdo_params), 0);
|
||||
Xorriso_lst_destroy_all(&(m->jigdo_values), 0);
|
||||
for(i= 0; i < Xorriso_max_appended_partitionS; i++)
|
||||
if(m->appended_partitions[i] != NULL)
|
||||
free(m->appended_partitions[i]);
|
||||
|
||||
Xorriso_detach_libraries(m, flag&1);
|
||||
|
||||
free((char *) m);
|
||||
*xorriso= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_node_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(xorriso->node_array != NULL) {
|
||||
for(i= 0; i < xorriso->node_counter; i++)
|
||||
iso_node_unref((IsoNode *) xorriso->node_array[i]);
|
||||
free(xorriso->node_array);
|
||||
}
|
||||
xorriso->node_array= NULL;
|
||||
xorriso->node_counter= xorriso->node_array_size= 0;
|
||||
Xorriso_lst_destroy_all(&(xorriso->node_disk_prefixes), 0);
|
||||
Xorriso_lst_destroy_all(&(xorriso->node_img_prefixes), 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not destroy hln_array but only hln_targets
|
||||
*/
|
||||
int Xorriso_destroy_hln_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
if(xorriso->hln_array != NULL && !(flag & 1)) {
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
iso_node_unref((IsoNode *) xorriso->hln_array[i]);
|
||||
free(xorriso->hln_array);
|
||||
xorriso->hln_array= NULL;
|
||||
xorriso->hln_count= 0;
|
||||
}
|
||||
if(xorriso->hln_targets != NULL) {
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
if(xorriso->hln_targets[i] != NULL)
|
||||
free(xorriso->hln_targets[i]);
|
||||
free(xorriso->hln_targets);
|
||||
xorriso->hln_targets= NULL;
|
||||
}
|
||||
xorriso->node_targets_availmem= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_di_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(xorriso->di_array != NULL) {
|
||||
for(i= 0; i < xorriso->di_count; i++)
|
||||
if(xorriso->di_array[i] != NULL)
|
||||
iso_node_unref((IsoNode *) xorriso->di_array[i]);
|
||||
free(xorriso->di_array);
|
||||
xorriso->di_array= NULL;
|
||||
}
|
||||
if(xorriso->di_do_widen != NULL) {
|
||||
free(xorriso->di_do_widen);
|
||||
xorriso->di_do_widen= NULL;
|
||||
}
|
||||
Xorriso_lst_destroy_all(&(xorriso->di_disk_paths), 0);
|
||||
Xorriso_lst_destroy_all(&(xorriso->di_iso_paths), 0);
|
||||
xorriso->di_count= 0;
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
fprintf(stderr, "xorriso_DEBUG: get_di_count= %lu\n",
|
||||
Xorriso_get_di_counteR);
|
||||
#endif /* NIX */
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_new_node_array(struct XorrisO *xorriso, off_t mem_limit,
|
||||
int addon_nodes, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(xorriso->node_counter <= 0)
|
||||
return(1);
|
||||
|
||||
xorriso->node_array= calloc(xorriso->node_counter + addon_nodes,
|
||||
sizeof(IsoNode *));
|
||||
if(xorriso->node_array == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
for(i= 0; i < xorriso->node_counter + addon_nodes; i++)
|
||||
xorriso->node_array[i]= NULL;
|
||||
xorriso->node_array_size= xorriso->node_counter + addon_nodes;
|
||||
xorriso->node_counter= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not allocate hln_array but only hln_targets
|
||||
*/
|
||||
int Xorriso_new_hln_array(struct XorrisO *xorriso, off_t mem_limit, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
Xorriso_destroy_hln_array(xorriso, flag & 1);
|
||||
if(xorriso->hln_count <= 0)
|
||||
return(1);
|
||||
|
||||
if(!(flag & 1)) {
|
||||
xorriso->hln_array= calloc(xorriso->hln_count, sizeof(char *));
|
||||
if(xorriso->hln_array == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
xorriso->hln_array[i]= NULL;
|
||||
}
|
||||
|
||||
xorriso->hln_targets= calloc(xorriso->hln_count, sizeof(char *));
|
||||
if(xorriso->hln_targets == NULL) {
|
||||
if(!(flag & 1)) {
|
||||
free(xorriso->hln_array);
|
||||
xorriso->hln_array= NULL;
|
||||
}
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
xorriso->hln_targets[i]= NULL;
|
||||
xorriso->node_targets_availmem= mem_limit
|
||||
- xorriso->hln_count * sizeof(void *)
|
||||
- xorriso->hln_count * sizeof(char *);
|
||||
if(xorriso->node_targets_availmem < 0)
|
||||
xorriso->node_targets_availmem= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__preset_signal_behavior(int behavior, int flag)
|
||||
{
|
||||
if(behavior < 0 || behavior > 3)
|
||||
return(0);
|
||||
Xorriso_signal_behavioR= behavior;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__get_signal_behavior(int flag)
|
||||
{
|
||||
return(Xorriso_signal_behavioR);
|
||||
}
|
||||
|
31
xorriso/base_obj.h
Normal file
31
xorriso/base_obj.h
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which perform the
|
||||
fundamental operations of the XorrisO object.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_base_obj_includeD
|
||||
#define Xorriso_pvt_base_obj_includeD yes
|
||||
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
unsigned long Xorriso_get_di_counteR= 0;
|
||||
#endif /* NIX */
|
||||
|
||||
struct XorrisO;
|
||||
|
||||
|
||||
int Xorriso_destroy_re(struct XorrisO *m, int flag);
|
||||
|
||||
int Xorriso__get_signal_behavior(int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_base_obj_includeD */
|
||||
|
File diff suppressed because it is too large
Load Diff
1115
xorriso/check_media.c
Normal file
1115
xorriso/check_media.c
Normal file
File diff suppressed because it is too large
Load Diff
181
xorriso/check_media.h
Normal file
181
xorriso/check_media.h
Normal file
@ -0,0 +1,181 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of classes SpotlistiteM, SpotlisT,
|
||||
SectorbitmaP, CheckmediajoB which represent media checks and their outcome.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_check_includeD
|
||||
#define Xorriso_pvt_check_includeD yes
|
||||
|
||||
struct SpotlisT; /* List of intervals with different read qualities */
|
||||
struct CheckmediajoB; /* Parameters for Xorriso_check_media() */
|
||||
|
||||
int Xorriso_check_media_setup_job(struct XorrisO *xorriso,
|
||||
struct CheckmediajoB *job,
|
||||
char **argv, int old_idx, int end_idx, int flag);
|
||||
|
||||
int Xorriso_sectormap_to_spotlist(struct XorrisO *xorriso,
|
||||
struct CheckmediajoB *job,
|
||||
struct SpotlisT **spotlist,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= mark untested areas as valid
|
||||
*/
|
||||
int Xorriso_spotlist_to_sectormap(struct XorrisO *xorriso,
|
||||
struct SpotlisT *spotlist,
|
||||
int read_chunk,
|
||||
struct SectorbitmaP **map,
|
||||
int flag);
|
||||
|
||||
/* Opens the -check_media data copy in for reading and writing
|
||||
*/
|
||||
int Xorriso_open_job_data_to(struct XorrisO *xorriso,
|
||||
struct CheckmediajoB *job, int flag);
|
||||
|
||||
/* @param report Buffer of at least 10*SfileadrL
|
||||
@param flag bit0= only report non-default settings
|
||||
@return <=0 error , 1 ok , 2 with bit0: every option is on default setting
|
||||
*/
|
||||
int Xorriso_check_media_list_job(struct XorrisO *xorriso,
|
||||
struct CheckmediajoB *job,
|
||||
char *report, int flag);
|
||||
|
||||
int Xorriso_update_in_sector_map(struct XorrisO *xorriso,
|
||||
struct SpotlisT *spotlist, int read_chunk,
|
||||
struct CheckmediajoB *job, int flag);
|
||||
|
||||
|
||||
/* Distiniction between valid and invalid sectors */
|
||||
struct SectorbitmaP {
|
||||
int sectors;
|
||||
int sector_size;
|
||||
unsigned char *map;
|
||||
int map_size;
|
||||
};
|
||||
|
||||
int Spotlist_new(struct SpotlisT **o, int flag);
|
||||
|
||||
int Spotlist_destroy(struct SpotlisT **o, int flag);
|
||||
|
||||
int Spotlist_add_item(struct SpotlisT *o, int start_lba, int blocks,
|
||||
int quality, int flag);
|
||||
|
||||
int Spotlist_count(struct SpotlisT *o, int flag);
|
||||
|
||||
int Spotlist_block_count(struct SpotlisT *o, int flag);
|
||||
|
||||
int Spotlist_sector_size(struct SpotlisT *o, int read_chunk, int flag);
|
||||
|
||||
int Spotlist_get_item(struct SpotlisT *o, int idx,
|
||||
int *start_lba, int *blocks, int *quality, int flag);
|
||||
|
||||
char *Spotlist__quality_name(int quality, char name[80], int bad_limit,
|
||||
int flag);
|
||||
|
||||
|
||||
#define Xorriso_read_quality_gooD 0x7fffffff
|
||||
#define Xorriso_read_quality_md5_matcH 0x70000000
|
||||
#define Xorriso_read_quality_sloW 0x60000000
|
||||
#define Xorriso_read_quality_partiaL 0x50000000
|
||||
#define Xorriso_read_quality_valiD 0x40000000
|
||||
#define Xorriso_read_quality_untesteD 0x3fffffff
|
||||
#define Xorriso_read_quality_invaliD 0x3ffffffe
|
||||
#define Xorriso_read_quality_tao_enD 0x28000000
|
||||
#define Xorriso_read_quality_off_tracK 0x20000000
|
||||
#define Xorriso_read_quality_md5_mismatcH 0x10000000
|
||||
#define Xorriso_read_quality_unreadablE 0x00000000
|
||||
|
||||
|
||||
struct CheckmediajoB {
|
||||
int use_dev; /* 0= use indev , 1= use outdev , 2= use sector map*/
|
||||
|
||||
int min_lba; /* if >=0 : begin checking at this address */
|
||||
int max_lba; /* if >=0 : read up to this address, else use mode */
|
||||
|
||||
int min_block_size; /* granularity desired by user
|
||||
*/
|
||||
int mode; /* 0= track by track
|
||||
1= single sweep over libisoburn media capacity
|
||||
2= single sweep over libburn media capacity
|
||||
*/
|
||||
time_t start_time;
|
||||
int time_limit; /* Number of seconds after which to abort */
|
||||
|
||||
int item_limit; /* Maximum number of media check list items as result */
|
||||
|
||||
char abort_file_path[SfileadrL];
|
||||
|
||||
char data_to_path[SfileadrL];
|
||||
int data_to_fd;
|
||||
off_t data_to_offset; /* usually 0 with image copy, negative with file copy */
|
||||
off_t data_to_limit; /* used with file copy */
|
||||
int patch_lba0;
|
||||
int patch_lba0_msc1;
|
||||
|
||||
char sector_map_path[SfileadrL];
|
||||
struct SectorbitmaP *sector_map;
|
||||
int map_with_volid; /* 0=add quick toc to map file,
|
||||
1=read ISO heads for toc
|
||||
*/
|
||||
|
||||
int retry; /* -1= only try full read_chunk, 1=retry with 2k blocks
|
||||
0= retry with CD, full chunk else
|
||||
*/
|
||||
|
||||
int report_mode; /* 0= print MCL items
|
||||
1= print damaged files
|
||||
*/
|
||||
|
||||
char event_severity[20]; /* If not "ALL": trigger event of given severity
|
||||
at the end of a check job if bad blocks were
|
||||
discovered.
|
||||
*/
|
||||
|
||||
double slow_threshold_seq; /* Time limit in seconds for the decision whether
|
||||
a read operation is considered slow. This does
|
||||
not apply to thr first read of an interval.
|
||||
*/
|
||||
|
||||
int untested_valid; /* 1= mark untested data blocks as valid when calling
|
||||
Xorriso_spotlist_to_sectormap()
|
||||
*/
|
||||
};
|
||||
|
||||
int Checkmediajob_new(struct CheckmediajoB **o, int flag);
|
||||
|
||||
int Checkmediajob_destroy(struct CheckmediajoB **o, int flag);
|
||||
|
||||
int Checkmediajob_copy(struct CheckmediajoB *from, struct CheckmediajoB *to,
|
||||
int flag);
|
||||
|
||||
int Sectorbitmap_new(struct SectorbitmaP **o, int sectors, int sector_size,
|
||||
int flag);
|
||||
int Sectorbitmap_destroy(struct SectorbitmaP **o, int flag);
|
||||
int Sectorbitmap_from_file(struct SectorbitmaP **o, char *path, char *msg,
|
||||
int *os_errno, int flag);
|
||||
int Sectorbitmap_to_file(struct SectorbitmaP *o, char *path, char *info,
|
||||
char *msg, int *os_errno, int flag);
|
||||
int Sectorbitmap_set(struct SectorbitmaP *o, int sector, int flag);
|
||||
int Sectorbitmap_set_range(struct SectorbitmaP *o,
|
||||
int start_sector, int sectors, int flag);
|
||||
int Sectorbitmap_is_set(struct SectorbitmaP *o, int sector, int flag);
|
||||
int Sectorbitmap_bytes_are_set(struct SectorbitmaP *o,
|
||||
off_t start_byte, off_t end_byte, int flag);
|
||||
|
||||
int Sectorbitmap_get_layout(struct SectorbitmaP *o,
|
||||
int *sectors, int *sector_size, int flag);
|
||||
|
||||
int Sectorbitmap_copy(struct SectorbitmaP *from, struct SectorbitmaP *to,
|
||||
int flag);
|
||||
|
||||
int Sectorbitmap_clone(struct SectorbitmaP *from, struct SectorbitmaP **clone,
|
||||
int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_check_includeD */
|
||||
|
1013
xorriso/cmp_update.c
Normal file
1013
xorriso/cmp_update.c
Normal file
File diff suppressed because it is too large
Load Diff
45
xorriso/cmp_update.h
Normal file
45
xorriso/cmp_update.h
Normal file
@ -0,0 +1,45 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of class DirseQ which
|
||||
crawls along a directory's content list.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_cmp_includeD
|
||||
#define Xorriso_pvt_cmp_includeD yes
|
||||
|
||||
int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
||||
char *iso_adr, char *adr_common_tail,
|
||||
int *result, int flag);
|
||||
|
||||
int Xorriso_pfx_disk_path(struct XorrisO *xorriso, char *iso_path,
|
||||
char *iso_prefix, char *disk_prefix,
|
||||
char disk_path[SfileadrL], int flag);
|
||||
|
||||
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param node Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param flag bit0= update rather than compare
|
||||
*/
|
||||
int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter, void *node,
|
||||
char *iso_path, char *iso_prefix, char *disk_prefix,
|
||||
int flag);
|
||||
|
||||
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param @node Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
*/
|
||||
int Xorriso_update_interpreter(struct XorrisO *xorriso,
|
||||
void *boss_iter, void *node,
|
||||
int compare_result, char *disk_path,
|
||||
char *iso_rr_path, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_cmp_includeD */
|
||||
|
@ -117,9 +117,38 @@ cc -I. -DXorriso_with_maiN $def_libreadline \
|
||||
\
|
||||
-o "$xorr"/xorriso \
|
||||
\
|
||||
"$xorr"/xorriso.c \
|
||||
"$xorr"/xorriso_main.c \
|
||||
"$xorr"/sfile.c \
|
||||
"$xorr"/aux_objects.c \
|
||||
"$xorr"/findjob.c \
|
||||
"$xorr"/check_media.c \
|
||||
"$xorr"/misc_funct.c \
|
||||
"$xorr"/text_io.c \
|
||||
"$xorr"/match.c \
|
||||
"$xorr"/emulators.c \
|
||||
"$xorr"/disk_ops.c \
|
||||
"$xorr"/cmp_update.c \
|
||||
"$xorr"/parse_exec.c \
|
||||
"$xorr"/opts_a_c.c \
|
||||
"$xorr"/opts_d_h.c \
|
||||
"$xorr"/opts_i_o.c \
|
||||
"$xorr"/opts_p_z.c \
|
||||
\
|
||||
"$xorr"/xorrisoburn.c \
|
||||
"$xorr"/base_obj.c \
|
||||
"$xorr"/lib_mgt.c \
|
||||
"$xorr"/sort_cmp.c \
|
||||
"$xorr"/drive_mgt.c \
|
||||
"$xorr"/iso_img.c \
|
||||
"$xorr"/iso_tree.c \
|
||||
"$xorr"/iso_manip.c \
|
||||
"$xorr"/write_run.c \
|
||||
"$xorr"/read_run.c \
|
||||
"$xorr"/filters.c \
|
||||
\
|
||||
"$isoburn"/isoburn.c \
|
||||
"$isoburn"/burn_wrap.c \
|
||||
"$isoburn"/data_source.c \
|
||||
"$isoburn"/isofs_wrap.c \
|
||||
\
|
||||
"$burn"/async.o \
|
||||
"$burn"/debug.o \
|
||||
@ -148,11 +177,6 @@ cc -I. -DXorriso_with_maiN $def_libreadline \
|
||||
"$burn"/crc.o \
|
||||
"$burn"/ecma130ab.o \
|
||||
\
|
||||
"$isoburn"/isoburn.o \
|
||||
"$isoburn"/burn_wrap.o \
|
||||
"$isoburn"/data_source.o \
|
||||
"$isoburn"/isofs_wrap.o \
|
||||
\
|
||||
$libisofs \
|
||||
\
|
||||
$link_libreadline \
|
||||
|
@ -1,22 +1,36 @@
|
||||
AC_INIT([xorriso], [0.4.8], [http://libburnia-project.org])
|
||||
|
||||
# configure.ac stems from xorriso/configure_ac.txt and leads to ./configure
|
||||
# Copyright (c) 2007 - 2011 Thomas Schmitt <scdbackup@gmx.net>
|
||||
# Provided under GPL version 2 or later.
|
||||
|
||||
AC_INIT([xorriso], [1.1.4], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
dnl AC_CONFIG_HEADER([config.h])
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
AC_CANONICAL_TARGET
|
||||
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
LIBBURNIA_SET_FLAGS
|
||||
|
||||
BURN_MAJOR_VERSION=0
|
||||
BURN_MINOR_VERSION=7
|
||||
BURN_MICRO_VERSION=7
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
AC_CONFIG_MACRO_DIR([./])
|
||||
|
||||
dnl Let autoheader produce config.h.in and let configure produce config.h
|
||||
dnl This saves about 500 characters of compile message per source file.
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
AH_TEMPLATE([Xorriso_standalonE], [Define to prepare sources for statically linked xorriso])
|
||||
AC_DEFINE([Xorriso_standalonE], [])
|
||||
|
||||
BURN_MAJOR_VERSION=1
|
||||
BURN_MINOR_VERSION=1
|
||||
BURN_MICRO_VERSION=4
|
||||
AC_SUBST(BURN_MAJOR_VERSION)
|
||||
AC_SUBST(BURN_MINOR_VERSION)
|
||||
AC_SUBST(BURN_MICRO_VERSION)
|
||||
|
||||
LIBISOFS_MAJOR_VERSION=0
|
||||
LIBISOFS_MINOR_VERSION=6
|
||||
LIBISOFS_MICRO_VERSION=27
|
||||
LIBISOFS_MAJOR_VERSION=1
|
||||
LIBISOFS_MINOR_VERSION=1
|
||||
LIBISOFS_MICRO_VERSION=4
|
||||
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
||||
AC_SUBST(LIBISOFS_MINOR_VERSION)
|
||||
AC_SUBST(LIBISOFS_MICRO_VERSION)
|
||||
@ -43,12 +57,26 @@ if test ! $ac_cv_func_fseeko; then
|
||||
AC_ERROR([Libburn requires largefile support.])
|
||||
fi
|
||||
|
||||
AH_TEMPLATE([ICONV_CONST], [Whether to apply const qualifier to iconv inbuf])
|
||||
if test x$XORRISO_OLD_ICONV_CONFIGURE = x
|
||||
then
|
||||
|
||||
dnl ts B00410 : To detect the need for -liconv and const argument of iconv()
|
||||
LIBBURNIA_CHECK_ICONV
|
||||
dnl ts B00411 : To abort configuration if iconv() still cannot be compiled
|
||||
LIBBURNIA_ASSERT_ICONV
|
||||
|
||||
else
|
||||
|
||||
dnl Outdated: produces double -liconv and warnings about parameter mismatch
|
||||
dnl If iconv(3) is in an extra libiconv, then it gets added to variable LIBS.
|
||||
dnl If not, then no -liconv will be added.
|
||||
AC_CHECK_LIB(iconv, iconv, , )
|
||||
dnl GNU iconv has no function iconv() but libiconv() and a macro iconv()
|
||||
AC_CHECK_LIB(iconv, libiconv, , )
|
||||
|
||||
|
||||
fi
|
||||
|
||||
AC_PROG_LIBTOOL
|
||||
AC_SUBST(LIBTOOL_DEPS)
|
||||
LIBTOOL="$LIBTOOL --silent"
|
||||
@ -83,14 +111,16 @@ AC_SUBST(ARCH)
|
||||
AC_SUBST(LIBBURNIA_PKGCONFDIR)
|
||||
AC_SUBST(LIBBURN_ARCH_LIBS)
|
||||
|
||||
|
||||
dnl ts A90303
|
||||
dnl Check the preconditions for using statvfs() in sg-dummy
|
||||
dnl (sg-linux and sg-freebsd use statvfs() unconditionally)
|
||||
AH_TEMPLATE([Libburn_os_has_statvfS], [Define to use statvfs() with libburn stdio])
|
||||
STATVFS_DEF=-DLibburn_os_has_statvfS
|
||||
AC_CHECK_HEADER(sys/statvfs.h, X=, STATVFS_DEF=)
|
||||
AC_CHECK_FUNC([statvfs], X=, STATVFS_DEF=)
|
||||
CFLAGS="$CFLAGS $STATVFS_DEF"
|
||||
if test x$STATVFS_DEF = x-DLibburn_os_has_statvfS
|
||||
then
|
||||
AC_DEFINE([Libburn_os_has_statvfS], [])
|
||||
fi
|
||||
|
||||
|
||||
dnl Add compiler-specific flags
|
||||
@ -101,15 +131,15 @@ AC_ARG_ENABLE(debug,
|
||||
, enable_debug=yes)
|
||||
if test x$enable_debug != xyes; then
|
||||
if test x$GCC = xyes; then
|
||||
CFLAGS="$CFLAGS -O3"
|
||||
CFLAGS="$CFLAGS -fexpensive-optimizations"
|
||||
CFLAGS="-O3 $CFLAGS"
|
||||
CFLAGS="-fexpensive-optimizations $CFLAGS"
|
||||
fi
|
||||
CFLAGS="$CFLAGS -DNDEBUG"
|
||||
CFLAGS="-DNDEBUG $CFLAGS"
|
||||
else
|
||||
if test x$GCC = xyes; then
|
||||
CFLAGS="$CFLAGS -g -pedantic -Wall"
|
||||
CFLAGS="-g -pedantic -Wall -Wextra -Wno-unused-parameter $CFLAGS"
|
||||
fi
|
||||
CFLAGS="$CFLAGS -DDEBUG"
|
||||
CFLAGS="-DDEBUG $CFLAGS"
|
||||
fi
|
||||
|
||||
|
||||
@ -119,6 +149,7 @@ dnl
|
||||
LIBBURNIA_SET_PKGCONFIG
|
||||
|
||||
|
||||
AH_TEMPLATE([Xorriso_with_readlinE], [Define to use libreadline])
|
||||
AC_ARG_ENABLE(libreadline,
|
||||
[ --enable-libreadline Enable use of libreadline by xorriso, default=yes],
|
||||
, enable_libreadline=yes)
|
||||
@ -126,16 +157,29 @@ if test x$enable_libreadline = xyes; then
|
||||
dnl Check whether there is readline-devel and readline-runtime.
|
||||
dnl If not, erase this macro which would enable use of readline(),add_history()
|
||||
READLINE_DEF="-DXorriso_with_readlinE"
|
||||
|
||||
if test x$XORRISO_OLD_READLINE_CONFIGURE = x
|
||||
then
|
||||
|
||||
dnl ts B00411 : To disable readline if not all needed functions are present
|
||||
LIBBURNIA_ASSERT_READLINE
|
||||
|
||||
else
|
||||
dnl The empty yes case obviously causes -lreadline to be linked
|
||||
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
|
||||
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
|
||||
dnl The X= in the yes case prevents that -lreadline gets linked twice
|
||||
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
|
||||
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
|
||||
|
||||
fi
|
||||
else
|
||||
READLINE_DEF=
|
||||
fi
|
||||
AC_SUBST(READLINE_DEF)
|
||||
|
||||
if test x$READLINE_DEF = x-DXorriso_with_readlinE
|
||||
then
|
||||
AC_DEFINE([Xorriso_with_readlinE], [])
|
||||
fi
|
||||
|
||||
AH_TEMPLATE([Libisofs_with_aaip_acL], [Define to use ACL capabilities])
|
||||
AC_ARG_ENABLE(libacl,
|
||||
[ --enable-libacl Enable use of libacl by libisofs, default=yes],
|
||||
, enable_libacl=yes)
|
||||
@ -148,23 +192,32 @@ dnl The empty yes case obviously causes -lacl to be linked
|
||||
else
|
||||
LIBACL_DEF=
|
||||
fi
|
||||
AC_SUBST(LIBACL_DEF)
|
||||
if test x$LIBACL_DEF = x-DLibisofs_with_aaip_acL
|
||||
then
|
||||
AC_DEFINE([Libisofs_with_aaip_acL], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Libisofs_with_aaip_xattR], [Define to use xattr capabilities])
|
||||
AC_ARG_ENABLE(xattr,
|
||||
[ --enable-xattr Enable use of xattr by libisofs, default=yes],
|
||||
, enable_xattr=yes)
|
||||
if test x$enable_xattr = xyes; then
|
||||
dnl Check whether there is the header for Linux xattr.
|
||||
dnl Check whether there is the header for GNU/Linux xattr.
|
||||
dnl If not, erase this macro which would enable use of listxattr and others
|
||||
XATTR_DEF="-DLibisofs_with_aaip_xattR"
|
||||
AC_CHECK_HEADER(attr/xattr.h, AC_CHECK_LIB(c, listxattr, X= , XATTR_DEF= ), XATTR_DEF= )
|
||||
else
|
||||
XATTR_DEF=
|
||||
fi
|
||||
AC_SUBST(XATTR_DEF)
|
||||
if test x$XATTR_DEF = x-DLibisofs_with_aaip_xattR
|
||||
then
|
||||
AC_DEFINE([Libisofs_with_aaip_xattR], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Libisofs_with_zliB], [Define to use compression via zlib])
|
||||
AH_TEMPLATE([LIBJTE_WITH_ZLIB], [Allow libjte to use zlib])
|
||||
AC_ARG_ENABLE(zlib,
|
||||
[ --enable-zlib Enable use of zlib by libisofs, default=yes],
|
||||
, enable_zlib=yes)
|
||||
@ -174,16 +227,74 @@ dnl If not, erase this macro which would enable use of compress2() and others.
|
||||
dnl Linking fails on SuSE 9.0 because zlib has compress2() but lacks
|
||||
dnl compressBound(). So compressBound is the more modern thing to test.
|
||||
dnl The empty parameter after "compressBound" causes -lz.
|
||||
ZLIB_DEF="-DLibisofs_with_zliB"
|
||||
ZLIB_DEF=yes
|
||||
AC_CHECK_HEADER(zlib.h, AC_CHECK_LIB(z, compressBound, , ZLIB_DEF= ), ZLIB_DEF= )
|
||||
else
|
||||
ZLIB_DEF=
|
||||
fi
|
||||
AC_SUBST(ZLIB_DEF)
|
||||
if test x$ZLIB_DEF = xyes
|
||||
then
|
||||
AC_DEFINE([Libisofs_with_zliB], [])
|
||||
AC_DEFINE([LIBJTE_WITH_ZLIB], [])
|
||||
fi
|
||||
|
||||
|
||||
# libjte source is included in GNU xorriso. Enable it if zlib is enabled.
|
||||
AH_TEMPLATE([Xorriso_with_libjtE],
|
||||
[Define to use Jigdo Template Extraction via libjte])
|
||||
AH_TEMPLATE([Libisofs_with_libjtE],
|
||||
[Define to use Jigdo Template Extraction via libjte])
|
||||
if test x$ZLIB_DEF = xyes
|
||||
then
|
||||
AC_DEFINE([Xorriso_with_libjtE], [])
|
||||
AC_DEFINE([Libisofs_with_libjtE], [])
|
||||
LIBJTE_DEF=yes
|
||||
echo "enabled built-in libjte"
|
||||
else
|
||||
LIBJTE_DEF=
|
||||
echo "disabled libjte because zlib not enabled or not available"
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([THREADED_CHECKSUMS],
|
||||
[Define to use multi-threading in built-in libjte])
|
||||
AC_ARG_ENABLE(jtethreads,
|
||||
[ --enable-jtethreads Enable multi-threading in libjte, default=yes],
|
||||
, enable_jtethreads=yes)
|
||||
if test x$LIBJTE_DEF = xyes
|
||||
then
|
||||
if test "x$enable_jtethreads" = xyes; then
|
||||
AC_DEFINE([THREADED_CHECKSUMS], [])
|
||||
echo "enabled multi-threading in libjte"
|
||||
else
|
||||
echo "disabled multi-threading in libjte"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([LIBJTE_WITH_LIBBZ2],
|
||||
[Define to use libbz2 by built-in libjte])
|
||||
AC_ARG_ENABLE(libbz2,
|
||||
[ --enable-libbz2 Enable use of libbz2 by libjte, default=yes],
|
||||
, enable_libbz2=yes)
|
||||
if test "x$enable_libbz2" = xyes -a x$LIBJTE_DEF = xyes ; then
|
||||
dnl Check whether there is the header for libbz2.
|
||||
BZIP2_DEF=yes
|
||||
AC_CHECK_HEADER(bzlib.h, AC_CHECK_LIB(bz2, BZ2_bzCompressInit, , BZIP2_DEF= ), BZIP2_DEF= )
|
||||
else
|
||||
BZIP2_DEF=
|
||||
fi
|
||||
if test x$BZIP2_DEF = xyes
|
||||
then
|
||||
AC_DEFINE([LIBJTE_WITH_LIBBZ2], [])
|
||||
BZIP2_DEF="-DLIBJTE_WITH_LIBBZ2"
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Libburn_use_libcdiO], [Define to use libcdio as system adapter])
|
||||
AC_ARG_ENABLE(libcdio,
|
||||
[ --enable-libcdio Enable EXPERIMENTAL use of libcdio as system adapter, default=no],
|
||||
[ --enable-libcdio Enable EXPERIMENTAL use of libcdio as system adapter, default=no],
|
||||
, enable_libcdio=no)
|
||||
if test x$enable_libcdio = xyes; then
|
||||
dnl Check whether there is libcdio-devel and libcdio-runtime.
|
||||
@ -203,12 +314,21 @@ then
|
||||
else
|
||||
echo "enabled EXPERIMENTAL use of libcdio as system adapter"
|
||||
|
||||
# ------- Visible mark in configure : Start of library check
|
||||
|
||||
LIBCDIO_REQUIRED=0.83
|
||||
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
|
||||
|
||||
# ------- Visible mark in configure : End of library check
|
||||
|
||||
fi
|
||||
if test x$LIBCDIO_DEF = x-DLibburn_use_libcdiO
|
||||
then
|
||||
AC_DEFINE([Libburn_use_libcdiO], [])
|
||||
fi
|
||||
AC_SUBST(LIBCDIO_DEF)
|
||||
|
||||
|
||||
AH_TEMPLATE([Xorriso_allow_external_filterS], [Define to allow xorriso to start external filter processes])
|
||||
AC_ARG_ENABLE(external-filters,
|
||||
[ --enable-external-filters Enable use of external filter programs by xorriso, default=yes],
|
||||
, enable_external_filters=yes)
|
||||
@ -219,8 +339,13 @@ else
|
||||
EXTF_DEF=
|
||||
echo "disabled xorriso external filter programs"
|
||||
fi
|
||||
AC_SUBST(EXTF_DEF)
|
||||
if test x$EXTF_DEF = x-DXorriso_allow_external_filterS
|
||||
then
|
||||
AC_DEFINE([Xorriso_allow_external_filterS], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Xorriso_allow_extf_suiD], [Define to allow external filters to xorriso when running under setuid])
|
||||
AC_ARG_ENABLE(external-filters-setuid,
|
||||
[ --enable-external-filters-setuid Enable xorriso external filter programs under setuid, default=no],
|
||||
, enable_external_filters_setuid=no)
|
||||
@ -231,8 +356,13 @@ else
|
||||
EXTF_SUID_DEF=
|
||||
echo "disabled xorriso external filter programs under setuid"
|
||||
fi
|
||||
AC_SUBST(EXTF_SUID_DEF)
|
||||
if test x$EXTF_SUID_DEF = x-DXorriso_allow_extf_suiD
|
||||
then
|
||||
AC_DEFINE([Xorriso_allow_extf_suiD], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Xorriso_dvd_obs_default_64K], [Define to make 64 KB default size for DVD/BD writing])
|
||||
AC_ARG_ENABLE(dvd-obs-64k,
|
||||
[ --enable-dvd-obs-64k 64 KB default size for DVD/BD writing, default=no],
|
||||
, enable_dvd_obs=no)
|
||||
@ -243,8 +373,13 @@ else
|
||||
XORRISO_DVD_OBS_64K=
|
||||
echo "disabled xorriso write size default 64 KB on DVD and BD"
|
||||
fi
|
||||
AC_SUBST(XORRISO_DVD_OBS_64K)
|
||||
if test x$XORRISO_DVD_OBS_64K = x-DXorriso_dvd_obs_default_64K
|
||||
then
|
||||
AC_DEFINE([Xorriso_dvd_obs_default_64K], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Libburn_read_o_direcT], [Define to use O_DIRECT with -as cdrskin])
|
||||
AC_ARG_ENABLE(track-src-odirect,
|
||||
[ --enable-track-src-odirect Enable use of O_DIRECT with -as cdrskin, default=no],
|
||||
, enable_track_src_odirect=no)
|
||||
@ -255,12 +390,16 @@ else
|
||||
LIBBURN_O_DIRECT_DEF=
|
||||
echo "disabled use of O_DIRECT with input of -as cdrskin"
|
||||
fi
|
||||
AC_SUBST(LIBBURN_O_DIRECT_DEF)
|
||||
if test x$LIBBURN_O_DIRECT_DEF = x-DLibburn_read_o_direcT
|
||||
then
|
||||
AC_DEFINE([Libburn_read_o_direcT], [])
|
||||
fi
|
||||
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
version.h
|
||||
])
|
||||
AC_OUTPUT
|
||||
|
||||
# xorriso.pc
|
||||
|
||||
|
@ -1,113 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# convert_man_to_html.sh - ts A80118
|
||||
# convert_man_to_html.sh - ts B10309
|
||||
#
|
||||
# Generates a HTML version of man page xorriso.1
|
||||
# Generates a HTML version of man pages xorriso.1 , xorrisofs.1
|
||||
#
|
||||
# To be executed in the libisoburn toplevel directory (eg. ./libisoburn-0.1.0)
|
||||
# To be executed in the libisoburn toplevel directory (eg. ./libisoburn-1.0.4)
|
||||
#
|
||||
|
||||
# set -x
|
||||
xorriso/man_xorriso_to_html.sh
|
||||
xorriso/man_xorrisofs_to_html.sh
|
||||
|
||||
man_dir=$(pwd)"/xorriso"
|
||||
export MANPATH="$man_dir"
|
||||
manpage="xorriso"
|
||||
raw_html=$(pwd)/"xorriso/raw_man_1_xorriso.html"
|
||||
htmlpage=$(pwd)/"xorriso/man_1_xorriso.html"
|
||||
|
||||
if test -r "$man_dir"/"$manpage".1
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "Cannot find readable man page source $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -e "$man_dir"/man1
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
ln -s . "$man_dir"/man1
|
||||
fi
|
||||
|
||||
if test "$1" = "-work_as_filter"
|
||||
then
|
||||
|
||||
# set -x
|
||||
|
||||
sed \
|
||||
-e 's/<meta name="generator" content="groff -Thtml, see www.gnu.org">/<meta name="generator" content="groff -Thtml, via man -H, via xorriso\/convert_man_to_html.sh">/' \
|
||||
-e 's/<meta name="Content-Style" content="text\/css">/<meta name="Content-Style" content="text\/css"><META NAME="description" CONTENT="man page of xorriso"><META NAME="keywords" CONTENT="man xorriso, manual, xorriso, CD, CD-RW, CD-R, burning, cdrecord, compatible"><META NAME="robots" CONTENT="follow">/' \
|
||||
-e 's/<title>XORRISO<\/title>/<title>man 1 xorriso<\/title>/' \
|
||||
-e 's/<h1 align=center>XORRISO<\/h1>/<h1 align=center>man 1 xorriso<\/h1>/' \
|
||||
-e 's/<body>/<body BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>/' \
|
||||
-e 's/<b>Overview of features:<\/b>/\ <BR><b>Overview of features:<\/b>/' \
|
||||
-e 's/<b>General information paragraphs:<\/b>/\ <BR><b>General information paragraphs:<\/b>/' \
|
||||
-e 's/have a look at section EXAMPLES/have a look at section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \
|
||||
-e 's/<b>Session model:<\/b>/\ <BR><b>Session model:<\/b>/' \
|
||||
-e 's/<b>Media types and states:<\/b>/\ <BR><b>Media types and states:<\/b>/' \
|
||||
-e 's/<b>Creating, Growing, Modifying, Blind/\ <BR><b>Creating, Growing, Modifying, Blind/' \
|
||||
-e 's/<b>Libburn drives:<\/b>/\ <BR><b>Libburn drives:<\/b>/' \
|
||||
-e 's/^-dev /\ \ -dev /' \
|
||||
-e 's/^-devices /\ \ -devices /' \
|
||||
-e 's/<b>Rock Ridge, POSIX, X\/Open, El Torito, ACL,/\ <BR><b>Rock Ridge, POSIX, X\/Open, El Torito, ACL,/' \
|
||||
-e 's/<b>Command processing:<\/b>/\ <BR><b>Command processing:<\/b>/' \
|
||||
-e 's/<b>Dialog, Readline, Result pager:<\/b>/\ <BR><b>Dialog, Readline, Result pager:<\/b>/' \
|
||||
-e 's/<b>Aquiring source and target drive:<\/b>/\ <BR><b>Aquiring source and target drive:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Data manipulations:<\/b>/\ <BR><b>Data manipulations:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^<p><b>−iso_rr_pattern/<p>\ <BR><b>\−iso_rr_pattern/' \
|
||||
-e 's/EXAMPLES):<br>/<A HREF="#EXAMPLES">EXAMPLES<\/A>):<br>/' \
|
||||
-e 's/<b>Writing the result:<\/b>/\ <BR><b>Writing the result:<\/b><BR>/' \
|
||||
-e 's/^-find \/ /\ \ -find \/ /' \
|
||||
-e 's/<b>Settings for data insertion:<\/b>/\ <BR><b>Settings for data insertion:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^$<\/b> ln -s/\ \ $<\/b> ln -s/' \
|
||||
-e 's/<b>Settings for result writing:<\/b>/\ <BR><b>Settings for result writing:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^706k = 706kB/\ \ 706k = 706kB/' \
|
||||
-e 's/^5540k = 5540kB/\ \ 5540k = 5540kB/' \
|
||||
-e 's/<b>Character sets:<\/b>/\ <BR><b>Character sets:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Exception processing:<\/b>/\ <BR><b>Exception processing:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>El Torito bootable ISO images:<\/b>/\ <BR><b>El Torito bootable ISO images:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Dialog mode control:<\/b>/\ <BR><b>Dialog mode control:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Drive and media related inquiry actions:<\/b>/\ <BR><b>Drive and media related inquiry actions:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Navigation in ISO image/\ <BR><b>Navigation in ISO image/' \
|
||||
-e 's/^filesystem:<\/b>/filesystem:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Evaluation of readability and recovery:<\/b>/\ <BR><b>Evaluation of readability and recovery:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>osirrox restore options:<\/b>/\ <BR><b>osirrox restore options:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Command compatibility emulations:<\/b>/\ <BR><b>Command compatibility emulations:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^<p><b>−as</<p>\ <BR><b>\−as</' \
|
||||
-e 's/<b>Scripting, dialog and/\ <BR><b>Scripting, dialog and/' \
|
||||
-e 's/^features:<\/b>/features:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Support for frontend/\ <BR><b>Support for frontend/' \
|
||||
-e 's/^listening at stdout:<\/b>/listening at stdout:<\/b><BR>\ <BR>/' \
|
||||
-e 's/xorriso -outdev \/dev\/sr2 \\ -blank fast \\ -pathspecs on/xorriso -outdev \/dev\/sr2 -blank fast -pathspecs on/' \
|
||||
-e 's/\\ -add \\ \/sounds=\/home\/me\/sounds \\ \/pictures \\ -- \\ -rm_r \\/ -add \/sounds=\/home\/me\/sounds \/pictures -- -rm_r /' \
|
||||
-e 's/\/sounds\/indecent \\ \’\/pictures\/\*private\*\’ \\/\/sounds\/indecent \’\/pictures\/*private*\’ /' \
|
||||
-e 's/\/pictures\/confidential \\ -- \\ -add \\/\/pictures\/confidential -- -add/' \
|
||||
-e 's/xorriso -dev \/dev\/sr2 \\ -rm_r \/sounds -- \\ -mv \\/xorriso -dev \/dev\/sr2 -rm_r \/sounds -- -mv /' \
|
||||
-e 's/\/pictures\/confidential \\ \/pictures\/restricted \\ -- \\ -chmod/\/pictures\/confidential \/pictures\/restricted -- -chmod/' \
|
||||
-e 's/go-rwx \/pictures\/restricted -- \\ -pathsspecs on \\ -add \\/go-rwx \/pictures\/restricted -- -pathsspecs on -add /' \
|
||||
-e 's/\/sounds=\/home\/me\/prepared_for_dvd\/sounds_dummy /\/sounds=\/home\/me\/prepared_for_dvd\/sounds_dummy/' \
|
||||
-e 's/\/movies=\/home\/me\/prepared_for_dvd\/movies \\ -- \\ -commit/\/movies=\/home\/me\/prepared_for_dvd\/movies -- -commit/' \
|
||||
-e 's/xorriso -indev \/dev\/sr2 \\ -rm_r \/sounds -- \\/xorriso -indev \/dev\/sr2 -rm_r \/sounds -- /' \
|
||||
-e 's/-outdev \/dev\/sr0 -blank fast \\ -commit -eject all/-outdev \/dev\/sr0 -blank fast -commit -eject all/' \
|
||||
-e 's/See section FILES/See section <A HREF="#FILES">FILES<\/A>/' \
|
||||
-e 's/See section EXAMPLES/See section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \
|
||||
-e 's/<\/body>/<BR><HR><FONT SIZE=-1><CENTER>(HTML generated from '"$manpage"'.1 on '"$(date)"' by '$(basename "$0")' )<\/CENTER><\/FONT><\/body>/' \
|
||||
<"$2" >"$htmlpage"
|
||||
|
||||
set +x
|
||||
|
||||
chmod u+rw,go+r,go-w "$htmlpage"
|
||||
echo "Emerged file:"
|
||||
ls -lL "$htmlpage"
|
||||
|
||||
else
|
||||
|
||||
export BROWSER='cp "%s" '"$raw_html"
|
||||
man -H "$manpage"
|
||||
"$0" -work_as_filter "$raw_html"
|
||||
rm "$raw_html"
|
||||
rm "$man_dir"/man1
|
||||
|
||||
fi
|
||||
|
1918
xorriso/disk_ops.c
Normal file
1918
xorriso/disk_ops.c
Normal file
File diff suppressed because it is too large
Load Diff
117
xorriso/disk_ops.h
Normal file
117
xorriso/disk_ops.h
Normal file
@ -0,0 +1,117 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of class DirseQ which
|
||||
crawls along a directory's content list.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_diskop_includeD
|
||||
#define Xorriso_pvt_diskop_includeD yes
|
||||
|
||||
|
||||
/* @param flag bit0= simple readlink(): no normalization, no multi-hop
|
||||
*/
|
||||
int Xorriso_resolve_link(struct XorrisO *xorriso,
|
||||
char *link_path, char result_path[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_convert_gidstring(struct XorrisO *xorriso, char *gid_string,
|
||||
gid_t *gid, int flag);
|
||||
|
||||
int Xorriso_convert_modstring(struct XorrisO *xorriso, char *cmd, char *mode,
|
||||
mode_t *mode_and, mode_t *mode_or, int flag);
|
||||
|
||||
int Xorriso_convert_uidstring(struct XorrisO *xorriso, char *uid_string,
|
||||
uid_t *uid, int flag);
|
||||
|
||||
/* @param flag bit0= for Xorriso_msgs_submit: use pager
|
||||
*/
|
||||
int Xorriso_hop_link(struct XorrisO *xorriso, char *link_path,
|
||||
struct LinkiteM **link_stack, struct stat *stbuf, int flag);
|
||||
|
||||
int Xorriso__mode_to_perms(mode_t st_mode, char perms[11], int flag);
|
||||
|
||||
int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag);
|
||||
|
||||
/* @param flag bit0= long format
|
||||
bit1= do not print count of nodes
|
||||
bit2= du format
|
||||
bit3= print directories as themselves (ls -d)
|
||||
*/
|
||||
int Xorriso_lsx_filev(struct XorrisO *xorriso, char *wd,
|
||||
int filec, char **filev, off_t boss_mem, int flag);
|
||||
|
||||
/*
|
||||
@param flag >>> bit0= remove whole sub tree: rm -r
|
||||
bit1= remove empty directory: rmdir
|
||||
bit2= recursion: do not reassure in mode 2 "tree"
|
||||
bit3= this is for overwriting and not for plain removal
|
||||
bit4= count deleted files in xorriso->pacifier_count
|
||||
bit5= with bit0 only remove directory content, not the directory
|
||||
@return <=0 = error
|
||||
1 = removed leaf file object
|
||||
2 = removed directory or tree
|
||||
3 = did not remove on user revocation
|
||||
*/
|
||||
int Xorriso_rmx(struct XorrisO *xorriso, off_t boss_mem, char *path, int flag);
|
||||
|
||||
int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
char *abs_dir_parm, char *dir_path,
|
||||
struct stat *dir_stbuf, int depth,
|
||||
struct LinkiteM *link_stack, int flag);
|
||||
|
||||
/* @param flag bit0= no hardlink reconstruction
|
||||
bit1= do not set xorriso->node_*_prefixes
|
||||
bit5= -extract_single: eventually do not insert directory tree
|
||||
*/
|
||||
int Xorriso_restore_sorted(struct XorrisO *xorriso, int count,
|
||||
char **src_array, char **tgt_array,
|
||||
int *problem_count, int flag);
|
||||
|
||||
/* @param flag bit0= path is a directory
|
||||
bit2= recursion: do not reassure in mode 2 "tree"
|
||||
bit3= this is for overwriting and not for plain removal
|
||||
*/
|
||||
int Xorriso_reassure_restore(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
/* @param flag bit7= return 4 if restore fails from denied permission
|
||||
do not issue error message
|
||||
@return <=0 failure , 1 success ,
|
||||
4 with bit7: permission to create file was denied
|
||||
*/
|
||||
int Xorriso_make_tmp_path(struct XorrisO *xorriso, char *orig_path,
|
||||
char *tmp_path, int *fd, int flag);
|
||||
|
||||
/* @param flag bit0= change regardless of xorriso->do_auto_chmod
|
||||
bit1= desired is only rx
|
||||
*/
|
||||
int Xorriso_auto_chmod(struct XorrisO *xorriso, char *disk_path, int flag);
|
||||
|
||||
int Xorriso_make_accessible(struct XorrisO *xorriso, char *disk_path,int flag);
|
||||
|
||||
/* @param flag bit0= prefer to find a match after *img_prefixes
|
||||
(but deliver img_prefixes if no other can be found)
|
||||
*/
|
||||
int Xorriso_make_restore_path(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT **img_prefixes, struct Xorriso_lsT **disk_prefixes,
|
||||
char img_path[SfileadrL], char disk_path[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_restore_make_hl(struct XorrisO *xorriso,
|
||||
char *old_path, char *new_path, int flag);
|
||||
|
||||
int Xorriso_afile_fopen(struct XorrisO *xorriso,
|
||||
char *filename, char *mode, FILE **ret_fp, int flag);
|
||||
|
||||
int Xorriso_make_mount_cmd(struct XorrisO *xorriso, char *cmd,
|
||||
int lba, int track, int session, char *volid,
|
||||
char *devadr, char result[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_append_scdbackup_record(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_diskop_includeD */
|
||||
|
2623
xorriso/drive_mgt.c
Normal file
2623
xorriso/drive_mgt.c
Normal file
File diff suppressed because it is too large
Load Diff
42
xorriso/drive_mgt.h
Normal file
42
xorriso/drive_mgt.h
Normal file
@ -0,0 +1,42 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which operate on drives
|
||||
and media.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_drive_mgt_includeD
|
||||
#define Xorriso_pvt_drive_mgt_includeD yes
|
||||
|
||||
|
||||
int Xorriso_may_burn(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_toc_line(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_media_product(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_check_md5_range(struct XorrisO *xorriso, off_t start_lba,
|
||||
off_t end_lba, char md5[16], int flag);
|
||||
|
||||
int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
struct CheckmediajoB *job,
|
||||
int from_lba, int block_count, int read_chunk,
|
||||
int md5_start, int flag);
|
||||
|
||||
int Xorriso_get_drive_handles(struct XorrisO *xorriso,
|
||||
struct burn_drive_info **dinfo,
|
||||
struct burn_drive **drive,
|
||||
char *attempt, int flag);
|
||||
|
||||
int Xorriso_check_for_abort(struct XorrisO *xorriso,
|
||||
char *abort_file_path,
|
||||
double post_read_time,
|
||||
double *last_abort_file_time, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_drive_mgt_includeD */
|
||||
|
1988
xorriso/emulators.c
Normal file
1988
xorriso/emulators.c
Normal file
File diff suppressed because it is too large
Load Diff
34
xorriso/emulators.h
Normal file
34
xorriso/emulators.h
Normal file
@ -0,0 +1,34 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of emulators for mkisofs and cdrecord.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_emul_includeD
|
||||
#define Xorriso_pvt_emul_includeD yes
|
||||
|
||||
/* micro version of cdrskin */
|
||||
int Xorriso_cdrskin(struct XorrisO *xorriso, char *whom, int argc, char **argv,
|
||||
int flag);
|
||||
|
||||
int Xorriso_cdrskin_help(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_as_cdrskin(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
|
||||
/* micro emulation of mkisofs */
|
||||
int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
|
||||
int argc, char **argv, int flag);
|
||||
|
||||
int Xorriso_genisofs_help(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_as_genisofs(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_emul_includeD */
|
||||
|
701
xorriso/filters.c
Normal file
701
xorriso/filters.c
Normal file
@ -0,0 +1,701 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which operate on data filter objects.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "lib_mgt.h"
|
||||
#include "iso_tree.h"
|
||||
|
||||
/*
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#include "iso_img.h"
|
||||
#include "iso_manip.h"
|
||||
#include "sort_cmp.h"
|
||||
|
||||
*/
|
||||
|
||||
|
||||
struct Xorriso_extF {
|
||||
|
||||
int flag; /* unused yet */
|
||||
|
||||
IsoExternalFilterCommand *cmd;
|
||||
|
||||
};
|
||||
|
||||
int Xorriso_extf_destroy(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
int flag);
|
||||
|
||||
|
||||
/* @param flag see struct Xorriso_extF.flag */
|
||||
int Xorriso_extf_new(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
char *path, int argc, char **argv, int behavior,
|
||||
char *suffix, char *name, int flag)
|
||||
{
|
||||
int i;
|
||||
struct Xorriso_extF *o= NULL;
|
||||
IsoExternalFilterCommand *cmd;
|
||||
|
||||
*filter= o= calloc(sizeof(struct Xorriso_extF), 1);
|
||||
if(o == NULL)
|
||||
goto failure;
|
||||
o->flag= flag;
|
||||
o->cmd= NULL;
|
||||
o->cmd= cmd= calloc(sizeof(IsoExternalFilterCommand), 1);
|
||||
if(cmd == NULL)
|
||||
goto failure;
|
||||
cmd->version= 0;
|
||||
cmd->refcount= 0;
|
||||
cmd->name= NULL;
|
||||
cmd->path= NULL;
|
||||
cmd->argv= NULL;
|
||||
cmd->argc= argc + 1;
|
||||
cmd->behavior= behavior;
|
||||
cmd->suffix= NULL;
|
||||
cmd->suffix= strdup(suffix);
|
||||
if(cmd->suffix == NULL)
|
||||
goto failure;
|
||||
|
||||
cmd->path= strdup(path);
|
||||
if(cmd->path == NULL)
|
||||
goto failure;
|
||||
cmd->argv= calloc(sizeof(char *), argc + 2);
|
||||
if(cmd->argv == NULL)
|
||||
goto failure;
|
||||
for(i= 0; i < argc + 2; i++)
|
||||
cmd->argv[i]= NULL;
|
||||
cmd->argv[0]= strdup(path);
|
||||
if(cmd->argv[0] == NULL)
|
||||
goto failure;
|
||||
for(i= 0; i < argc; i++) {
|
||||
cmd->argv[i + 1]= strdup(argv[i]);
|
||||
if(cmd->argv[i] == NULL)
|
||||
goto failure;
|
||||
}
|
||||
cmd->name= strdup(name);
|
||||
if(cmd->name == NULL)
|
||||
goto failure;
|
||||
return(1);
|
||||
failure:;
|
||||
Xorriso_extf_destroy(xorriso, filter, 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_extf_destroy(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
int flag)
|
||||
{
|
||||
int i;
|
||||
IsoExternalFilterCommand *cmd;
|
||||
|
||||
if(*filter == NULL)
|
||||
return(0);
|
||||
cmd= (*filter)->cmd;
|
||||
if(cmd != NULL) {
|
||||
if(cmd->refcount > 0)
|
||||
return(0);
|
||||
if(cmd->path != NULL)
|
||||
free(cmd->path);
|
||||
if(cmd->suffix != NULL)
|
||||
free(cmd->suffix);
|
||||
if(cmd->argv != NULL) {
|
||||
for(i= 0; i < cmd->argc; i++)
|
||||
if(cmd->argv[i] != NULL)
|
||||
free(cmd->argv[i]);
|
||||
free((char *) cmd->argv);
|
||||
}
|
||||
if(cmd->name != NULL)
|
||||
free(cmd->name);
|
||||
free((char *) cmd);
|
||||
}
|
||||
free((char *) *filter);
|
||||
*filter= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_lookup_extf(struct XorrisO *xorriso, char *name,
|
||||
struct Xorriso_lsT **found_lst, int flag)
|
||||
{
|
||||
struct Xorriso_extF *filter;
|
||||
struct Xorriso_lsT *lst;
|
||||
|
||||
for(lst= xorriso->filters; lst != NULL; lst= Xorriso_lst_get_next(lst, 0)) {
|
||||
filter= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
|
||||
if(strcmp(filter->cmd->name, name) == 0) {
|
||||
*found_lst= lst;
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_all_extf(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
struct Xorriso_extF *filter;
|
||||
struct Xorriso_lsT *lst, *next_lst;
|
||||
|
||||
for(lst= xorriso->filters; lst != NULL; lst= next_lst) {
|
||||
filter= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
|
||||
Xorriso_lst_detach_text(lst, 0);
|
||||
next_lst= Xorriso_lst_get_next(lst, 0);
|
||||
Xorriso_lst_destroy(&lst, 0);
|
||||
Xorriso_extf_destroy(xorriso, &filter, 0);
|
||||
}
|
||||
xorriso->filters= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@param flag bit0= return 2 if renaming is not possible by libisofs
|
||||
(always: if demanded strip suffix is missing
|
||||
or if suffix makes name length > 255)
|
||||
bit1= strip suffix rather than appending it
|
||||
*/
|
||||
int Xorriso_rename_suffix(struct XorrisO *xorriso, IsoNode *node, char *suffix,
|
||||
char *show_path, char new_name[], int flag)
|
||||
{
|
||||
int ret, lo= 0, ls= 0, strip_suffix;
|
||||
char *old_name= NULL, *show_name;
|
||||
|
||||
strip_suffix= !!(flag & 2);
|
||||
|
||||
old_name= strdup((char *) iso_node_get_name(node));
|
||||
show_name= old_name;
|
||||
if(show_path != NULL)
|
||||
if(show_path[0] != 0)
|
||||
show_name= show_path;
|
||||
lo= strlen(old_name);
|
||||
ls= strlen(suffix);
|
||||
if(strip_suffix) {
|
||||
if(lo <= ls) {
|
||||
/* refuse gracefully */
|
||||
ret= 2; goto ex;
|
||||
}
|
||||
if(strcmp(old_name + lo - ls, suffix) != 0) {
|
||||
ret= 2; goto ex;
|
||||
}
|
||||
if(lo >= SfileadrL)
|
||||
goto cannot_remove_suffix;
|
||||
strcpy(new_name, old_name);
|
||||
new_name[lo - ls]= 0;
|
||||
ret = iso_node_set_name(node, new_name);
|
||||
if (ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if (!(flag & 1))
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when renaming ISO node", 0, "FAILURE", 1);
|
||||
cannot_remove_suffix:;
|
||||
strcpy(xorriso->info_text, "-set_filter: Cannot remove suffix from ");
|
||||
Text_shellsafe(show_name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag & 1) ? "WARNING" : "FAILURE", 0);
|
||||
ret= 2 * (flag & 1); goto ex;
|
||||
}
|
||||
} else {
|
||||
/* check whether suffix already present */
|
||||
if(lo >= ls)
|
||||
if(strcmp(old_name + lo - ls, suffix) == 0) {
|
||||
/* refuse gracefully */
|
||||
ret= 2; goto ex;
|
||||
}
|
||||
if(lo + ls > 255) {
|
||||
cannot_append_suffix:;
|
||||
strcpy(xorriso->info_text, "-set_filter: Cannot append suffix to ");
|
||||
Text_shellsafe(show_name, xorriso->info_text, 1);
|
||||
strcat(xorriso->info_text, ". Left unfiltered.");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag & 1) ? "WARNING" : "FAILURE", 0);
|
||||
ret= 2 * (flag & 1); goto ex;
|
||||
}
|
||||
sprintf(new_name, "%s%s", old_name, suffix);
|
||||
ret = iso_node_set_name(node, new_name);
|
||||
if (ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if (!(flag & 1))
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when renaming ISO node", 0, "FAILURE", 1);
|
||||
goto cannot_append_suffix;
|
||||
}
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(old_name != NULL)
|
||||
free(old_name);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@param flag bit0= return 2 if renaming is not possible
|
||||
bit1= print pacifier messages
|
||||
*/
|
||||
int Xorriso_set_filter(struct XorrisO *xorriso, void *in_node,
|
||||
char *path, char *filter_name, int flag)
|
||||
{
|
||||
int ret, strip_suffix= 0, strip_filter= 0, filter_ret= 0;
|
||||
int explicit_suffix= 0, internal_filter= 0;
|
||||
IsoNode *node;
|
||||
IsoFile *file;
|
||||
struct Xorriso_lsT *found_lst;
|
||||
struct Xorriso_extF *found_filter;
|
||||
IsoExternalFilterCommand *cmd = NULL;
|
||||
char *old_name= NULL, *new_name= NULL, *suffix= "";
|
||||
IsoStream *stream;
|
||||
|
||||
Xorriso_alloc_meM(new_name, char, SfileadrL);
|
||||
new_name[0]= 0;
|
||||
|
||||
node= (IsoNode *) in_node;
|
||||
if(node == NULL) {
|
||||
ret= Xorriso_get_node_by_path(xorriso, path, NULL, &node, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
if(!LIBISO_ISREG(node)) {
|
||||
strcpy(xorriso->info_text, "-set_filter: Not a regular data file node ");
|
||||
Text_shellsafe(path, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
file= (IsoFile *) node;
|
||||
|
||||
if(strncmp(filter_name, "--remove-all-filters", 20) == 0) {
|
||||
strip_filter= 1;
|
||||
strip_suffix= 1;
|
||||
if(strlen(filter_name) > 21) {
|
||||
strip_suffix= (filter_name[20] != '+');
|
||||
suffix= filter_name + 21;
|
||||
explicit_suffix= 1;
|
||||
}
|
||||
} else if(strcmp(filter_name, "--zisofs") == 0) {
|
||||
internal_filter= 1;
|
||||
} else if(strcmp(filter_name, "--zisofs-decode") == 0) {
|
||||
internal_filter= 2;
|
||||
} else if(strcmp(filter_name, "--gzip") == 0) {
|
||||
internal_filter= 3;
|
||||
suffix= ".gz";
|
||||
strip_suffix= 0;
|
||||
explicit_suffix= 1;
|
||||
} else if(strcmp(filter_name, "--gunzip") == 0 ||
|
||||
strcmp(filter_name, "--gzip-decode") == 0) {
|
||||
internal_filter= 4;
|
||||
suffix= ".gz";
|
||||
strip_suffix= 1;
|
||||
explicit_suffix= 1;
|
||||
} else {
|
||||
ret= Xorriso_lookup_extf(xorriso, filter_name, &found_lst, 0);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 0) {
|
||||
strcpy(xorriso->info_text, "-set_filter: Not a registered filter name ");
|
||||
Text_shellsafe(filter_name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
found_filter= (struct Xorriso_extF *) Xorriso_lst_get_text(found_lst, 0);
|
||||
cmd= found_filter->cmd;
|
||||
suffix= cmd->suffix;
|
||||
strip_suffix= cmd->behavior & 8;
|
||||
}
|
||||
|
||||
if(suffix[0]) {
|
||||
|
||||
/* >>> would need full iso_rr_path of node for showing */;
|
||||
|
||||
old_name= strdup((char *) iso_node_get_name(node));
|
||||
ret= Xorriso_rename_suffix(xorriso, node, suffix, path, new_name,
|
||||
(flag & 1) | (strip_suffix ? 2 : 0));
|
||||
if(ret <= 0 || ret == 2)
|
||||
goto ex;
|
||||
}
|
||||
|
||||
if(strip_filter) {
|
||||
while(1) {
|
||||
if(!explicit_suffix) {
|
||||
stream= iso_file_get_stream(file);
|
||||
|
||||
if(strncmp(stream->class->type, "gzip", 4) == 0) {
|
||||
suffix= ".gz";
|
||||
strip_suffix= 1;
|
||||
} else if(strncmp(stream->class->type, "pizg", 4) == 0) {
|
||||
suffix= ".gz";
|
||||
strip_suffix= 0;
|
||||
} else {
|
||||
ret= iso_stream_get_external_filter(stream, &cmd, 0);
|
||||
if(ret > 0) {
|
||||
suffix= cmd->suffix;
|
||||
strip_suffix= !(cmd->behavior & 8);
|
||||
}
|
||||
}
|
||||
if(suffix[0]) {
|
||||
|
||||
/* >>> would need the current renaming state of path */;
|
||||
|
||||
ret= Xorriso_rename_suffix(xorriso, node, suffix, NULL, new_name,
|
||||
(flag & 1) | (strip_suffix << 1));
|
||||
if(ret <= 0 || ret == 2)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
ret= iso_file_remove_filter(file, 0);
|
||||
if(ret != 1)
|
||||
break;
|
||||
}
|
||||
filter_ret= 1;
|
||||
} else if (internal_filter == 1 || internal_filter == 2) {
|
||||
filter_ret = iso_file_add_zisofs_filter(file, 1 | (internal_filter & 2));
|
||||
if(filter_ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(!(internal_filter == 2 && filter_ret == (int) ISO_ZISOFS_WRONG_INPUT))
|
||||
Xorriso_report_iso_error(xorriso, "", filter_ret,
|
||||
"Error when setting filter to ISO node", 0, "FAILURE", 1);
|
||||
}
|
||||
} else if (internal_filter == 3 || internal_filter == 4) {
|
||||
filter_ret = iso_file_add_gzip_filter(file,
|
||||
1 | ((internal_filter == 4) << 1));
|
||||
if(filter_ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
Xorriso_report_iso_error(xorriso, "", filter_ret,
|
||||
"Error when setting filter to ISO node", 0, "FAILURE", 1);
|
||||
}
|
||||
} else {
|
||||
|
||||
#ifndef Xorriso_allow_extf_suiD
|
||||
/* This is a final safety precaution before iso_file_add_external_filter()
|
||||
performs fork() and executes the alleged filter program.
|
||||
*/
|
||||
if(getuid() != geteuid()) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-set_filter: UID and EUID differ. Will not run external programs.");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
#endif /* ! Xorriso_allow_extf_suiD */
|
||||
|
||||
filter_ret = iso_file_add_external_filter(file, cmd, 0);
|
||||
if(filter_ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
Xorriso_report_iso_error(xorriso, "", filter_ret,
|
||||
"Error when setting filter to ISO node", 0, "FAILURE", 1);
|
||||
}
|
||||
}
|
||||
if(filter_ret != 1 && new_name[0] && old_name != NULL) {
|
||||
ret = iso_node_set_name(node, old_name);
|
||||
if (ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if (!(flag & 1))
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when renaming ISO node", 0, "FAILURE", 1);
|
||||
}
|
||||
}
|
||||
if(flag & 2) {
|
||||
xorriso->pacifier_count++;
|
||||
Xorriso_pacifier_callback(xorriso, "file filters processed",
|
||||
xorriso->pacifier_count, xorriso->pacifier_total, "", 0);
|
||||
}
|
||||
if(filter_ret < 0) {
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
|
||||
ret= filter_ret;
|
||||
ex:;
|
||||
if(old_name != NULL)
|
||||
free(old_name);
|
||||
Xorriso_free_meM(new_name);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= delete filter with the given name
|
||||
*/
|
||||
int Xorriso_external_filter(struct XorrisO *xorriso,
|
||||
char *name, char *options, char *path,
|
||||
int argc, char **argv, int flag)
|
||||
{
|
||||
int ret, delete= 0, behavior= 0, extf_flag= 0, is_banned= 0;
|
||||
char *what, *what_next, *suffix= "";
|
||||
struct Xorriso_lsT *lst;
|
||||
struct Xorriso_extF *found_filter, *new_filter= NULL;
|
||||
|
||||
#ifndef Xorriso_allow_external_filterS
|
||||
/* To be controlled by: configure --enable-external-filters */
|
||||
|
||||
sprintf(xorriso->info_text, "%s : Banned at compile time.",
|
||||
flag & 1 ? "-unregister_filter" : "-external_filter");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
sprintf(xorriso->info_text,
|
||||
"This may be changed at compile time by ./configure option --enable-external-filters");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "HINT", 0);
|
||||
is_banned= 1;
|
||||
|
||||
#endif /* ! Xorriso_allow_external_filterS */
|
||||
|
||||
#ifndef Xorriso_allow_extf_suiD
|
||||
/* To be controlled by: configure --enable-external-filters-setuid */
|
||||
|
||||
if(getuid() != geteuid()) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-set_filter: UID and EUID differ. Will not run external programs.");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
sprintf(xorriso->info_text,
|
||||
"This may be changed at compile time by ./configure option --enable-external-filters-setuid");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "HINT", 0);
|
||||
is_banned= 1;
|
||||
}
|
||||
#endif /* ! Xorriso_allow_extf_suiD */
|
||||
|
||||
if(is_banned)
|
||||
return(0);
|
||||
|
||||
if(xorriso->filter_list_closed) {
|
||||
sprintf(xorriso->info_text,
|
||||
"%s : Banned by previous command -close_filter_list",
|
||||
flag & 1 ? "-unregister_filter" : "-external_filter");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
if((!(flag & 1)) && path[0] != '/') {
|
||||
sprintf(xorriso->info_text,
|
||||
"-external_filter : Given command path does not begin by '/' : ");
|
||||
Text_shellsafe(path, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
delete= flag & 1;
|
||||
ret= Xorriso_lookup_extf(xorriso, name, &lst, 0);
|
||||
if(ret < 0)
|
||||
return(ret);
|
||||
if(ret > 0) {
|
||||
if(delete) {
|
||||
found_filter= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
|
||||
if(found_filter->cmd->refcount > 0) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-external_filter: Cannot remove filter because it is in use by %.f nodes : ",
|
||||
(double) found_filter->cmd->refcount);
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
Xorriso_lst_detach_text(lst, 0);
|
||||
if(xorriso->filters == lst)
|
||||
xorriso->filters= Xorriso_lst_get_next(lst, 0);
|
||||
Xorriso_lst_destroy(&lst, 0);
|
||||
Xorriso_extf_destroy(xorriso, &found_filter, 0);
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
strcpy(xorriso->info_text,
|
||||
"-external_filter: filter with given name already existing: ");
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
if(delete) {
|
||||
strcpy(xorriso->info_text,
|
||||
"-external_filter: filter with given name does not exist: ");
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
|
||||
for(what= options; what!=NULL; what= what_next) {
|
||||
what_next= strchr(what, ':');
|
||||
if(what_next!=NULL) {
|
||||
*what_next= 0;
|
||||
what_next++;
|
||||
}
|
||||
if(strncmp(what, "default", 7) == 0) {
|
||||
suffix= "";
|
||||
behavior= 0;
|
||||
} else if(strncmp(what, "suffix=", 7) == 0) {
|
||||
suffix= what + 7;
|
||||
} else if(strcmp(what, "remove_suffix") == 0) {
|
||||
behavior|= 8;
|
||||
} else if(strcmp(what, "if_nonempty") == 0) {
|
||||
behavior|= 1;
|
||||
} else if(strcmp(what, "if_reduction") == 0) {
|
||||
behavior|= 2;
|
||||
} else if(strcmp(what, "if_block_reduction") == 0) {
|
||||
behavior|= 4;
|
||||
} else if(strncmp(what, "used=", 5) == 0) {
|
||||
; /* this is informational output from -status */
|
||||
} else if(what[0]) {
|
||||
strcpy(xorriso->info_text,
|
||||
"-external_filter: unknown option ");
|
||||
Text_shellsafe(what, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
ret= Xorriso_extf_new(xorriso, &new_filter, path, argc, argv, behavior,
|
||||
suffix, name, extf_flag);
|
||||
if(ret <= 0) {
|
||||
could_not_create:;
|
||||
strcpy(xorriso->info_text,
|
||||
"-external_filter: Could not create filter object");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
goto ex;
|
||||
}
|
||||
ret= Xorriso_lst_append_binary(&(xorriso->filters), (char *) new_filter,0, 4);
|
||||
if(ret <= 0)
|
||||
goto could_not_create;
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(ret <= 0) {
|
||||
if(new_filter != NULL)
|
||||
Xorriso_extf_destroy(xorriso, &new_filter, 0);
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_status_extf(struct XorrisO *xorriso, char *filter, FILE *fp,
|
||||
int flag)
|
||||
/*
|
||||
bit1= do only report to fp
|
||||
*/
|
||||
{
|
||||
int i, maxl= 4 * SfileadrL;
|
||||
struct Xorriso_extF *extf;
|
||||
struct Xorriso_lsT *lst;
|
||||
char *line;
|
||||
|
||||
line= xorriso->result_line;
|
||||
for(lst= xorriso->filters; lst != NULL; lst= Xorriso_lst_get_next(lst, 0)) {
|
||||
extf= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
|
||||
|
||||
strcpy(xorriso->result_line, "-external_filter ");
|
||||
Text_shellsafe(extf->cmd->name, line, 1);
|
||||
if((int) strlen(line) > maxl)
|
||||
continue;
|
||||
strcat(line, " ");
|
||||
if(extf->cmd->suffix[0]) {
|
||||
strcat(line, "suffix=");
|
||||
Text_shellsafe(extf->cmd->suffix, line, 1);
|
||||
if((int) strlen(line) > maxl)
|
||||
continue;
|
||||
strcat(line, ":");
|
||||
}
|
||||
if(extf->cmd->behavior & 8)
|
||||
strcat(line, "remove_suffix:");
|
||||
if(extf->cmd->behavior & 1)
|
||||
strcat(line, "if_nonempty:");
|
||||
if(extf->cmd->behavior & 2)
|
||||
strcat(line, "if_reduction:");
|
||||
if(extf->cmd->behavior & 4)
|
||||
strcat(line, "if_block_reduction:");
|
||||
sprintf(line + strlen(line), "used=%.f ", (double) extf->cmd->refcount);
|
||||
if((int) strlen(line) > maxl)
|
||||
continue;
|
||||
Text_shellsafe(extf->cmd->path, line, 1);
|
||||
if((int) strlen(line) > maxl)
|
||||
continue;
|
||||
for(i= 1; i < extf->cmd->argc; i++) {
|
||||
strcat(line, " ");
|
||||
Text_shellsafe(extf->cmd->argv[i], line, 1);
|
||||
if((int) strlen(line) > maxl)
|
||||
break;
|
||||
}
|
||||
if(i < extf->cmd->argc)
|
||||
continue;
|
||||
strcat(line, " --\n");
|
||||
Xorriso_status_result(xorriso, filter, fp, flag&2);
|
||||
}
|
||||
if(xorriso->filter_list_closed) {
|
||||
strcpy(line, "-close_filter_list\n");
|
||||
Xorriso_status_result(xorriso, filter, fp, flag&2);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_set_zisofs_params(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
struct iso_zisofs_ctrl ctrl;
|
||||
|
||||
ctrl.version= 0;
|
||||
ctrl.compression_level= xorriso->zlib_level;
|
||||
if(xorriso->zisofs_block_size == (1 << 16))
|
||||
ctrl.block_size_log2= 16;
|
||||
else if(xorriso->zisofs_block_size == (1 << 17))
|
||||
ctrl.block_size_log2= 17;
|
||||
else
|
||||
ctrl.block_size_log2= 15;
|
||||
ret= iso_zisofs_set_params(&ctrl, 0);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret < 0) {
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when setting zisofs parameters", 0, "FAILURE", 1);
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_status_zisofs(struct XorrisO *xorriso, char *filter, FILE *fp,
|
||||
int flag)
|
||||
/*
|
||||
bit0= do only report non-default settings
|
||||
bit1= do only report to fp
|
||||
*/
|
||||
{
|
||||
off_t ziso_count= 0, osiz_count= 0;
|
||||
off_t gzip_count= 0, gunzip_count= 0;
|
||||
|
||||
iso_zisofs_get_refcounts(&ziso_count, &osiz_count, 0);
|
||||
iso_gzip_get_refcounts(&gzip_count, &gunzip_count, 0);
|
||||
if((flag & 1) && xorriso->zlib_level == xorriso->zlib_level_default &&
|
||||
xorriso->zisofs_block_size == xorriso->zisofs_block_size_default &&
|
||||
xorriso->zisofs_by_magic == 0 &&
|
||||
ziso_count == 0 && osiz_count == 0 &&
|
||||
gzip_count == 0 && gunzip_count == 0) {
|
||||
if(filter == NULL)
|
||||
return(2);
|
||||
if(filter[0] == 0)
|
||||
return 2;
|
||||
}
|
||||
sprintf(xorriso->result_line,
|
||||
"-zisofs level=%d:block_size=%dk:by_magic=%s:ziso_used=%.f:osiz_used=%.f",
|
||||
xorriso->zlib_level, xorriso->zisofs_block_size / 1024,
|
||||
xorriso->zisofs_by_magic ? "on" : "off",
|
||||
(double) ziso_count, (double) osiz_count);
|
||||
sprintf(xorriso->result_line + strlen(xorriso->result_line),
|
||||
":gzip_used=%.f:gunzip_used=%.f\n",
|
||||
(double) gzip_count, (double) gunzip_count);
|
||||
Xorriso_status_result(xorriso, filter, fp, flag&2);
|
||||
return(1);
|
||||
}
|
||||
|
31
xorriso/filters.h
Normal file
31
xorriso/filters.h
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which operate on
|
||||
data filter objects.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_filters_includeD
|
||||
#define Xorriso_pvt_filters_includeD yes
|
||||
|
||||
int Xorriso_extf_new(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
char *path, int argc, char **argv, int behavior,
|
||||
char *suffix, char *name, int flag);
|
||||
|
||||
int Xorriso_extf_destroy(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
int flag);
|
||||
|
||||
int Xorriso_lookup_extf(struct XorrisO *xorriso, char *name,
|
||||
struct Xorriso_lsT **found_lst, int flag);
|
||||
|
||||
int Xorriso_rename_suffix(struct XorrisO *xorriso, IsoNode *node, char *suffix,
|
||||
char *show_path, char new_name[], int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_filters_includeD */
|
||||
|
1219
xorriso/findjob.c
Normal file
1219
xorriso/findjob.c
Normal file
File diff suppressed because it is too large
Load Diff
411
xorriso/findjob.h
Normal file
411
xorriso/findjob.h
Normal file
@ -0,0 +1,411 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of classes FindjoB, ExprnodE, ExprtesT
|
||||
which perform tree searches in libisofs or in POSIX filesystem.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_findjob_includeD
|
||||
#define Xorriso_pvt_findjob_includeD yes
|
||||
|
||||
|
||||
#define Xorriso_findjob_on_expR yes
|
||||
|
||||
#ifdef Xorriso_findjob_on_expR
|
||||
|
||||
/*
|
||||
A single Testnode.
|
||||
*/
|
||||
struct ExprtesT {
|
||||
|
||||
struct FindjoB *boss;
|
||||
|
||||
int invert; /* 0=normal 1=invert result */
|
||||
|
||||
/*
|
||||
0= -false (with invert : -true)
|
||||
1= -name char *arg1 (regex_t in *arg2)
|
||||
2= -type char *arg1
|
||||
3= -damaged
|
||||
4= -lba_range int *arg1 int *arg2
|
||||
5= -has_acl
|
||||
6= -has_xattr
|
||||
7= -has_aaip
|
||||
8= -has_filter
|
||||
9= -wanted_node IsoNode *arg1 (for internal use, arg1 not allocated)
|
||||
10= -pending_data
|
||||
11= -decision char *arg1 ("yes", "no")
|
||||
12= -prune
|
||||
13= -wholename char *arg1 (regex_t in *arg2)
|
||||
14= -has_any_xattr
|
||||
15= -has_md5
|
||||
16= -disk_name char *arg1 (regex_t in *arg2)
|
||||
17= -hidden int *arg1 (bit0=iso_rr, bit1=joliet)
|
||||
*/
|
||||
int test_type;
|
||||
|
||||
void *arg1;
|
||||
void *arg2;
|
||||
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
A computational node.
|
||||
A tree of these nodes forms the expression.
|
||||
Sequences of AND/OR operations form branches, brackets spawn new branches,
|
||||
NOT inverts node's test resp. subtree result.
|
||||
*/
|
||||
struct ExprnodE {
|
||||
|
||||
struct ExprnodE *up;
|
||||
|
||||
char origin[8];
|
||||
|
||||
/* Operators */
|
||||
int invert; /* 0=normal 1=invert own result (subtree or test, but not op) */
|
||||
|
||||
int assoc; /*
|
||||
0= left : compute own value, combine with left value,
|
||||
compute right value, combine with current value
|
||||
1= right: compute own value, compute right value,
|
||||
combine own and right, combine with left value
|
||||
*/
|
||||
|
||||
int use_shortcuts; /* 0= evaluate all tests of -and and -or,
|
||||
1= evaluate only until the combined result is known
|
||||
*/
|
||||
|
||||
struct ExprnodE *left;
|
||||
int left_op; /* 0=OR , 1=AND */
|
||||
|
||||
struct ExprnodE *right;
|
||||
int right_op; /* see left_op */
|
||||
|
||||
/* Brackets : a pointer to the first node in a subchain */
|
||||
struct ExprnodE *sub;
|
||||
|
||||
int is_if_then_else;
|
||||
struct ExprnodE *true_branch;
|
||||
struct ExprnodE *false_branch;
|
||||
|
||||
/* elementary test : if sub!=NULL , test is ignored */
|
||||
struct ExprtesT *test;
|
||||
|
||||
/* Result */
|
||||
int own_value;
|
||||
int composed_value;
|
||||
|
||||
};
|
||||
|
||||
|
||||
struct FindjoB {
|
||||
|
||||
char *start_path;
|
||||
|
||||
struct ExprnodE *test_tree;
|
||||
|
||||
struct ExprnodE *cursor;
|
||||
int invert; /* 0=normal 1=set invert-property for next new test node */
|
||||
int use_shortcuts;
|
||||
|
||||
/* 0= echo
|
||||
1= rm (also rmdir)
|
||||
2= rm_r
|
||||
>>> 3= mv target
|
||||
4= chown user
|
||||
5= chgrp group
|
||||
6= chmod mode_and mode_or
|
||||
7= alter_date type date
|
||||
8= lsdl
|
||||
9= chown_r user
|
||||
10= chgrp_r group
|
||||
11= chmod_r mode_and mode_or
|
||||
12= alter_date_r type date
|
||||
13= find
|
||||
14= compare disk_equivalent_of_start_path
|
||||
15= in_iso iso_rr_equivalent_of_start_path
|
||||
16= not_in_iso iso_rr_equiv
|
||||
17= update disk_equiv
|
||||
18= add_missing iso_rr_equiv
|
||||
19= empty_iso_dir iso_rr_equiv
|
||||
20= is_full_in_iso iso_rr_equiv
|
||||
21= report_damage
|
||||
22= report_lba
|
||||
23= internal: memorize path of last matching node in found_path
|
||||
24= getfacl
|
||||
25= setfacl access_acl default_acl
|
||||
26= getfattr
|
||||
27= setfattr
|
||||
28= set_filter name
|
||||
29= show_stream
|
||||
30= internal: count by xorriso->node_counter
|
||||
31= internal: register in xorriso->node_array
|
||||
32= internal: widen_hardlinks disk_equiv: update nodes marked in di_do_widen
|
||||
33= get_any_xattr
|
||||
34= get_md5
|
||||
35= check_md5
|
||||
36= make_md5
|
||||
37= mkisofs_r
|
||||
38= sort_weight number
|
||||
39= hide on|iso_rr|joliet|off
|
||||
40= estimate_size
|
||||
41= update_merge disk_equiv
|
||||
42= rm_merge
|
||||
43= clear_merge
|
||||
*/
|
||||
int action;
|
||||
int prune;
|
||||
|
||||
/* action specific parameters */
|
||||
char *target;
|
||||
char *text_2;
|
||||
uid_t user;
|
||||
gid_t group;
|
||||
mode_t mode_and, mode_or;
|
||||
int type; /* see Xorriso_set_time flag, also used as weight */
|
||||
time_t date;
|
||||
char *found_path;
|
||||
off_t estim_upper_size;
|
||||
off_t estim_lower_size;
|
||||
struct FindjoB *subjob;
|
||||
|
||||
/* Errors */
|
||||
char errmsg[4096];
|
||||
int errn; /*
|
||||
>0 = UNIX errno
|
||||
-1 = close_bracket: no bracket open
|
||||
-2 = binary operator or closing bracket expected
|
||||
-3 = unexpected binary operator or closing bracket
|
||||
-4 = unsupported command
|
||||
-5 = -then -elseif -else -endif without -if or at wrong place
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
int Exprnode_destroy(struct ExprnodE **fnode, int flag);
|
||||
|
||||
int Exprnode_tree_value(struct XorrisO *xorriso, struct ExprnodE *fnode,
|
||||
int left_value, void *node, char *name, char *path,
|
||||
struct stat *boss_stbuf, struct stat *stbuf, int flag);
|
||||
|
||||
|
||||
int Findjob_new(struct FindjoB **o, char *start_path, int flag);
|
||||
|
||||
int Findjob_destroy(struct FindjoB **o, int flag);
|
||||
|
||||
int Findjob_set_start_path(struct FindjoB *o, char *start_path, int flag);
|
||||
|
||||
int Findjob_get_start_path(struct FindjoB *o, char **start_path, int flag);
|
||||
|
||||
int Findjob_set_commit_filter_2(struct FindjoB *o, int flag);
|
||||
|
||||
int Findjob_set_lba_range(struct FindjoB *o, int start_lba, int count,
|
||||
int flag);
|
||||
|
||||
int Findjob_set_wanted_node(struct FindjoB *o, void *wanted_node, int flag);
|
||||
|
||||
/* @param value -1= only undamaged files, 1= only damaged files
|
||||
*/
|
||||
int Findjob_set_damage_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
int Findjob_set_test_hidden(struct FindjoB *o, int mode, int flag);
|
||||
|
||||
|
||||
int Findjob_set_decision(struct FindjoB *o, char *decision, int flag);
|
||||
|
||||
int Findjob_open_bracket(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_close_bracket(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_not(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_and(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_or(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_if(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_then(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_else(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_elseif(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_endif(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_test_2(struct XorrisO *xorriso, struct FindjoB *o,
|
||||
void *node, char *name, char *path,
|
||||
struct stat *boss_stbuf, struct stat *stbuf, int flag);
|
||||
|
||||
int Findjob_set_action_found_path(struct FindjoB *o, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_target(struct FindjoB *o, int action, char *target,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_ad(struct FindjoB *o, int type, time_t date, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chgrp(struct FindjoB *o, gid_t group, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chmod(struct FindjoB *o,
|
||||
mode_t mode_and, mode_t mode_or, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chown(struct FindjoB *o, uid_t user,int flag);
|
||||
|
||||
/* @param flag bit0= -wholename rather than -name
|
||||
*/
|
||||
int Findjob_set_name_expr(struct FindjoB *o, char *name_expr, int flag);
|
||||
|
||||
int Findjob_set_file_type(struct FindjoB *o, char file_type, int flag);
|
||||
|
||||
/* @param value -1= files without ACL, 1= only files with ACL
|
||||
*/
|
||||
int Findjob_set_acl_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
/* @param value -1= files without xattr, 1= only files with xattr
|
||||
@param flag bit0=-has_any_xattr rather than -has_xattr
|
||||
*/
|
||||
int Findjob_set_xattr_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
/* @param value -1= files without aaip, 1= only files with aaip
|
||||
*/
|
||||
int Findjob_set_aaip_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
/* @param value -1= files without filter, 1= files with filter
|
||||
*/
|
||||
int Findjob_set_filter_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
/* @param value -1= only without property, 1= only with property
|
||||
@param flag bit0= pseudo-test:
|
||||
if no operator is open, do nothing and return 2
|
||||
*/
|
||||
int Findjob_set_prop_filter(struct FindjoB *o, int test_type, int value,
|
||||
int flag);
|
||||
|
||||
/* @param value -1= true, 1= false
|
||||
@param flag bit0= pseudo-test:
|
||||
if no operator is open, do nothing and return 2
|
||||
*/
|
||||
int Findjob_set_false(struct FindjoB *o, int value, int flag);
|
||||
|
||||
int Findjob_set_prune(struct FindjoB *o, int flag);
|
||||
|
||||
|
||||
int Findjob_set_action_subjob(struct FindjoB *o, int action,
|
||||
struct FindjoB *subjob, int flag);
|
||||
|
||||
int Findjob_set_action_text_2(struct FindjoB *o, int action, char *target,
|
||||
char* text_2, int flag);
|
||||
|
||||
int Findjob_set_action_type(struct FindjoB *o, int action, int type, int flag);
|
||||
|
||||
|
||||
int Findjob_get_action(struct FindjoB *o, int flag);
|
||||
|
||||
int Findjob_get_action_parms(struct FindjoB *o, char **target, char **text_2,
|
||||
uid_t *user, gid_t *group,
|
||||
mode_t *mode_and, mode_t *mode_or,
|
||||
int *type, time_t *date, struct FindjoB **subjob,
|
||||
int flag);
|
||||
|
||||
int Findjob_set_found_path(struct FindjoB *o, char *path, int flag);
|
||||
|
||||
int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
|
||||
|
||||
#else /* Xorriso_findjob_on_expR */
|
||||
|
||||
|
||||
struct FindjoB;
|
||||
|
||||
|
||||
int Findjob_new(struct FindjoB **o, char *start_path, int flag);
|
||||
|
||||
int Findjob_destroy(struct FindjoB **job, int flag);
|
||||
|
||||
|
||||
/* @return 0=no match , 1=match , <0 = error
|
||||
*/
|
||||
int Findjob_test(struct FindjoB *job, char *name,
|
||||
struct stat *boss_stbuf, struct stat *stbuf,
|
||||
int depth, int flag);
|
||||
|
||||
/* @return <0 error, >=0 see xorriso.c struct FindjoB.action
|
||||
*/
|
||||
int Findjob_get_action(struct FindjoB *o, int flag);
|
||||
|
||||
/* @return <0 error, >=0 see xorriso.c struct FindjoB.action
|
||||
*/
|
||||
int Findjob_get_action_parms(struct FindjoB *o, char **target, char **text_2,
|
||||
uid_t *user, gid_t *group,
|
||||
mode_t *mode_and, mode_t *mode_or,
|
||||
int *type, time_t *date, struct FindjoB **subjob,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_target(struct FindjoB *o, int action, char *target,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chgrp(struct FindjoB *o, gid_t group, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chmod(struct FindjoB *o,
|
||||
mode_t mode_and, mode_t mode_or, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_ad(struct FindjoB *o, int type, time_t date, int flag);
|
||||
|
||||
int Findjob_set_start_path(struct FindjoB *o, char *start_path, int flag);
|
||||
|
||||
int Findjob_set_action_found_path(struct FindjoB *o, int flag);
|
||||
|
||||
int Findjob_get_start_path(struct FindjoB *o, char **start_path, int flag);
|
||||
|
||||
int Findjob_set_lba_range(struct FindjoB *o, int start_lba, int count,
|
||||
int flag);
|
||||
|
||||
int Findjob_get_lba_damage_filter(struct FindjoB *o, int *start_lba,
|
||||
int *end_lba, int *damage_filter, int flag);
|
||||
|
||||
int Findjob_get_commit_filter(struct FindjoB *o, int *commit_filter, int flag);
|
||||
|
||||
int Findjob_get_acl_filter(struct FindjoB *o, int *acl_filter, int flag);
|
||||
|
||||
int Findjob_get_xattr_filter(struct FindjoB *o, int *xattr_filter, int flag);
|
||||
|
||||
int Findjob_get_aaip_filter(struct FindjoB *o, int *aaip_filter, int flag);
|
||||
|
||||
int Findjob_get_filter_filter(struct FindjoB *o, int *value, int flag);
|
||||
|
||||
int Findjob_set_wanted_node(struct FindjoB *o, void *wanted_node, int flag);
|
||||
|
||||
int Findjob_get_wanted_node(struct FindjoB *o, void **wanted_node, int flag);
|
||||
|
||||
int Findjob_set_found_path(struct FindjoB *o, char *path, int flag);
|
||||
|
||||
int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
|
||||
|
||||
#endif /* ! Xorriso_findjob_on_expR */
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_findjob_includeD */
|
||||
|
1177
xorriso/iso_img.c
Normal file
1177
xorriso/iso_img.c
Normal file
File diff suppressed because it is too large
Load Diff
44
xorriso/iso_img.h
Normal file
44
xorriso/iso_img.h
Normal file
@ -0,0 +1,44 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which operate on ISO images
|
||||
and their global properties.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_iso_img_includeD
|
||||
#define Xorriso_pvt_iso_img_includeD yes
|
||||
|
||||
|
||||
int Xorriso_update_volid(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_record_boot_info(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_assert_volid(struct XorrisO *xorriso, int msc1, int flag);
|
||||
|
||||
int Xorriso_is_isohybrid(struct XorrisO *xorriso, IsoFile *bootimg_node,
|
||||
int flag);
|
||||
|
||||
int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path,
|
||||
char *bin_path, int platform_id,
|
||||
int patch_isolinux, int emul, off_t load_size,
|
||||
unsigned char *id_string,
|
||||
unsigned char *selection_crit, char *form,
|
||||
char *filter, FILE *fp, int flag);
|
||||
|
||||
int Xorriso__append_boot_params(char *line, ElToritoBootImage *bootimg,
|
||||
int flag);
|
||||
|
||||
int Xorriso_get_volume(struct XorrisO *xorriso, IsoImage **volume,
|
||||
int flag);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_iso_img_includeD */
|
||||
|
3456
xorriso/iso_manip.c
Normal file
3456
xorriso/iso_manip.c
Normal file
File diff suppressed because it is too large
Load Diff
74
xorriso/iso_manip.h
Normal file
74
xorriso/iso_manip.h
Normal file
@ -0,0 +1,74 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which manipulate the
|
||||
libisofs tree model.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_iso_manip_includeD
|
||||
#define Xorriso_pvt_iso_manip_includeD yes
|
||||
|
||||
|
||||
int Xorriso_transfer_properties(struct XorrisO *xorriso, struct stat *stbuf,
|
||||
char *disk_path, IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_graft_split(struct XorrisO *xorriso, IsoImage *volume,
|
||||
IsoDir *dir, char *disk_path, char *img_name,
|
||||
char *nominal_source, char *nominal_target,
|
||||
off_t size, IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
|
||||
IsoDir *dir, char *disk_path, char *img_name,
|
||||
char *nominal_source, char *nominal_target,
|
||||
off_t offset, off_t cut_size,
|
||||
IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_add_tree(struct XorrisO *xorriso, IsoDir *dir,
|
||||
char *img_dir_path, char *disk_dir_path,
|
||||
struct LinkiteM *link_stack, int flag);
|
||||
|
||||
int Xorriso_copy_implicit_properties(struct XorrisO *xorriso, IsoDir *dir,
|
||||
char *full_img_path, char *img_path, char *full_disk_path, int flag);
|
||||
|
||||
int Xorriso_mkisofs_lower_r(struct XorrisO *xorriso, IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_widen_hardlink(struct XorrisO *xorriso, void * boss_iter,
|
||||
IsoNode *node,
|
||||
char *abs_path, char *iso_prefix, char *disk_prefix,
|
||||
int flag);
|
||||
|
||||
|
||||
int Xorriso_cannot_create_iter(struct XorrisO *xorriso, int iso_error,
|
||||
int flag);
|
||||
|
||||
int Xorriso_findi_iter(struct XorrisO *xorriso, IsoDir *dir_node, off_t *mem,
|
||||
IsoDirIter **iter,
|
||||
IsoNode ***node_array, int *node_count, int *node_idx,
|
||||
IsoNode **iterated_node, int flag);
|
||||
|
||||
int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
IsoDirIter *boss_iter, off_t boss_mem,
|
||||
char *abs_path, char *show_path,
|
||||
IsoNode *node, int depth, int flag);
|
||||
|
||||
int Xorriso_findi_headline(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
int flag);
|
||||
|
||||
int Xorriso_findi_sorted(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
off_t boss_mem, int filec, char **filev, int flag);
|
||||
|
||||
int Xorriso_all_node_array(struct XorrisO *xorriso, int addon_nodes, int flag);
|
||||
|
||||
|
||||
int Xorriso__file_start_lba(IsoNode *node, int *lba, int flag);
|
||||
|
||||
int Xorriso__mark_update_xinfo(void *data, int flag);
|
||||
int Xorriso__mark_update_cloner(void *old_data, void **new_data, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_iso_manip_includeD */
|
||||
|
2263
xorriso/iso_tree.c
Normal file
2263
xorriso/iso_tree.c
Normal file
File diff suppressed because it is too large
Load Diff
97
xorriso/iso_tree.h
Normal file
97
xorriso/iso_tree.h
Normal file
@ -0,0 +1,97 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which access nodes of the
|
||||
libisofs tree model.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_iso_tree_includeD
|
||||
#define Xorriso_pvt_iso_tree_includeD yes
|
||||
|
||||
|
||||
#define LIBISO_ISDIR(node) (iso_node_get_type(node) == LIBISO_DIR)
|
||||
#define LIBISO_ISREG(node) (iso_node_get_type(node) == LIBISO_FILE)
|
||||
#define LIBISO_ISLNK(node) (iso_node_get_type(node) == LIBISO_SYMLINK)
|
||||
#define LIBISO_ISCHR(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
|
||||
S_ISCHR(iso_node_get_mode(node)))
|
||||
#define LIBISO_ISBLK(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
|
||||
S_ISBLK(iso_node_get_mode(node)))
|
||||
#define LIBISO_ISFIFO(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
|
||||
S_ISFIFO(iso_node_get_mode(node)))
|
||||
#define LIBISO_ISSOCK(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
|
||||
S_ISSOCK(iso_node_get_mode(node)))
|
||||
#define LIBISO_ISBOOT(node) (iso_node_get_type(node) == LIBISO_BOOT)
|
||||
|
||||
|
||||
int Xorriso_node_from_path(struct XorrisO *xorriso, IsoImage *volume,
|
||||
char *path, IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_get_node_by_path(struct XorrisO *xorriso,
|
||||
char *in_path, char *eff_path,
|
||||
IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_dir_from_path(struct XorrisO *xorriso, char *purpose,
|
||||
char *path, IsoDir **dir_node, int flag);
|
||||
|
||||
int Xorriso_node_get_dev(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *path, dev_t *dev, int flag);
|
||||
|
||||
int Xorriso_fake_stbuf(struct XorrisO *xorriso, char *path, struct stat *stbuf,
|
||||
IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_node_is_valid(struct XorrisO *xorriso, IsoNode *in_node, int flag);
|
||||
|
||||
int Xorriso_path_from_node(struct XorrisO *xorriso, IsoNode *in_node,
|
||||
char path[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_path_from_lba(struct XorrisO *xorriso, IsoNode *node, int lba,
|
||||
char path[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_get_attr_value(struct XorrisO *xorriso, void *in_node, char *path,
|
||||
char *name, size_t *value_length, char **value, int flag);
|
||||
|
||||
int Xorriso_stream_type(struct XorrisO *xorriso, IsoNode *node,
|
||||
IsoStream *stream, char type_text[], int flag);
|
||||
|
||||
|
||||
int Xorriso_show_du_subs(struct XorrisO *xorriso, IsoDir *dir_node,
|
||||
char *abs_path, char *rel_path, off_t *size,
|
||||
off_t boss_mem, int flag);
|
||||
|
||||
int Xorriso_sorted_dir_i(struct XorrisO *xorriso, IsoDir *dir_node,
|
||||
int *filec, char ***filev, off_t boss_mem, int flag);
|
||||
|
||||
int Xorriso_obtain_pattern_files_i(
|
||||
struct XorrisO *xorriso, char *wd, IsoDir *dir,
|
||||
int *filec, char **filev, int count_limit, off_t *mem,
|
||||
int *dive_count, int flag);
|
||||
|
||||
int Xorriso__start_end_lbas(IsoNode *node,
|
||||
int *lba_count, int **start_lbas, int **end_lbas,
|
||||
off_t *size, int flag);
|
||||
|
||||
int Xorriso__file_start_lba(IsoNode *node,
|
||||
int *lba, int flag);
|
||||
|
||||
int Xorriso_file_eval_damage(struct XorrisO *xorriso, IsoNode *node,
|
||||
off_t *damage_start, off_t *damage_end,
|
||||
int flag);
|
||||
|
||||
int Xorriso_report_lba(struct XorrisO *xorriso, char *show_path,
|
||||
IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_report_damage(struct XorrisO *xorriso, char *show_path,
|
||||
IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_getfname(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
int Xorriso_retrieve_disk_path(struct XorrisO *xorriso, IsoNode *node,
|
||||
char disk_path[SfileadrL], int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_iso_tree_includeD */
|
||||
|
772
xorriso/lib_mgt.c
Normal file
772
xorriso/lib_mgt.c
Normal file
@ -0,0 +1,772 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which manage the relation between xorriso
|
||||
and the libraries: libburn, libisofs, libisoburn.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#else
|
||||
#ifdef HAVE_INTTYPES_H
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* for -charset */
|
||||
#include <iconv.h>
|
||||
#include <langinfo.h>
|
||||
|
||||
#ifdef Xorriso_standalonE
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
#include "../libjte/libjte.h"
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
#include <libjte/libjte.h>
|
||||
#endif
|
||||
|
||||
#endif /* ! Xorriso_standalonE */
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#include "lib_mgt.h"
|
||||
#include "iso_manip.h"
|
||||
|
||||
|
||||
int Xorriso_abort(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= burn_abort(4440, burn_abort_pacifier, "xorriso : ");
|
||||
if(ret<=0) {
|
||||
fprintf(stderr,
|
||||
"\nxorriso : ABORT : Cannot cancel burn session and release drive.\n");
|
||||
return(0);
|
||||
}
|
||||
fprintf(stderr,
|
||||
"xorriso : ABORT : Drive is released and library is shut down now.\n");
|
||||
fprintf(stderr,
|
||||
"xorriso : ABORT : Program done. Even if you do not see a shell prompt.\n");
|
||||
fprintf(stderr, "\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= asynchronous handling (else catch thread, wait, and exit)
|
||||
bit1= dealing with MMC drive in critical state
|
||||
behavior 2 -> behavior 1
|
||||
*/
|
||||
int Xorriso_set_signal_handling(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
char *handler_prefix= NULL;
|
||||
int behavior, mode;
|
||||
|
||||
behavior= Xorriso__get_signal_behavior(0);
|
||||
if(behavior == 0)
|
||||
return(2);
|
||||
if(behavior == 2 && !(flag & 2))
|
||||
mode= 1;
|
||||
else if(behavior == 3)
|
||||
mode= 2;
|
||||
else
|
||||
mode= (flag & 1) * 0x30;
|
||||
handler_prefix= calloc(strlen(xorriso->progname)+3+1, 1);
|
||||
if(handler_prefix==NULL) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot allocate memory for setting signal handler");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* <<< */
|
||||
sprintf(xorriso->info_text, "burn_set_signal_handling(%d)", mode);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
|
||||
sprintf(handler_prefix, "%s : ", xorriso->progname);
|
||||
burn_set_signal_handling(handler_prefix, NULL, mode);
|
||||
free(handler_prefix);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, major, minor, micro;
|
||||
char *queue_sev, *print_sev, reason[1024];
|
||||
struct iso_zisofs_ctrl zisofs_ctrl= {0, 6, 15};
|
||||
|
||||
|
||||
/* First an ugly compile time check for header version compatibility.
|
||||
If everthing matches, then no C code is produced. In case of mismatch,
|
||||
intentionally faulty C code will be inserted.
|
||||
*/
|
||||
|
||||
/* The minimum requirement of xorriso towards the libisoburn header
|
||||
at compile time is defined in xorriso/xorrisoburn.h
|
||||
xorriso_libisoburn_req_major
|
||||
xorriso_libisoburn_req_minor
|
||||
xorriso_libisoburn_req_micro
|
||||
It gets compared against the version macros in libburn/libburn.h :
|
||||
isoburn_header_version_major
|
||||
isoburn_header_version_minor
|
||||
isoburn_header_version_micro
|
||||
If the header is too old then the following code shall cause failure of
|
||||
cdrskin compilation rather than to allow production of a program with
|
||||
unpredictable bugs or memory corruption.
|
||||
The compiler messages supposed to appear in this case are:
|
||||
error: 'LIBISOBURN_MISCONFIGURATION' undeclared (first use in this function)
|
||||
error: 'INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libisoburn_dot_h_TOO_OLD__SEE_xorrisoburn_dot_c' undeclared (first use in this function)
|
||||
error: 'LIBISOBURN_MISCONFIGURATION_' undeclared (first use in this function)
|
||||
*/
|
||||
/* The indendation is an advise of man gcc to help old compilers ignoring */
|
||||
#if xorriso_libisoburn_req_major > isoburn_header_version_major
|
||||
#define Isoburn_libisoburn_dot_h_too_olD 1
|
||||
#endif
|
||||
#if xorriso_libisoburn_req_major == isoburn_header_version_major && xorriso_libisoburn_req_minor > isoburn_header_version_minor
|
||||
#define Isoburn_libisoburn_dot_h_too_olD 1
|
||||
#endif
|
||||
#if xorriso_libisoburn_req_minor == isoburn_header_version_minor && xorriso_libisoburn_req_micro > isoburn_header_version_micro
|
||||
#define Isoburn_libisoburn_dot_h_too_olD 1
|
||||
#endif
|
||||
|
||||
#ifdef Isoburn_libisoburn_dot_h_too_olD
|
||||
LIBISOBURN_MISCONFIGURATION = 0;
|
||||
INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libisoburn_dot_h_TOO_OLD__SEE_xorrisoburn_dot_c = 0;
|
||||
LIBISOBURN_MISCONFIGURATION_ = 0;
|
||||
#endif
|
||||
|
||||
/* End of ugly compile time test (scroll up for explanation) */
|
||||
|
||||
reason[0]= 0;
|
||||
ret= isoburn_initialize(reason, 0);
|
||||
if(ret==0) {
|
||||
sprintf(xorriso->info_text, "Cannot initialize libraries");
|
||||
if(reason[0])
|
||||
sprintf(xorriso->info_text+strlen(xorriso->info_text),
|
||||
". Reason given:\n%s", reason);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(0);
|
||||
}
|
||||
ret= isoburn_is_compatible(isoburn_header_version_major,
|
||||
isoburn_header_version_minor,
|
||||
isoburn_header_version_micro, 0);
|
||||
if(ret<=0) {
|
||||
isoburn_version(&major, &minor, µ);
|
||||
sprintf(xorriso->info_text,
|
||||
"libisoburn version too old: %d.%d.%d . Need at least: %d.%d.%d .\n",
|
||||
major, minor, micro,
|
||||
isoburn_header_version_major, isoburn_header_version_minor,
|
||||
isoburn_header_version_micro);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
xorriso->libs_are_started= 1;
|
||||
|
||||
queue_sev= "ALL";
|
||||
if(xorriso->library_msg_direct_print) {
|
||||
|
||||
/* >>> need option for controlling this in XorrisO.
|
||||
See also Xorriso_msgs_submit */;
|
||||
|
||||
print_sev= xorriso->report_about_text;
|
||||
} else
|
||||
print_sev= "NEVER";
|
||||
|
||||
iso_set_msgs_severities(queue_sev, print_sev, "libsofs : ");
|
||||
burn_msgs_set_severities(queue_sev, print_sev, "libburn : ");
|
||||
|
||||
/* ??? >>> do we want united queues ? */
|
||||
/* burn_set_messenger(iso_get_messenger()); */
|
||||
|
||||
isoburn_set_msgs_submit(Xorriso_msgs_submit_void, (void *) xorriso,
|
||||
(3<<2) | 128 , 0);
|
||||
|
||||
ret= Xorriso_set_signal_handling(xorriso, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
ret = iso_zisofs_get_params(&zisofs_ctrl, 0);
|
||||
if (ret == 1) {
|
||||
xorriso->zisofs_block_size= xorriso->zisofs_block_size_default=
|
||||
(1 << zisofs_ctrl.block_size_log2);
|
||||
xorriso->zlib_level= xorriso->zlib_level_default=
|
||||
zisofs_ctrl.compression_level;
|
||||
}
|
||||
|
||||
iso_node_xinfo_make_clonable(Xorriso__mark_update_xinfo,
|
||||
Xorriso__mark_update_cloner, 0);
|
||||
|
||||
/* Second initialization. This time with libs. */
|
||||
Xorriso_preparer_string(xorriso, xorriso->preparer_id, 0);
|
||||
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(reason[0]) {
|
||||
sprintf(xorriso->info_text, "%s", reason);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
}
|
||||
strcpy(xorriso->info_text, "Using ");
|
||||
strncat(xorriso->info_text, burn_scsi_transport_id(0), 1024);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= global shutdown of libraries */
|
||||
int Xorriso_detach_libraries(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
Xorriso_give_up_drive(xorriso, 3);
|
||||
if(xorriso->in_volset_handle!=NULL) { /* standalone image */
|
||||
iso_image_unref((IsoImage *) xorriso->in_volset_handle);
|
||||
xorriso->in_volset_handle= NULL;
|
||||
Sectorbitmap_destroy(&(xorriso->in_sector_map), 0);
|
||||
Xorriso_destroy_di_array(xorriso, 0);
|
||||
Xorriso_destroy_hln_array(xorriso, 0);
|
||||
xorriso->boot_count= 0;
|
||||
}
|
||||
if(flag&1) {
|
||||
if(xorriso->libs_are_started==0)
|
||||
return(0);
|
||||
isoburn_finish();
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= suppress messages below UPDATE
|
||||
bit1= suppress messages below FAILURE
|
||||
*/
|
||||
int Xorriso_set_image_severities(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
char *queue_sev, *print_sev;
|
||||
|
||||
if(flag&2)
|
||||
queue_sev= "FAILURE";
|
||||
else if(flag&1)
|
||||
queue_sev= "UPDATE";
|
||||
else
|
||||
queue_sev= "ALL";
|
||||
if(xorriso->library_msg_direct_print)
|
||||
print_sev= xorriso->report_about_text;
|
||||
else
|
||||
print_sev= "NEVER";
|
||||
iso_set_msgs_severities(queue_sev, print_sev, "libisofs : ");
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0=prepare for a burn run */
|
||||
int Xorriso_set_abort_severity(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, abort_on_number;
|
||||
char *sev_text;
|
||||
static int note_number= -1, failure_number= -1;
|
||||
|
||||
if(note_number==-1)
|
||||
Xorriso__text_to_sev("NOTE", ¬e_number, 0);
|
||||
if(failure_number==-1)
|
||||
Xorriso__text_to_sev("FAILURE", &failure_number, 0);
|
||||
sev_text= xorriso->abort_on_text;
|
||||
ret= Xorriso__text_to_sev(xorriso->abort_on_text, &abort_on_number, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
if(abort_on_number<note_number)
|
||||
sev_text= "NOTE";
|
||||
else if(abort_on_number>failure_number)
|
||||
sev_text= "FAILURE";
|
||||
ret= iso_set_abort_severity(sev_text);
|
||||
return(ret>=0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_report_lib_versions(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int major, minor, micro;
|
||||
int req_major, req_minor, req_micro;
|
||||
|
||||
iso_lib_version(&major, &minor, µ);
|
||||
isoburn_libisofs_req(&req_major, &req_minor, &req_micro);
|
||||
sprintf(xorriso->result_line,
|
||||
"libisofs in use : %d.%d.%d (min. %d.%d.%d)\n",
|
||||
major, minor, micro, req_major, req_minor, req_micro);
|
||||
Xorriso_result(xorriso, 0);
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
libjte__version(&major, &minor, µ);
|
||||
isoburn_libjte_req(&req_major, &req_minor, &req_micro);
|
||||
sprintf(xorriso->result_line,
|
||||
"libjte in use : %d.%d.%d (min. %d.%d.%d)\n",
|
||||
major, minor, micro, req_major, req_minor, req_micro);
|
||||
Xorriso_result(xorriso, 0);
|
||||
#endif
|
||||
|
||||
burn_version(&major, &minor, µ);
|
||||
isoburn_libburn_req(&req_major, &req_minor, &req_micro);
|
||||
sprintf(xorriso->result_line,
|
||||
"libburn in use : %d.%d.%d (min. %d.%d.%d)\n",
|
||||
major, minor, micro, req_major, req_minor, req_micro);
|
||||
Xorriso_result(xorriso, 0);
|
||||
strcpy(xorriso->result_line, "libburn OS adapter: ");
|
||||
strncat(xorriso->result_line, burn_scsi_transport_id(0), 1024);
|
||||
strcat(xorriso->result_line, "\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
isoburn_version(&major, &minor, µ);
|
||||
sprintf(xorriso->result_line,
|
||||
"libisoburn in use : %d.%d.%d (min. %d.%d.%d)\n",
|
||||
major, minor, micro,
|
||||
isoburn_header_version_major, isoburn_header_version_minor,
|
||||
isoburn_header_version_micro);
|
||||
Xorriso_result(xorriso, 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__sev_to_text(int severity, char **severity_name,
|
||||
int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= iso_sev_to_text(severity, severity_name);
|
||||
if(ret>0)
|
||||
return(ret);
|
||||
ret= burn_sev_to_text(severity, severity_name, 0);
|
||||
if(ret>0)
|
||||
return(ret);
|
||||
*severity_name= "";
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__text_to_sev(char *severity_name, int *severity_number, int flag)
|
||||
{
|
||||
int ret= 1;
|
||||
|
||||
ret= iso_text_to_sev(severity_name, severity_number);
|
||||
if(ret>0)
|
||||
return(ret);
|
||||
ret= burn_text_to_sev(severity_name, severity_number, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= report libisofs error text
|
||||
bit1= victim is disk_path
|
||||
bit2= do not inquire libisofs, report msg_text and min_severity
|
||||
*/
|
||||
int Xorriso_report_iso_error(struct XorrisO *xorriso, char *victim,
|
||||
int iso_error_code, char msg_text[], int os_errno,
|
||||
char min_severity[], int flag)
|
||||
{
|
||||
int error_code, iso_sev, min_sev, ret;
|
||||
char *sev_text_pt, *msg_text_pt= NULL;
|
||||
char *sfe= NULL;
|
||||
static int sorry_sev= -1;
|
||||
|
||||
Xorriso_alloc_meM(sfe, char, 6 * SfileadrL);
|
||||
|
||||
if(sorry_sev<0)
|
||||
Xorriso__text_to_sev("SORRY", &sorry_sev, 0);
|
||||
|
||||
if(flag&4) {
|
||||
error_code= 0x00050000;
|
||||
Xorriso__text_to_sev(min_severity, &iso_sev, 0);
|
||||
} else {
|
||||
error_code= iso_error_get_code(iso_error_code);
|
||||
if(error_code < 0x00030000 || error_code >= 0x00040000)
|
||||
error_code= (error_code & 0xffff) | 0x00050000;
|
||||
if(flag&1)
|
||||
msg_text_pt= (char *) iso_error_to_msg(iso_error_code);
|
||||
iso_sev= iso_error_get_severity(iso_error_code);
|
||||
}
|
||||
if(msg_text_pt==NULL)
|
||||
msg_text_pt= msg_text;
|
||||
|
||||
if(iso_sev >= sorry_sev && (flag & 2) && victim[0])
|
||||
Xorriso_msgs_submit(xorriso, 0, victim, 0, "ERRFILE", 0);
|
||||
sev_text_pt= min_severity;
|
||||
Xorriso__text_to_sev(min_severity, &min_sev, 0);
|
||||
if(min_sev < iso_sev && !(flag&4))
|
||||
Xorriso__sev_to_text(iso_sev, &sev_text_pt, 0);
|
||||
strcpy(sfe, msg_text_pt);
|
||||
if(victim[0]) {
|
||||
strcat(sfe, ": ");
|
||||
Text_shellsafe(victim, sfe+strlen(sfe), 0);
|
||||
}
|
||||
ret= Xorriso_msgs_submit(xorriso, error_code, sfe, os_errno, sev_text_pt, 4);
|
||||
ex:;
|
||||
Xorriso_free_meM(sfe);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_get_local_charset(struct XorrisO *xorriso, char **name, int flag)
|
||||
{
|
||||
(*name)= iso_get_local_charset(0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_set_local_charset(struct XorrisO *xorriso, char *name, int flag)
|
||||
{
|
||||
int ret;
|
||||
char *nl_charset;
|
||||
iconv_t iconv_ret= (iconv_t) -1;
|
||||
|
||||
nl_charset= nl_langinfo(CODESET);
|
||||
if(name == NULL)
|
||||
name= nl_charset;
|
||||
|
||||
if(name != NULL) {
|
||||
iconv_ret= iconv_open(nl_charset, name);
|
||||
if(iconv_ret == (iconv_t) -1)
|
||||
goto cannot;
|
||||
else
|
||||
iconv_close(iconv_ret);
|
||||
}
|
||||
ret= iso_set_local_charset(name, 0);
|
||||
if(ret <= 0) {
|
||||
cannot:;
|
||||
sprintf(xorriso->info_text,
|
||||
"-local_charset: Cannot assume as local character set: ");
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
return(0);
|
||||
}
|
||||
sprintf(xorriso->info_text, "Local character set is now assumed as: ");
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_process_msg_queues(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, error_code= 0, os_errno= 0, count= 0, pass, imgid, tunneled;
|
||||
int name_prefix_code;
|
||||
char severity[80];
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
char *msg;
|
||||
#endif
|
||||
|
||||
if(!xorriso->libs_are_started)
|
||||
return(1);
|
||||
for(pass= 0; pass< 3; pass++) {
|
||||
while(1) {
|
||||
tunneled= 0;
|
||||
if(pass==0) {
|
||||
|
||||
ret= 0;
|
||||
#ifdef Xorriso_with_libjtE
|
||||
if(xorriso->libjte_handle != NULL) {
|
||||
msg= libjte_get_next_message(xorriso->libjte_handle);
|
||||
if(msg != NULL) {
|
||||
sprintf(xorriso->info_text, "%1.4095s", msg);
|
||||
free(msg);
|
||||
strcpy(severity, "NOTE");
|
||||
error_code= 0;
|
||||
os_errno= 0;
|
||||
ret= 1;
|
||||
}
|
||||
}
|
||||
#endif /* Xorriso_with_libjtE */
|
||||
|
||||
} else if(pass==1)
|
||||
ret= iso_obtain_msgs("ALL", &error_code, &imgid,
|
||||
xorriso->info_text, severity);
|
||||
else {
|
||||
ret= burn_msgs_obtain("ALL", &error_code, xorriso->info_text, &os_errno,
|
||||
severity);
|
||||
if((error_code>=0x00030000 && error_code<0x00040000) ||
|
||||
(error_code>=0x00050000 && error_code<0x00060000))
|
||||
tunneled= -1; /* "libisofs:" */
|
||||
else if(error_code>=0x00060000 && error_code<0x00070000)
|
||||
tunneled= 1; /* "libisoburn:" */
|
||||
}
|
||||
if(ret<=0)
|
||||
break;
|
||||
|
||||
/* <<< tunneled MISHAP from libisoburn through libburn
|
||||
or well known error codes of MISHAP events
|
||||
With libburn-0.4.4 this is not necessary */
|
||||
if(error_code==0x5ff73 || error_code==0x3ff73 ||
|
||||
error_code==0x3feb9 || error_code==0x3feb2)
|
||||
strcpy(severity, "MISHAP");
|
||||
else if(error_code==0x51001)
|
||||
strcpy(severity, "ERRFILE");
|
||||
|
||||
if(pass == 0)
|
||||
name_prefix_code= 0;
|
||||
else
|
||||
name_prefix_code= pass + tunneled;
|
||||
Xorriso_msgs_submit(xorriso, error_code, xorriso->info_text, os_errno,
|
||||
severity, name_prefix_code << 2);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if(xorriso->library_msg_direct_print && count>0) {
|
||||
sprintf(xorriso->info_text," (%d library messages repeated by xorriso)\n",
|
||||
count);
|
||||
Xorriso_info(xorriso, 0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_md5_start(struct XorrisO *xorriso, void **ctx, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= iso_md5_start(ctx);
|
||||
if(ret == 1)
|
||||
return(1);
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_md5_compute(struct XorrisO *xorriso, void *ctx,
|
||||
char *data, int datalen, int flag)
|
||||
{
|
||||
iso_md5_compute(ctx, data, datalen);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_md5_end(struct XorrisO *xorriso, void **ctx, char md5[16],
|
||||
int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= iso_md5_end(ctx, md5);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= avoid library calls
|
||||
*/
|
||||
int Xorriso_preparer_string(struct XorrisO *xorriso, char xorriso_id[129],
|
||||
int flag)
|
||||
{
|
||||
int major, minor, micro;
|
||||
|
||||
xorriso_id[0]= 0;
|
||||
sprintf(xorriso_id, "XORRISO-%d.%d.%d ",
|
||||
Xorriso_header_version_majoR, Xorriso_header_version_minoR,
|
||||
Xorriso_header_version_micrO);
|
||||
if(strlen(xorriso_id) + strlen(Xorriso_timestamP) < 128)
|
||||
strcat(xorriso_id, Xorriso_timestamP);
|
||||
if(flag & 1)
|
||||
return(1);
|
||||
isoburn_version(&major, &minor, µ);
|
||||
if(strlen(xorriso_id) < 100)
|
||||
sprintf(xorriso_id + strlen(xorriso_id),
|
||||
", LIBISOBURN-%d.%d.%d", major, minor, micro);
|
||||
iso_lib_version(&major, &minor, µ);
|
||||
if(strlen(xorriso_id) < 100)
|
||||
sprintf(xorriso_id + strlen(xorriso_id),
|
||||
", LIBISOFS-%d.%d.%d", major, minor, micro);
|
||||
burn_version(&major, &minor, µ);
|
||||
if(strlen(xorriso_id) < 100)
|
||||
sprintf(xorriso_id + strlen(xorriso_id),
|
||||
", LIBBURN-%d.%d.%d", major, minor, micro);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
|
||||
int Xorriso_assert_jte_handle(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(xorriso->libjte_handle == NULL) {
|
||||
ret= libjte_new(&(xorriso->libjte_handle), 0);
|
||||
if(ret <= 0 || xorriso->libjte_handle == NULL) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-jigdo: Failed to create libjte environment object");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(-1);
|
||||
}
|
||||
/* no stderr, no exit() */
|
||||
libjte_set_error_behavior(xorriso->libjte_handle, 0, 0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
#endif /* Xorriso_with_libjtE */
|
||||
|
||||
|
||||
int Xorriso_jigdo_interpreter(struct XorrisO *xorriso, char *aspect, char *arg,
|
||||
int flag)
|
||||
{
|
||||
|
||||
#ifdef Xorriso_with_libjtE
|
||||
|
||||
int ret, num;
|
||||
struct libjte_env *jte;
|
||||
char *msg = NULL;
|
||||
|
||||
if(strcmp(aspect, "clear") == 0) {
|
||||
if(xorriso->libjte_handle != NULL)
|
||||
libjte_destroy(&(xorriso->libjte_handle));
|
||||
Xorriso_lst_destroy_all(&(xorriso->jigdo_params), 0);
|
||||
Xorriso_lst_destroy_all(&(xorriso->jigdo_values), 0);
|
||||
xorriso->libjte_params_given= 0;
|
||||
return(1);
|
||||
}
|
||||
ret= Xorriso_assert_jte_handle(xorriso, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
jte= xorriso->libjte_handle;
|
||||
|
||||
if(strcmp(aspect, "verbose") == 0) {
|
||||
if(strcmp(arg, "on") == 0) {
|
||||
libjte_set_verbose(jte, 1);
|
||||
/* Direct libjte messages to stderr, rather than message list */
|
||||
libjte_set_error_behavior(xorriso->libjte_handle, 1, 0);
|
||||
xorriso->libjte_params_given|= 2;
|
||||
} else if(strcmp(arg, "off") == 0) {
|
||||
libjte_set_verbose(jte, 0);
|
||||
libjte_set_error_behavior(xorriso->libjte_handle, 0, 0);
|
||||
xorriso->libjte_params_given&= ~2;
|
||||
} else
|
||||
goto bad_arg;
|
||||
} else if(strcmp(aspect, "template_path") == 0 ||
|
||||
strcmp(aspect, "-jigdo-template") == 0) {
|
||||
ret= libjte_set_template_path(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 4;
|
||||
} else if(strcmp(aspect, "jigdo_path") == 0 ||
|
||||
strcmp(aspect, "-jigdo-jigdo") == 0) {
|
||||
ret= libjte_set_jigdo_path(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 8;
|
||||
} else if(strcmp(aspect, "md5_path") == 0 ||
|
||||
strcmp(aspect, "-md5-list") == 0) {
|
||||
ret= libjte_set_md5_path(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 16;
|
||||
} else if(strcmp(aspect, "min_size") == 0 ||
|
||||
strcmp(aspect, "-jigdo-min-file-size") == 0) {
|
||||
num= Scanf_io_size(arg, 0);
|
||||
ret= libjte_set_min_size(jte, num);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 32;
|
||||
} else if(strcmp(aspect, "checksum_iso") == 0 ||
|
||||
strcmp(aspect, "-checksum_algorithm_iso") == 0) {
|
||||
ret= libjte_set_checksum_iso(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 64;
|
||||
} else if(strcmp(aspect, "checksum_template") == 0 ||
|
||||
strcmp(aspect, "-checksum_algorithm_template") == 0) {
|
||||
ret= libjte_set_checksum_template(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 128;
|
||||
} else if(strcmp(aspect, "compression") == 0 ||
|
||||
strcmp(aspect, "-jigdo-template-compress") == 0) {
|
||||
ret= libjte_set_compression(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 256;
|
||||
} else if(strcmp(aspect, "exclude") == 0 ||
|
||||
strcmp(aspect, "-jigdo-exclude") == 0) {
|
||||
ret= libjte_add_exclude(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 512;
|
||||
} else if(strcmp(aspect, "demand_md5") == 0 ||
|
||||
strcmp(aspect, "-jigdo-force-md5") == 0) {
|
||||
ret= libjte_add_md5_demand(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 1024;
|
||||
} else if(strcmp(aspect, "mapping") == 0 ||
|
||||
strcmp(aspect, "-jigdo-map") == 0) {
|
||||
ret= libjte_add_mapping(jte, arg);
|
||||
if(ret <= 0)
|
||||
goto jte_failed;
|
||||
xorriso->libjte_params_given|= 2048;
|
||||
} else {
|
||||
sprintf(xorriso->info_text, "-jigdo: unknown aspect '%s'", aspect);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
ret= Xorriso_lst_new(&(xorriso->jigdo_params), aspect, xorriso->jigdo_params,
|
||||
1);
|
||||
if(ret > 0)
|
||||
ret= Xorriso_lst_new(&(xorriso->jigdo_values), arg, xorriso->jigdo_values,
|
||||
1);
|
||||
if(ret <= 0) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
Xorriso_process_msg_queues(xorriso, 0);
|
||||
return(1);
|
||||
|
||||
bad_arg:
|
||||
sprintf(xorriso->info_text, "-jigdo %s : unknown argument '%s'", aspect, arg);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
|
||||
jte_failed:
|
||||
while(1) {
|
||||
msg= libjte_get_next_message(xorriso->libjte_handle);
|
||||
if(msg == NULL)
|
||||
break;
|
||||
sprintf(xorriso->info_text, "%1.4095s", msg);
|
||||
free(msg);
|
||||
msg= NULL;
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
}
|
||||
sprintf(xorriso->info_text, "Experienced libjte failure with: -jigdo %s %s",
|
||||
aspect, arg);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
|
||||
#else /* Xorriso_with_libjtE */
|
||||
|
||||
sprintf(xorriso->info_text,
|
||||
"Jigdo Template Extraction was not enabled at compile time");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
|
||||
#endif /* ! Xorriso_with_libjtE */
|
||||
|
||||
}
|
||||
|
73
xorriso/lib_mgt.h
Normal file
73
xorriso/lib_mgt.h
Normal file
@ -0,0 +1,73 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which manage the relation
|
||||
between xorriso and the libraries: libburn, libisofs, and libisoburn.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_x_includeD
|
||||
#define Xorriso_pvt_x_includeD yes
|
||||
|
||||
|
||||
#ifndef Xorriso_standalonE
|
||||
|
||||
/* The library which does the ISO 9660 / RockRidge manipulations */
|
||||
#include <libisofs/libisofs.h>
|
||||
|
||||
/* The library which does MMC optical drive operations */
|
||||
#include <libburn/libburn.h>
|
||||
|
||||
/* The library which enhances overwriteable media with ISO 9660 multi-session
|
||||
capabilities via the method invented by Andy Polyakov for growisofs */
|
||||
#include <libisoburn/libisoburn.h>
|
||||
|
||||
/* The official xorriso options API. "No shortcuts" */
|
||||
#include "xorriso.h"
|
||||
|
||||
/* The inner description of XorrisO */
|
||||
#include "xorriso_private.h"
|
||||
|
||||
/* The inner isofs- and burn-library interface */
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#else /* ! Xorriso_standalonE */
|
||||
|
||||
#include "../libisofs/libisofs.h"
|
||||
#include "../libburn/libburn.h"
|
||||
#include "../libisoburn/libisoburn.h"
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#endif /* Xorriso_standalonE */
|
||||
|
||||
|
||||
int Xorriso_abort(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* @param flag bit0= suppress messages below UPDATE
|
||||
bit1= suppress messages below FAILURE
|
||||
*/
|
||||
int Xorriso_set_image_severities(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso__sev_to_text(int severity, char **severity_name,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= report libisofs error text
|
||||
bit1= victim is disk_path
|
||||
bit2= do not inquire libisofs, report msg_text and min_severity
|
||||
*/
|
||||
int Xorriso_report_iso_error(struct XorrisO *xorriso, char *victim,
|
||||
int iso_error_code, char msg_text[], int os_errno,
|
||||
char min_severity[], int flag);
|
||||
|
||||
int Xorriso_process_msg_queues(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_x_includeD */
|
||||
|
13
xorriso/make_docs.sh
Executable file
13
xorriso/make_docs.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Produce man page xorriso/xorriso.1 and info file xorriso/xorriso.info
|
||||
# from base file xorriso/xorriso.texi.
|
||||
# Same for xorriso/xorrisofs.texi.
|
||||
|
||||
( cd xorriso ; makeinfo ./xorriso.texi )
|
||||
( cd xorriso ; makeinfo ./xorrisofs.texi )
|
||||
|
||||
xorriso/make_xorriso_1 -auto
|
||||
xorriso/make_xorriso_1 -auto -xorrisofs
|
||||
|
||||
|
523
xorriso/make_xorriso_1.c
Normal file
523
xorriso/make_xorriso_1.c
Normal file
@ -0,0 +1,523 @@
|
||||
|
||||
/*
|
||||
( cd xorriso ; cc -g -Wall -o make_xorriso_1 make_xorriso_1.c )
|
||||
*/
|
||||
/*
|
||||
Specialized converter from xorriso/xorriso.texi to xorriso/xorriso.1
|
||||
resp. from xorriso/xorrisofs.texi to xorriso/xorrisofs.1
|
||||
|
||||
The conversion rules are described at the beginning of xorriso/xorriso.texi
|
||||
|
||||
Copyright 2010 - 2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
/* The conversion state
|
||||
*/
|
||||
struct Mx1 {
|
||||
|
||||
char prog[4096];
|
||||
|
||||
int count_in;
|
||||
int count_out;
|
||||
|
||||
int skipping; /* <0 stacked skipping , 0= no , >0 counting down */
|
||||
|
||||
};
|
||||
|
||||
int Mx1_substitute(struct Mx1 *m, char line_in[256], char line_out[256],
|
||||
int raw, int upto, int flag);
|
||||
|
||||
|
||||
|
||||
int Mx1_init(struct Mx1 *m, char *prog, int flag)
|
||||
{
|
||||
strncpy(m->prog, prog, sizeof(m->prog) - 1);
|
||||
m->prog[sizeof(m->prog) - 1]= 0;
|
||||
m->count_in= 0;
|
||||
m->count_out= 0;
|
||||
m->skipping= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_report_error(struct Mx1 *m, char *text, int flag)
|
||||
{
|
||||
fprintf(stderr, "%s : line %d : %s\n", m->prog, m->count_in, text);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Mx1__get_word(char *line, char word[256], char **remainder, int flag)
|
||||
{
|
||||
char *cpt, *start;
|
||||
int l;
|
||||
|
||||
word[0]= 0;
|
||||
*remainder= NULL;
|
||||
for(cpt= line; *cpt != 0 && isspace(*cpt); cpt++);
|
||||
if(*cpt == 0)
|
||||
return(0);
|
||||
start= cpt;
|
||||
for(cpt= line; *cpt != 0 && ! isspace(*cpt); cpt++);
|
||||
l= cpt - start;
|
||||
if(l > 0)
|
||||
strncpy(word, start, l);
|
||||
word[l]= 0;
|
||||
*remainder= cpt;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_is_wrap(struct Mx1 *m, char wraps[][20], char *start, char **found,
|
||||
int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i= 0; wraps[i][0] != 0; i++)
|
||||
if(strncmp(start, wraps[i], strlen(wraps[i])) == 0)
|
||||
break;
|
||||
if(wraps[i][0] != 0) {
|
||||
if(found != NULL)
|
||||
*found= wraps[i];
|
||||
return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_is_bold_wrap(struct Mx1 *m, char *start, char **found, int flag)
|
||||
{
|
||||
int ret;
|
||||
static char bold_wraps[][20]= {
|
||||
"@b{", "@dfn{", "@emph{", "@strong{", "@command{",
|
||||
"" };
|
||||
|
||||
ret= Mx1_is_wrap(m, bold_wraps, start, found, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_is_normal_wrap(struct Mx1 *m, char *start, char **found, int flag)
|
||||
{
|
||||
int ret;
|
||||
static char normal_wraps[][20]= {
|
||||
"@var{", "@code{", "@i{", "@abbr{", "@file{", "@option{", "@samp{", "@r{",
|
||||
"" };
|
||||
|
||||
ret= Mx1_is_wrap(m, normal_wraps, start, found, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_is_ignored_wrap(struct Mx1 *m, char *start, char **found, int flag)
|
||||
{
|
||||
int ret;
|
||||
static char ignored_wraps[][20]= {
|
||||
"@ref{", "@xref{",
|
||||
"" };
|
||||
|
||||
ret= Mx1_is_wrap(m, ignored_wraps, start, found, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_is_any_wrap(struct Mx1 *m, char *start, char **found, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= Mx1_is_bold_wrap(m, start, found, 0);
|
||||
if(ret > 0)
|
||||
return(1);
|
||||
ret= Mx1_is_normal_wrap(m, start, found, 0);
|
||||
if(ret > 0)
|
||||
return(2);
|
||||
ret= Mx1_is_ignored_wrap(m, start, found, 0);
|
||||
if(ret > 0)
|
||||
return(3);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= recursion
|
||||
bit1= drop content of brackets
|
||||
*/
|
||||
int Mx1_rewrap(struct Mx1 *m, char **read_pt, char **write_pt,
|
||||
char *write_base, char *envelope,
|
||||
char *front, char *back, int flag)
|
||||
{
|
||||
char *rpt, *wpt, *ept, content[256], msg[256];
|
||||
int l, ret;
|
||||
|
||||
rpt= *read_pt;
|
||||
wpt= *write_pt;
|
||||
|
||||
ept= strchr(rpt, '}');
|
||||
if(ept == NULL) {
|
||||
sprintf(msg, "No closing bracket found for '%s'", envelope);
|
||||
Mx1_report_error(m, msg, 0);
|
||||
return(-1);
|
||||
}
|
||||
/* Mapped {...} content is subject to the rules except {...} mapping. */
|
||||
l= ept - rpt;
|
||||
if(flag & 2)
|
||||
l= 0;
|
||||
if(l > 0) {
|
||||
ret= Mx1_substitute(m, rpt, content, 0, l, 1);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
l= strlen(content);
|
||||
}
|
||||
if((wpt - write_base) + l + strlen(front) + strlen(back) > 255) {
|
||||
Mx1_report_error(m, "Line length overflow while text substitution", 0);
|
||||
return(-1);
|
||||
}
|
||||
strcpy(wpt, front);
|
||||
wpt+= strlen(front);
|
||||
if(l > 0)
|
||||
strncpy(wpt, content, l);
|
||||
wpt+= l;
|
||||
strcpy(wpt, back);
|
||||
wpt+= strlen(back);
|
||||
|
||||
(*read_pt)+= ept - rpt;
|
||||
(*write_pt)= wpt;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= recursion
|
||||
*/
|
||||
int Mx1_substitute(struct Mx1 *m, char line_in[256], char line_out[256],
|
||||
int raw, int upto, int flag)
|
||||
{
|
||||
char *rpt, *wpt, *found;
|
||||
int ret, typ= 0;
|
||||
|
||||
wpt= line_out;
|
||||
for(rpt= line_in; rpt - line_in < upto && *rpt != 0; rpt++) {
|
||||
if(rpt - line_in < raw) {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
}
|
||||
if(*rpt == '@') {
|
||||
typ= 0;
|
||||
if(!(flag & 1))
|
||||
typ= Mx1_is_any_wrap(m, rpt, &found, 0);
|
||||
if(typ == 1) {
|
||||
/* @b{...}, @command{...}, @dfn{...}, @emph{...}, @strong{...}
|
||||
get mapped to \fB...\fR .
|
||||
*/
|
||||
rpt+= strlen(found);
|
||||
ret= Mx1_rewrap(m, &rpt, &wpt, line_out,
|
||||
found , "\\fB", "\\fR", flag & 1);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
} else if(typ == 2) {
|
||||
/* @abbr{...}, @code{...}, @file{...}, @i{...}, @option{...}, @r{...},
|
||||
@ref{...}, @samp{...},@var{...}, get mapped to ... .
|
||||
*/
|
||||
rpt+= strlen(found);
|
||||
ret= Mx1_rewrap(m, &rpt, &wpt, line_out, found, "", "", flag & 1);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
} else if(typ == 3) {
|
||||
/* @ref{...}, @xref{...} get mapped to empty text.
|
||||
*/
|
||||
rpt+= strlen(found);
|
||||
ret= Mx1_rewrap(m, &rpt, &wpt, line_out, found , "", "",
|
||||
(flag & 1) | 2);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
} else if(strncmp(rpt, "@email{", 7) == 0 && !(flag & 1)) {
|
||||
/* @email{...} gets mapped to <...> . */
|
||||
rpt+= 7;
|
||||
ret= Mx1_rewrap(m, &rpt, &wpt, line_out, "@email{", "<", ">", 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
} else if(strncmp(rpt, "@minus{}", 8) == 0) {
|
||||
/* @minus{} will become "-". */
|
||||
if((wpt - line_out) + 1 > 255)
|
||||
goto overflow;
|
||||
*(wpt++)= '-';
|
||||
rpt+= 7;
|
||||
|
||||
} else if(strncmp(rpt, "@@", 2) == 0 ||
|
||||
strncmp(rpt, "@{", 2) == 0 ||
|
||||
strncmp(rpt, "@}", 2) == 0) {
|
||||
/* @@ , @{, @} will get stripped of their first @. */
|
||||
if((wpt - line_out) + 1 > 255)
|
||||
goto overflow;
|
||||
*(wpt++)= *(rpt + 1);
|
||||
rpt++;
|
||||
|
||||
} else {
|
||||
if((wpt - line_out) + 1 > 255)
|
||||
goto overflow;
|
||||
*(wpt++)= *(rpt);
|
||||
|
||||
}
|
||||
|
||||
} else if(*rpt == '\\') {
|
||||
/* "\" becomes "\\" */
|
||||
if((wpt - line_out) + 2 > 255)
|
||||
goto overflow;
|
||||
*(wpt++)= '\\';
|
||||
*(wpt++)= '\\';
|
||||
|
||||
} else if((wpt - line_out) + 1 > 255) {
|
||||
overflow:;
|
||||
Mx1_report_error(m, "Line length overflow while text substitution", 0);
|
||||
return(-1);
|
||||
} else
|
||||
*(wpt++)= *rpt;
|
||||
|
||||
}
|
||||
*wpt= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@return 1= line_out is valid, 0= do not put out line_out, -1 = error
|
||||
*/
|
||||
int Mx1_convert(struct Mx1 *m, char line_in[256], char line_out[256], int flag)
|
||||
{
|
||||
int l, num, keep= 0, ret, raw, i, backslash_count;
|
||||
char word[256], buf[256], *remainder, *wpt;
|
||||
|
||||
m->count_in++;
|
||||
l= strlen(line_in);
|
||||
|
||||
if(m->skipping > 0) {
|
||||
m->skipping--;
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* The first line gets discarded. */
|
||||
if(m->count_in == 1)
|
||||
return(0);
|
||||
|
||||
/* Line start "@c man " will become "", the remainder is put out unaltered. */
|
||||
if(strncmp(line_in, "@c man ", 7) == 0) {
|
||||
strcpy(line_out, line_in + 7);
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* Lines "@*" will be converted to ".br" */
|
||||
if(strcmp(line_in, "@*") == 0) {
|
||||
strcpy(line_out, ".br");
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* @c man-ignore-lines N will discard N following lines.
|
||||
"@c man-ignore-lines begin" discards all following lines
|
||||
up to "@c man-ignore-lines end".
|
||||
*/
|
||||
if(strncmp(line_in, "@c man-ignore-lines ", 20) == 0) {
|
||||
if(strcmp(line_in + 20, "begin") == 0) {
|
||||
m->skipping--;
|
||||
return(0);
|
||||
} else if(strcmp(line_in + 20, "end") == 0) {
|
||||
if(m->skipping < 0)
|
||||
m->skipping++;
|
||||
return(0);
|
||||
} else if(m->skipping == 0) {
|
||||
num= 0;
|
||||
sscanf(line_in + 20, "%d", &num);
|
||||
if(num > 0) {
|
||||
m->skipping= num;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
Mx1_report_error(m, "Inappropriate use of '@c man-ignore-lines'", 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* Line blocks of "@menu" "@end menu" will be discarded. */
|
||||
if(strcmp(line_in, "@menu") == 0) {
|
||||
m->skipping--;
|
||||
return(0);
|
||||
}
|
||||
if(strcmp(line_in, "@end menu") == 0) {
|
||||
if(m->skipping < 0)
|
||||
m->skipping++;
|
||||
return(0);
|
||||
}
|
||||
if(m->skipping)
|
||||
return(0);
|
||||
|
||||
/* "@item -word words" becomes "\fB\-word\fR words". */
|
||||
/* "@item word words" becomes "\fBword\fR words". */
|
||||
if(strncmp(line_in, "@item ", 6) == 0) {
|
||||
ret= Mx1__get_word(line_in + 6, word, &remainder, 0);
|
||||
if(ret <= 0) {
|
||||
Mx1_report_error(m, "Found no word after @item", 0);
|
||||
return(0);
|
||||
}
|
||||
strcpy(buf, "\\fB");
|
||||
if(word[0] == '-') {
|
||||
if(l >= 255) {
|
||||
Mx1_report_error(m, "Line length overflow while converting @item", 0);
|
||||
return(-1);
|
||||
}
|
||||
strcat(buf, "\\");
|
||||
}
|
||||
|
||||
/* Substitute option text */
|
||||
raw= strlen(buf);
|
||||
strcat(buf, word);
|
||||
ret= Mx1_substitute(m, buf, line_out, raw, strlen(buf), 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
strcpy(buf, line_out);
|
||||
|
||||
strcat(buf, "\\fR");
|
||||
raw= strlen(buf);
|
||||
strcat(buf, remainder);
|
||||
|
||||
/* Substitute arguments text */
|
||||
ret= Mx1_substitute(m, buf, line_out, raw, strlen(buf), 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* @strong{... } gets mapped to \fB...\fR . */
|
||||
/* @command{... } gets mapped to \fB...\fR . */
|
||||
/* @minus{} will become "-". */
|
||||
/* Mapped {...} content is subject to the rules except {...} mapping. */
|
||||
/* @@ , @{, @} will get stripped of their first @. */
|
||||
/* "\" becomes "\\" */
|
||||
|
||||
if(line_in[0] != '@' ||
|
||||
Mx1_is_any_wrap(m, line_in, NULL, 0) > 0 ||
|
||||
strncmp(line_in, "@minus{}", 8) == 0 ||
|
||||
strncmp(line_in, "@@", 2) == 0 ||
|
||||
strncmp(line_in, "@{", 2) == 0 ||
|
||||
strncmp(line_in, "@}", 2) == 0 ) {
|
||||
keep= 1;
|
||||
ret= Mx1_substitute(m, line_in, line_out, 0, strlen(line_in), 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* Other lines which begin by "@" will be discarded. */
|
||||
if(! keep) {
|
||||
if(line_in[0] == '@')
|
||||
return(0);
|
||||
strcpy(line_out, line_in);
|
||||
}
|
||||
|
||||
/* "-" which are not preceded by an uneven number of "\" will get
|
||||
prepended one "\".
|
||||
*/
|
||||
l= strlen(line_out);
|
||||
backslash_count= 0;
|
||||
wpt= buf;
|
||||
for(i= 0; i < l; i++) {
|
||||
if(line_out[i] == '\\')
|
||||
backslash_count++;
|
||||
else if(line_out[i] == '-') {
|
||||
if(backslash_count % 2 == 0)
|
||||
*(wpt++)= '\\';
|
||||
backslash_count= 0;
|
||||
} else
|
||||
backslash_count= 0;
|
||||
*(wpt++)= line_out[i];
|
||||
}
|
||||
*wpt= 0;
|
||||
strcpy(line_out, buf);
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret, l, as_filter= 0, i;
|
||||
char line_in[256], line_out[256], *got;
|
||||
static char name_in[1024]= {"xorriso/xorriso.texi"};
|
||||
static char name_out[1024]= {"xorriso/xorriso.1"};
|
||||
struct Mx1 m;
|
||||
FILE *fp_in= stdin, *fp_out= stdout;
|
||||
|
||||
Mx1_init(&m, argv[0], 0);
|
||||
|
||||
if(argc < 2) {
|
||||
usage:;
|
||||
fprintf(stderr, "usage: %s -auto|-filter [-xorrisofs]\n", argv[0]);
|
||||
fprintf(stderr, " -auto xorriso/xorriso.texi -> xorriso/xorriso.1\n");
|
||||
fprintf(stderr, " -filter stdin -> stdout\n");
|
||||
fprintf(stderr, " -xorrisofs process xorriso/xorrisofs.texi\n");
|
||||
exit(2);
|
||||
}
|
||||
for(i= 1; i < argc; i++) {
|
||||
if(strcmp(argv[i], "-filter") == 0)
|
||||
as_filter= 1;
|
||||
else if(strcmp(argv[i], "-auto") == 0)
|
||||
as_filter= 0;
|
||||
else if(strcmp(argv[i], "-xorrisofs") == 0) {
|
||||
strcpy(name_in, "xorriso/xorrisofs.texi");
|
||||
strcpy(name_out, "xorriso/xorrisofs.1");
|
||||
} else {
|
||||
fprintf(stderr, "%s : unknown option %s\n", argv[0], argv[i]);
|
||||
goto usage;
|
||||
}
|
||||
}
|
||||
|
||||
if(!as_filter) {
|
||||
fp_in= fopen(name_in, "r");
|
||||
if(fp_in == NULL) {
|
||||
fprintf(stderr, "%s : failed to fopen( %s ,r) : %d %s\n",
|
||||
argv[0], name_in, errno, strerror(errno));
|
||||
exit(3);
|
||||
}
|
||||
fp_out= fopen(name_out, "w");
|
||||
if(fp_out == NULL) {
|
||||
fprintf(stderr, "%s : failed to fopen( %s ,w) : %d %s\n",
|
||||
argv[0], name_out, errno, strerror(errno));
|
||||
exit(4);
|
||||
}
|
||||
}
|
||||
while(1) {
|
||||
got= fgets(line_in, sizeof(line_in), fp_in);
|
||||
if(got == NULL)
|
||||
break;
|
||||
l= strlen(line_in);
|
||||
while(l > 0) {
|
||||
if(line_in[l - 1] == '\r' || line_in[l - 1] == '\n') {
|
||||
line_in[l - 1] = 0;
|
||||
l--;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
ret= Mx1_convert(&m, line_in, line_out, 0);
|
||||
if(ret < 0)
|
||||
exit(1);
|
||||
if(ret == 0)
|
||||
continue;
|
||||
fprintf(fp_out, "%s\n", line_out);
|
||||
}
|
||||
exit(0);
|
||||
}
|
@ -1,35 +1,50 @@
|
||||
#!/bin/sh
|
||||
|
||||
# make_xorriso_standalone.sh
|
||||
# Copyright 2008 - 2010 Thomas Schmitt, scdbackup@gmx.net, GPL
|
||||
# Copyright 2008 - 2011 Thomas Schmitt, scdbackup@gmx.net, GPLv2+
|
||||
#
|
||||
# Not intended for general use in production installations !
|
||||
#
|
||||
# This is a development tool which expects a special setup of directories.
|
||||
# It is to be executed in a common parent of the directories
|
||||
# nglibisofs-develop libburn-develop libisoburn-develop
|
||||
# nglibisofs-develop jte-develop libburn-develop libisoburn-develop
|
||||
# where tarballs or repository copies have been installed of
|
||||
# libisofs jte libburn libisoburn
|
||||
# obtained according to instructions on http://libburnia-project.org.
|
||||
#
|
||||
# Creates a standalone tree for building xorriso
|
||||
# from the contents of a unified libburnia development tree.
|
||||
# It creates a new directory tree
|
||||
# xorriso-standalone
|
||||
# for building GNU xorriso.
|
||||
#
|
||||
# The ./bootstrap script gets applied and a source tarball
|
||||
# is made.
|
||||
#
|
||||
# From that tree can be build a binary xorriso/xorriso
|
||||
# which at runtime depends only on libc and libpthread.
|
||||
# Execute in $lone_dir :
|
||||
# From that tree can be build a binary xorriso/xorriso which at runtime
|
||||
# does not depend on installed libburnia libraries.
|
||||
# Execute in xorriso-standalone :
|
||||
#
|
||||
# ./configure && make
|
||||
#
|
||||
|
||||
# By the variable setting create_gnu_xorriso="yes"
|
||||
# the result will become a GNU xorriso tarball under GPLv3+.
|
||||
# Without this setting, the result is technically equivalent but
|
||||
# stays under GPLv2+. In that case the files xorriso/*_gnu_xorriso
|
||||
# are merely informative.
|
||||
# Note that it is not permissible to revert the transition from
|
||||
# GPLv2+ to GPLv3+. (Rather derive a new GPLv2+ from libburnia.)
|
||||
|
||||
create_gnu_xorriso="yes"
|
||||
|
||||
|
||||
current_dir=$(pwd)
|
||||
lone_dir="$current_dir"/"xorriso-standalone"
|
||||
|
||||
xorriso_rev=0.4.8
|
||||
# For unstable uploads:
|
||||
## xorriso_pl=""
|
||||
# For stable releases:
|
||||
xorriso_pl=".pl00"
|
||||
xorriso_rev=1.1.4
|
||||
# For unstable uploads and patch level 0 of stable releases:
|
||||
xorriso_pl=""
|
||||
# For higher patch levels of stable releases:
|
||||
## xorriso_pl=".pl01"
|
||||
|
||||
with_bootstrap_tarball=1
|
||||
|
||||
@ -99,16 +114,12 @@ copy_files \
|
||||
\
|
||||
"$lone_dir"
|
||||
|
||||
copy_files xorriso/xorriso_bootstrap.txt "$lone_dir"/bootstrap
|
||||
|
||||
copy_files xorriso/configure_ac.txt "$lone_dir"/configure.ac
|
||||
|
||||
copy_files xorriso/xorriso_makefile_am.txt "$lone_dir"/Makefile.am
|
||||
|
||||
# copy_files xorriso/xorriso_pc_in.txt "$lone_dir"/xorriso.pc.in
|
||||
|
||||
copy_files xorriso/README "$lone_dir"/README
|
||||
|
||||
# echo "See end of xorriso/changelog.txt" >"$lone_dir"/TODO
|
||||
|
||||
|
||||
# libisoburn
|
||||
|
||||
@ -116,27 +127,91 @@ create_dir "$lone_dir"/libisoburn
|
||||
copy_files \
|
||||
libisoburn/*.[ch] \
|
||||
"$lone_dir"/libisoburn
|
||||
copy_files COPYRIGHT "$lone_dir"/libisoburn
|
||||
|
||||
xorriso/convert_man_to_html.sh
|
||||
|
||||
create_dir "$lone_dir"/xorriso
|
||||
copy_files \
|
||||
xorriso/xorrisoburn.[ch] \
|
||||
xorriso/xorriso.[ch1] \
|
||||
xorriso/xorriso.h \
|
||||
xorriso/xorriso_private.h \
|
||||
xorriso/sfile.h \
|
||||
xorriso/sfile.c \
|
||||
xorriso/aux_objects.h \
|
||||
xorriso/aux_objects.c \
|
||||
xorriso/findjob.h \
|
||||
xorriso/findjob.c \
|
||||
xorriso/check_media.h \
|
||||
xorriso/check_media.c \
|
||||
xorriso/misc_funct.h \
|
||||
xorriso/misc_funct.c \
|
||||
xorriso/text_io.h \
|
||||
xorriso/text_io.c \
|
||||
xorriso/match.h \
|
||||
xorriso/match.c \
|
||||
xorriso/emulators.h \
|
||||
xorriso/emulators.c \
|
||||
xorriso/disk_ops.h \
|
||||
xorriso/disk_ops.c \
|
||||
xorriso/cmp_update.h \
|
||||
xorriso/cmp_update.c \
|
||||
xorriso/parse_exec.h \
|
||||
xorriso/parse_exec.c \
|
||||
xorriso/opts_a_c.c \
|
||||
xorriso/opts_d_h.c \
|
||||
xorriso/opts_i_o.c \
|
||||
xorriso/opts_p_z.c \
|
||||
\
|
||||
xorriso/xorrisoburn.h \
|
||||
xorriso/base_obj.h \
|
||||
xorriso/base_obj.c \
|
||||
xorriso/lib_mgt.h \
|
||||
xorriso/lib_mgt.c \
|
||||
xorriso/sort_cmp.h \
|
||||
xorriso/sort_cmp.c \
|
||||
xorriso/drive_mgt.h \
|
||||
xorriso/drive_mgt.c \
|
||||
xorriso/iso_img.h \
|
||||
xorriso/iso_img.c \
|
||||
xorriso/iso_tree.h \
|
||||
xorriso/iso_tree.c \
|
||||
xorriso/iso_manip.h \
|
||||
xorriso/iso_manip.c \
|
||||
xorriso/write_run.h \
|
||||
xorriso/write_run.c \
|
||||
xorriso/read_run.h \
|
||||
xorriso/read_run.c \
|
||||
xorriso/filters.h \
|
||||
xorriso/filters.c \
|
||||
\
|
||||
xorriso/xorriso_main.c \
|
||||
xorriso/xorriso_timestamp.h \
|
||||
\
|
||||
xorriso/changelog.txt \
|
||||
xorriso/xorriso_eng.html \
|
||||
xorriso/make_docs.sh \
|
||||
xorriso/xorriso.texi \
|
||||
xorriso/xorriso.info \
|
||||
xorriso/xorrisofs.texi \
|
||||
xorriso/xorrisofs.info \
|
||||
xorriso/make_xorriso_1.c \
|
||||
xorriso/xorriso.1 \
|
||||
xorriso/xorrisofs.1 \
|
||||
xorriso/man_1_xorriso.html \
|
||||
xorriso/man_1_xorrisofs.html \
|
||||
"$lone_dir"/xorriso
|
||||
copy_files COPYRIGHT "$lone_dir"/xorriso
|
||||
|
||||
copy_files xorriso/xorriso_buildstamp_none.h \
|
||||
"$lone_dir"/xorriso/xorriso_buildstamp.h
|
||||
copy_files xorriso/xorriso_buildstamp_none.h \
|
||||
"$lone_dir"/xorriso/xorriso_buildstamp_none.h
|
||||
|
||||
create_dir "$lone_dir"/doc
|
||||
copy_files doc/partition_offset.wiki \
|
||||
doc/startup_file.txt \
|
||||
"$lone_dir"/doc
|
||||
|
||||
create_dir "$lone_dir"/test
|
||||
copy_files \
|
||||
test/compare_file.c \
|
||||
@ -147,48 +222,27 @@ copy_files \
|
||||
|
||||
create_dir "$lone_dir"/libisofs
|
||||
create_dir "$lone_dir"/libisofs/filters
|
||||
create_dir "$lone_dir"/doc
|
||||
goto_dir "$current_dir"/nglibisofs-develop
|
||||
copy_files libisofs/*.[ch] "$lone_dir"/libisofs
|
||||
copy_files libisofs/filters/*.[ch] "$lone_dir"/libisofs/filters
|
||||
copy_files doc/susp_aaip*.txt "$lone_dir"/doc
|
||||
copy_files doc/zisofs_format.txt "$lone_dir"/doc
|
||||
copy_files doc/checksums.txt "$lone_dir"/doc
|
||||
copy_files doc/boot_sectors.txt "$lone_dir"/doc
|
||||
copy_files COPYRIGHT "$lone_dir"/libisofs
|
||||
test -e CONTRIBUTORS && cat CONTRIBUTORS >>"$lone_dir"/CONTRIBUTORS
|
||||
|
||||
# To get a common version.h
|
||||
cat version.h.in >> "$lone_dir"/version.h.in
|
||||
|
||||
|
||||
# <<< obsoleted patchings
|
||||
|
||||
if test 1 = 0
|
||||
then
|
||||
|
||||
# Change GNU macro name to POSIX name
|
||||
sed -e 's/FNM_FILE_NAME/FNM_PATHNAME/g' \
|
||||
<libisofs/tree.c >"$lone_dir"/libisofs/tree.c
|
||||
|
||||
# Filter out the semi-illegal TODO comments
|
||||
( cd "$lone_dir"/libisofs && grep '^[[:space:]]*//' *.[ch] | less )
|
||||
echo "Is it ok delete all shown //-lines ?"
|
||||
read yesno
|
||||
if test "$yesno" = "y" -o "$yesno" = "1"
|
||||
then
|
||||
for i in "$lone_dir"/libisofs/*.[ch]
|
||||
do
|
||||
# first copy attributes
|
||||
cp "$i" "$lone_dir"/libisofs/tmpfile
|
||||
# now filter away // lines
|
||||
grep -v '^[[:space:]]*//' <"$i" >"$lone_dir"/libisofs/tmpfile && \
|
||||
mv "$lone_dir"/libisofs/tmpfile "$i"
|
||||
done
|
||||
fi
|
||||
echo "Remaining // lines:"
|
||||
( cd "$lone_dir"/libisofs && grep '//' *.[ch] )
|
||||
|
||||
fi
|
||||
# libjte
|
||||
|
||||
create_dir "$lone_dir"/libjte
|
||||
goto_dir "$current_dir"/jte-develop
|
||||
copy_files *.[ch] "$lone_dir"/libjte
|
||||
copy_files bin/jigdo-gen-md5-list doc/jigdo-gen-md5-list.1 "$lone_dir"/libjte
|
||||
copy_files COPYRIGHT "$lone_dir"/libjte
|
||||
|
||||
|
||||
# libburn
|
||||
@ -197,18 +251,43 @@ create_dir "$lone_dir"/libburn
|
||||
goto_dir "$current_dir"/libburn-develop
|
||||
copy_files libburn/*.[ch] "$lone_dir"/libburn
|
||||
copy_files COPYRIGHT "$lone_dir"/libburn
|
||||
cat CONTRIBUTORS >>"$lone_dir"/CONTRIBUTORS
|
||||
|
||||
# Delete a source module of yet unclear ancestry.
|
||||
# The build process will avoid to use it.
|
||||
rm "$lone_dir"/libburn/crc.c
|
||||
|
||||
|
||||
# To get a common version.h
|
||||
cat version.h.in >> "$lone_dir"/version.h.in
|
||||
|
||||
# Decision about legal situation
|
||||
goto_dir "$current_dir"/libisoburn-develop
|
||||
if test "$create_gnu_xorriso" = "yes"
|
||||
then
|
||||
copy_files xorriso/README_gnu_xorriso "$lone_dir"/README
|
||||
copy_files xorriso/COPYRIGHT_gnu_xorriso "$lone_dir"/COPYRIGHT
|
||||
copy_files xorriso/COPYING_gnu_xorriso "$lone_dir"/COPYING
|
||||
copy_files xorriso/AUTHORS_gnu_xorriso "$lone_dir"/AUTHORS
|
||||
|
||||
# patch xorriso/xorriso.h to be GNU xorriso
|
||||
sed -e's/define Xorriso_libburnia_xorrisO/define Xorriso_GNU_xorrisO/' \
|
||||
-e's/This may be changed to Xorriso_GNU_xorrisO in order to c/C/' \
|
||||
<xorriso/xorriso.h >"$lone_dir"/xorriso/xorriso.h
|
||||
|
||||
else
|
||||
|
||||
copy_files README "$lone_dir"/README
|
||||
|
||||
fi
|
||||
|
||||
|
||||
# tarball
|
||||
|
||||
if test "$with_bootstrap_tarball" = 1
|
||||
then
|
||||
|
||||
tarball_dir="$current_dir"/xorriso-"$xorriso_rev"
|
||||
tarball_dir="$current_dir"/xorriso-"$xorriso_rev""$xorriso_pl"
|
||||
mv "$lone_dir" "$tarball_dir"
|
||||
|
||||
goto_dir "$tarball_dir"
|
||||
@ -231,6 +310,16 @@ rm -r ./autom4te.cache
|
||||
chmod a+rx,go-w,u+w ./configure
|
||||
)
|
||||
|
||||
if test "$create_gnu_xorriso" = "yes"
|
||||
then
|
||||
# ftp-upload@gnu.org rejects Makefile.in with a dangerous chmod on make dist
|
||||
sed -e 's/-perm -777 -exec chmod a+rwx/-perm -755 -exec chmod u+rwx,go+rx/' \
|
||||
< Makefile.in > new_Makefile.in
|
||||
|
||||
mv new_Makefile.in Makefile.in
|
||||
fi
|
||||
|
||||
|
||||
cd "$current_dir"
|
||||
tar czf ./xorriso-"$xorriso_rev""$xorriso_pl".tar.gz $(basename "$tarball_dir")
|
||||
|
||||
|
@ -1,197 +0,0 @@
|
||||
|
||||
# ts A90315 : LIBBURNIA_PKGCONFDIR is defined OS specific in acinclude.m4
|
||||
# was: pkgconfigdir=$(libdir)/pkgconfig
|
||||
pkgconfigdir=$(LIBBURNIA_PKGCONFDIR)
|
||||
|
||||
libincludedir=$(includedir)/libisoburn
|
||||
|
||||
lib_LTLIBRARIES = libisoburn/libisoburn.la libxorriso/libxorriso.la
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
# Build libraries
|
||||
libisoburn_libisoburn_la_LDFLAGS = \
|
||||
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
||||
libisoburn_libisoburn_la_SOURCES = \
|
||||
libisoburn/burn_wrap.c \
|
||||
libisoburn/data_source.c \
|
||||
libisoburn/isoburn.c \
|
||||
libisoburn/isoburn.h \
|
||||
libisoburn/isofs_wrap.c \
|
||||
libisoburn/libisoburn.h \
|
||||
version.h
|
||||
|
||||
libisoburn_libisoburn_la_LIBADD = \
|
||||
-lisofs \
|
||||
-lburn
|
||||
|
||||
libxorriso_libxorriso_la_LDFLAGS = \
|
||||
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
||||
libxorriso_libxorriso_la_SOURCES = \
|
||||
xorriso/xorriso.h \
|
||||
xorriso/xorriso_private.h \
|
||||
xorriso/xorriso.c \
|
||||
xorriso/xorrisoburn.h \
|
||||
xorriso/xorrisoburn.c \
|
||||
xorriso/xorriso_timestamp.h \
|
||||
xorriso/xorriso_buildstamp.h \
|
||||
version.h
|
||||
|
||||
libxorriso_libxorriso_la_LIBADD = \
|
||||
-lisofs \
|
||||
-lburn \
|
||||
-lisoburn
|
||||
|
||||
libinclude_HEADERS = \
|
||||
libisoburn/libisoburn.h \
|
||||
xorriso/xorriso.h
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
|
||||
# This is the reference application of libisoburn. See man xorriso/xorriso.1
|
||||
#
|
||||
bin_PROGRAMS = \
|
||||
xorriso/xorriso
|
||||
|
||||
# This looks quite ugly with make install: xorriso.c is compiled twice again
|
||||
#
|
||||
# Trying to create a build timestamp file
|
||||
#
|
||||
# BUILT_SOURCES = xorriso/xorriso_buildstamp.h
|
||||
#
|
||||
# phony targets get rebuilt every time
|
||||
#
|
||||
# .PHONY: xorriso/xorriso_buildstamp.h
|
||||
# xorriso/xorriso_buildstamp.h:
|
||||
# date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
|
||||
# cat xorriso/xorriso_buildstamp.h
|
||||
|
||||
xorriso_xorriso_CPPFLAGS = -Ilibisoburn
|
||||
xorriso_xorriso_CFLAGS = -DXorriso_with_maiN -DXorriso_without_subS \
|
||||
$(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
|
||||
$(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF) \
|
||||
$(XORRISO_DVD_OBS_64K)
|
||||
|
||||
xorriso_xorriso_LDADD = libisoburn/libisoburn.la -lisofs -lburn \
|
||||
libxorriso/libxorriso.la \
|
||||
$(THREAD_LIBS) $(LIBBURN_ARCH_LIBS)
|
||||
|
||||
xorriso_xorriso_SOURCES = \
|
||||
xorriso/xorriso.h \
|
||||
xorriso/xorriso_private.h \
|
||||
xorriso/xorriso.c \
|
||||
xorriso/xorrisoburn.h \
|
||||
xorriso/xorriso_timestamp.h \
|
||||
xorriso/xorriso_buildstamp.h
|
||||
|
||||
# xorriso/xorrisoburn.c \
|
||||
#
|
||||
|
||||
# Install symbolic links to the xorriso binary
|
||||
#
|
||||
install-exec-hook:
|
||||
if test -e "$(DESTDIR)$(bindir)"/xorrisofs ; then rm "$(DESTDIR)$(bindir)"/xorrisofs ; else echo ; fi
|
||||
ln -s xorriso "$(DESTDIR)$(bindir)"/xorrisofs
|
||||
if test -e "$(DESTDIR)$(bindir)"/osirrox ; then rm "$(DESTDIR)$(bindir)"/osirrox ; else echo ; fi
|
||||
ln -s xorriso "$(DESTDIR)$(bindir)"/osirrox
|
||||
if test -e "$(DESTDIR)$(bindir)"/xorrecord ; then rm "$(DESTDIR)$(bindir)"/xorrecord ; else echo ; fi
|
||||
ln -s xorriso "$(DESTDIR)$(bindir)"/xorrecord
|
||||
|
||||
|
||||
# Alternative to the disabled .PHONY above.
|
||||
# Trying to create a build timestamp file semi-manually: make buildstamped
|
||||
#
|
||||
buildstamp:
|
||||
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
|
||||
cat xorriso/xorriso_buildstamp.h
|
||||
|
||||
# For now make buildstamped has to be performed explicitely.
|
||||
buildstamped: buildstamp
|
||||
make
|
||||
|
||||
|
||||
|
||||
## Build test applications
|
||||
noinst_PROGRAMS = \
|
||||
test/compare_file
|
||||
|
||||
# A program to compare two files in mirrored trees in mounted filesystems
|
||||
# To compare tree /media/dvd and /original/dir :
|
||||
# find /media/dvd -exec test/compare_file '{}' /media/dvd /original/dir ';'
|
||||
#
|
||||
test_compare_file_CPPFLAGS =
|
||||
test_compare_file_CFLAGS =
|
||||
test_compare_file_LDADD =
|
||||
test_compare_file_SOURCES = test/compare_file.c
|
||||
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
## Build documentation (You need Doxygen for this to work)
|
||||
webhost = http://libburn-api.pykix.org
|
||||
webpath = /
|
||||
docdir = $(DESTDIR)$(prefix)/share/doc/$(PACKAGE)-$(VERSION)
|
||||
|
||||
doc: doc/html
|
||||
|
||||
doc/html: doc/doxygen.conf
|
||||
if [ -f ./doc/doc.lock ]; then \
|
||||
$(RM) -r doc/html; \
|
||||
doxygen doc/doxygen.conf; \
|
||||
fi
|
||||
|
||||
doc-upload: doc/html
|
||||
scp -r $</* $(webhost):$(webpath)
|
||||
|
||||
all: doc
|
||||
|
||||
install-data-local:
|
||||
if [ -f ./doc/doc.lock ]; then \
|
||||
$(mkinstalldirs) $(docdir)/html; \
|
||||
$(INSTALL_DATA) doc/html/* $(docdir)/html; \
|
||||
fi
|
||||
|
||||
uninstall-local:
|
||||
rm -rf $(docdir)
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
# Indent source files
|
||||
indent_files = \
|
||||
$(libisoburn_libisoburn_la_SOURCES)
|
||||
|
||||
|
||||
indent: $(indent_files)
|
||||
indent -bad -bap -nbbb -nbbo -nbc -bli0 -br -bls \
|
||||
-cdw -ce -cli0 -ncs -nbfda -i8 -l79 -lc79 \
|
||||
-lp -saf -sai -nprs -npsl -saw -sob -ss -ut \
|
||||
-sbi0 -nsc -ts8 -npcs -ncdb -fca \
|
||||
$^
|
||||
|
||||
.PHONY: indent
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
# Extra things
|
||||
nodist_pkgconfig_DATA = \
|
||||
libisoburn-1.pc
|
||||
|
||||
man_MANS = xorriso/xorriso.1
|
||||
|
||||
EXTRA_DIST = \
|
||||
libisoburn-1.pc.in \
|
||||
version.h.in \
|
||||
doc/comments \
|
||||
doc/doxygen.conf.in \
|
||||
README \
|
||||
AUTHORS \
|
||||
CONTRIBUTORS \
|
||||
COPYRIGHT \
|
||||
COPYING \
|
||||
INSTALL \
|
||||
xorriso/changelog.txt \
|
||||
xorriso/xorriso_buildstamp_none.h \
|
||||
xorriso/README \
|
||||
$(man_MANS)
|
||||
|
118
xorriso/man_xorriso_to_html.sh
Executable file
118
xorriso/man_xorriso_to_html.sh
Executable file
@ -0,0 +1,118 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# man_xorriso_to_html.sh - ts A80118 , B10309
|
||||
#
|
||||
# Generates a HTML version of man page xorriso.1
|
||||
#
|
||||
# To be executed in the libisoburn toplevel directory (eg. ./libisoburn-0.1.0)
|
||||
#
|
||||
|
||||
# set -x
|
||||
|
||||
man_dir=$(pwd)"/xorriso"
|
||||
export MANPATH="$man_dir"
|
||||
manpage="xorriso"
|
||||
raw_html=$(pwd)/"xorriso/raw_man_1_xorriso.html"
|
||||
htmlpage=$(pwd)/"xorriso/man_1_xorriso.html"
|
||||
|
||||
if test -r "$man_dir"/"$manpage".1
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "Cannot find readable man page source $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -e "$man_dir"/man1
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
ln -s . "$man_dir"/man1
|
||||
fi
|
||||
|
||||
if test "$1" = "-work_as_filter"
|
||||
then
|
||||
|
||||
# set -x
|
||||
|
||||
sed \
|
||||
-e 's/<meta name="generator" content="groff -Thtml, see www.gnu.org">/<meta name="generator" content="groff -Thtml, via man -H, via xorriso\/convert_man_to_html.sh">/' \
|
||||
-e 's/<meta name="Content-Style" content="text\/css">/<meta name="Content-Style" content="text\/css"><META NAME="description" CONTENT="man page of xorriso"><META NAME="keywords" CONTENT="man xorriso, manual, xorriso, CD, CD-RW, CD-R, burning, cdrecord, compatible"><META NAME="robots" CONTENT="follow">/' \
|
||||
-e 's/<title>XORRISO<\/title>/<title>man 1 xorriso<\/title>/' \
|
||||
-e 's/<h1 align=center>XORRISO<\/h1>/<h1 align=center>man 1 xorriso<\/h1>/' \
|
||||
-e 's/<body>/<body BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>/' \
|
||||
-e 's/<b>Overview of features:<\/b>/\ <BR><b>Overview of features:<\/b>/' \
|
||||
-e 's/<b>General information paragraphs:<\/b>/\ <BR><b>General information paragraphs:<\/b>/' \
|
||||
-e 's/have a look at section EXAMPLES/have a look at section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \
|
||||
-e 's/<b>Session model:<\/b>/\ <BR><b>Session model:<\/b>/' \
|
||||
-e 's/<b>Media types and states:<\/b>/\ <BR><b>Media types and states:<\/b>/' \
|
||||
-e 's/<b>Creating, Growing, Modifying, Blind/\ <BR><b>Creating, Growing, Modifying, Blind/' \
|
||||
-e 's/<b>Libburn drives:<\/b>/\ <BR><b>Libburn drives:<\/b>/' \
|
||||
-e 's/^-dev /\ \ -dev /' \
|
||||
-e 's/^-devices /\ \ -devices /' \
|
||||
-e 's/<b>Rock Ridge, POSIX, X\/Open, El Torito, ACL,/\ <BR><b>Rock Ridge, POSIX, X\/Open, El Torito, ACL,/' \
|
||||
-e 's/<b>Command processing:<\/b>/\ <BR><b>Command processing:<\/b>/' \
|
||||
-e 's/<b>Dialog, Readline, Result pager:<\/b>/\ <BR><b>Dialog, Readline, Result pager:<\/b>/' \
|
||||
-e 's/<b>Aquiring source and target drive:<\/b>/\ <BR><b>Aquiring source and target drive:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Influencing the behavior of image/\ <BR><b>Influencing the behavior of image/' \
|
||||
-e 's/<b>Inserting files into ISO image:<\/b>/\ <BR><b>Inserting files into ISO image:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>File manipulations:<\/b>/\ <BR><b>File manipulations:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Tree traversal command -find:<\/b>/\ <BR><b>Tree traversal command -find:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^<p><b>−iso_rr_pattern/<p>\ <BR><b>\−iso_rr_pattern/' \
|
||||
-e 's/EXAMPLES):<br>/<A HREF="#EXAMPLES">EXAMPLES<\/A>):<br>/' \
|
||||
-e 's/<b>Filters for data file content:<\/b>/\ <BR><b>Filters for data file content:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Writing the result, drive control:<\/b>/\ <BR><b>Writing the result, drive control:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^-find \/ /\ \ -find \/ /' \
|
||||
-e 's/<b>Settings for file insertion:<\/b>/\ <BR><b>Settings for file insertion:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^$<\/b> ln -s/\ \ $<\/b> ln -s/' \
|
||||
-e 's/<b>Settings for result writing:<\/b>/\ <BR><b>Settings for result writing:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^706k = 706kB/\ \ 706k = 706kB/' \
|
||||
-e 's/^5540k = 5540kB/\ \ 5540k = 5540kB/' \
|
||||
-e 's/<b>Character sets:<\/b>/\ <BR><b>Character sets:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Exception processing:<\/b>/\ <BR><b>Exception processing:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>El Torito bootable ISO images:<\/b>/\ <BR><b>El Torito bootable ISO images:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Jigdo Template Extraction:<\/b>/\ <BR><b>Jigdo Template Extraction:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Dialog mode control:<\/b>/\ <BR><b>Dialog mode control:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Drive and media related inquiry actions:<\/b>/\ <BR><b>Drive and media related inquiry actions:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Navigation in ISO image/\ <BR><b>Navigation in ISO image/' \
|
||||
-e 's/^filesystem:<\/b>/filesystem:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Evaluation of readability and recovery:<\/b>/\ <BR><b>Evaluation of readability and recovery:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>osirrox ISO-to-disk restore options:<\/b>/\ <BR><b>osirrox ISO-to-disk restore options:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Command compatibility emulations:<\/b>/\ <BR><b>Command compatibility emulations:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^<p><b>−as</<p>\ <BR><b>\−as</' \
|
||||
-e 's/<b>Scripting, dialog and/\ <BR><b>Scripting, dialog and/' \
|
||||
-e 's/^features:<\/b>/features:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Support for frontend/\ <BR><b>Support for frontend/' \
|
||||
-e 's/^listening at stdout:<\/b>/listening at stdout:<\/b><BR>\ <BR>/' \
|
||||
-e 's/xorriso -outdev \/dev\/sr2 \\ -blank fast \\ -pathspecs on/xorriso -outdev \/dev\/sr2 -blank fast -pathspecs on/' \
|
||||
-e 's/\\ -add \\ \/sounds=\/home\/me\/sounds \\ \/pictures \\ -- \\ -rm_r \\/ -add \/sounds=\/home\/me\/sounds \/pictures -- -rm_r /' \
|
||||
-e 's/\/sounds\/indecent \\ \’\/pictures\/\*private\*\’ \\/\/sounds\/indecent \’\/pictures\/*private*\’ /' \
|
||||
-e 's/\/pictures\/confidential \\ -- \\ -add \\/\/pictures\/confidential -- -add/' \
|
||||
-e 's/xorriso -dev \/dev\/sr2 \\ -rm_r \/sounds -- \\ -mv \\/xorriso -dev \/dev\/sr2 -rm_r \/sounds -- -mv /' \
|
||||
-e 's/\/pictures\/confidential \\ \/pictures\/restricted \\ -- \\ -chmod/\/pictures\/confidential \/pictures\/restricted -- -chmod/' \
|
||||
-e 's/go-rwx \/pictures\/restricted -- \\ -pathsspecs on \\ -add \\/go-rwx \/pictures\/restricted -- -pathsspecs on -add /' \
|
||||
-e 's/\/sounds=\/home\/me\/prepared_for_dvd\/sounds_dummy /\/sounds=\/home\/me\/prepared_for_dvd\/sounds_dummy/' \
|
||||
-e 's/\/movies=\/home\/me\/prepared_for_dvd\/movies \\ -- \\ -commit/\/movies=\/home\/me\/prepared_for_dvd\/movies -- -commit/' \
|
||||
-e 's/xorriso -indev \/dev\/sr2 \\ -rm_r \/sounds -- \\/xorriso -indev \/dev\/sr2 -rm_r \/sounds -- /' \
|
||||
-e 's/-outdev \/dev\/sr0 -blank fast \\ -commit -eject all/-outdev \/dev\/sr0 -blank fast -commit -eject all/' \
|
||||
-e 's/See section FILES/See section <A HREF="#FILES">FILES<\/A>/' \
|
||||
-e 's/See section EXAMPLES/See section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \
|
||||
-e 's/<\/body>/<BR><HR><FONT SIZE=-1><CENTER>(HTML generated from '"$manpage"'.1 on '"$(date)"' by '$(basename "$0")' )<\/CENTER><\/FONT><\/body>/' \
|
||||
<"$2" >"$htmlpage"
|
||||
|
||||
set +x
|
||||
|
||||
chmod u+rw,go+r,go-w "$htmlpage"
|
||||
echo "Emerged file:"
|
||||
ls -lL "$htmlpage"
|
||||
|
||||
else
|
||||
|
||||
export BROWSER='cp "%s" '"$raw_html"
|
||||
man -H "$manpage"
|
||||
"$0" -work_as_filter "$raw_html"
|
||||
rm "$raw_html"
|
||||
rm "$man_dir"/man1
|
||||
|
||||
fi
|
79
xorriso/man_xorrisofs_to_html.sh
Executable file
79
xorriso/man_xorrisofs_to_html.sh
Executable file
@ -0,0 +1,79 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# man_xorrisofs_to_html.sh - ts A80118 , B10309
|
||||
#
|
||||
# Generates a HTML version of man page xorrisofs.1
|
||||
#
|
||||
# To be executed in the libisoburn toplevel directory (eg. ./libisoburn-0.1.0)
|
||||
#
|
||||
|
||||
# set -x
|
||||
|
||||
man_dir=$(pwd)"/xorriso"
|
||||
export MANPATH="$man_dir"
|
||||
manpage="xorrisofs"
|
||||
raw_html=$(pwd)/"xorriso/raw_man_1_xorrisofs.html"
|
||||
htmlpage=$(pwd)/"xorriso/man_1_xorrisofs.html"
|
||||
|
||||
if test -r "$man_dir"/"$manpage".1
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
echo "Cannot find readable man page source $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -e "$man_dir"/man1
|
||||
then
|
||||
dummy=dummy
|
||||
else
|
||||
ln -s . "$man_dir"/man1
|
||||
fi
|
||||
|
||||
if test "$1" = "-work_as_filter"
|
||||
then
|
||||
|
||||
# set -x
|
||||
|
||||
sed \
|
||||
-e 's/<meta name="generator" content="groff -Thtml, see www.gnu.org">/<meta name="generator" content="groff -Thtml, via man -H, via xorriso\/convert_man_to_html.sh">/' \
|
||||
-e 's/<meta name="Content-Style" content="text\/css">/<meta name="Content-Style" content="text\/css"><META NAME="description" CONTENT="man page of xorriso"><META NAME="keywords" CONTENT="man xorrisofs, manual, xorrisofs, ISO 9660, mkisofs, compatible"><META NAME="robots" CONTENT="follow">/' \
|
||||
-e 's/<title>XORRISOFS<\/title>/<title>man 1 xorrisofs<\/title>/' \
|
||||
-e 's/<h1 align=center>XORRISOFS<\/h1>/<h1 align=center>man 1 xorrisofs<\/h1>/' \
|
||||
-e 's/<body>/<body BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>/' \
|
||||
-e 's/<b>ISO 9660, Rock Ridge, Joliet:<\/b>/\ <BR><b>ISO 9660, Rock Ridge, Joliet:<\/b>/' \
|
||||
-e 's/<b>Inserting files into the ISO image:<\/b>/\ <BR><b>Inserting files into the ISO image:<\/b>/' \
|
||||
-e 's/<b>Relation to program xorriso:<\/b>/\ <BR><b>Relation to program xorriso:<\/b>/' \
|
||||
-e 's/EXAMPLES):<br>/<A HREF="#EXAMPLES">EXAMPLES<\/A>):<br>/' \
|
||||
-e 's/<b>Image loading:<\/b>/\ <BR><b>Image loading:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for file insertion:<\/b>/\ <BR><b>Settings for file insertion:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for image production:<\/b>/\ <BR><b>Settings for image production:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for standards compliance:<\/b>/\ <BR><b>Settings for standards compliance:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for standards extensions:<\/b>/\ <BR><b>Settings for standards extensions:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for file hiding:<\/b>/\ <BR><b>Settings for file hiding:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>ISO image ID strings:<\/b>/\ <BR><b>ISO image ID strings:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>El Torito Bootable ISO images:<\/b>/\ <BR><b>El Torito Bootable ISO images:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>System Area, MBR, other boot blocks:<\/b>/\ <BR><b>System Area, MBR, other boot blocks:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Character sets:<\/b>/\ <BR><b>Character sets:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Jigdo Template Extraction:<\/b>/\ <BR><b>Jigdo Template Extraction:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Miscellaneous options:<\/b>/\ <BR><b>Miscellaneous options:<\/b><BR>\ <BR>/' \
|
||||
\
|
||||
-e 's/<\/body>/<BR><HR><FONT SIZE=-1><CENTER>(HTML generated from '"$manpage"'.1 on '"$(date)"' by '$(basename "$0")' )<\/CENTER><\/FONT><\/body>/' \
|
||||
<"$2" >"$htmlpage"
|
||||
|
||||
set +x
|
||||
|
||||
chmod u+rw,go+r,go-w "$htmlpage"
|
||||
echo "Emerged file:"
|
||||
ls -lL "$htmlpage"
|
||||
|
||||
else
|
||||
|
||||
export BROWSER='cp "%s" '"$raw_html"
|
||||
man -H "$manpage"
|
||||
"$0" -work_as_filter "$raw_html"
|
||||
rm "$raw_html"
|
||||
rm "$man_dir"/man1
|
||||
|
||||
fi
|
773
xorriso/match.c
Normal file
773
xorriso/match.c
Normal file
@ -0,0 +1,773 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the implementation of functions for pattern matching.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
|
||||
/* @param flag bit0= do not augment relative structured search by xorriso->wdi
|
||||
bit1= return 2 if bonked at start point by ..
|
||||
(caller then aborts or retries without bit0)
|
||||
bit2= eventually prepend wdx rather than wdi
|
||||
@return <=0 error, 1= ok, 2= with bit1: relative pattern exceeds start point
|
||||
*/
|
||||
int Xorriso_prepare_regex(struct XorrisO *xorriso, char *adr, int flag)
|
||||
{
|
||||
int l,ret,i,count,bonked= 0,is_constant,is_still_relative= 0, adr_size;
|
||||
char *cpt,*npt,*adr_part= NULL, *absolute_adr= NULL, *adr_start,*wd;
|
||||
|
||||
adr_size= 2 * SfileadrL;
|
||||
Xorriso_alloc_meM(adr_part, char, adr_size);
|
||||
Xorriso_alloc_meM(absolute_adr, char, adr_size);
|
||||
|
||||
if(flag&4)
|
||||
wd= xorriso->wdx;
|
||||
else
|
||||
wd= xorriso->wdi;
|
||||
|
||||
if(xorriso->search_mode>=2 && xorriso->search_mode<=4) {
|
||||
if(xorriso->search_mode==3 || xorriso->search_mode==4) {
|
||||
l= strlen(adr)+strlen(wd)+1;
|
||||
if(l * 2 + 2 > ((int) sizeof(xorriso->reg_expr)) || l * 2 + 2 > adr_size){
|
||||
sprintf(xorriso->info_text,"Search pattern too long");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
}
|
||||
Xorriso_destroy_re(xorriso,0);
|
||||
if(xorriso->structured_search && xorriso->search_mode==3) {
|
||||
if(adr[0]!='/')
|
||||
is_still_relative= 1;
|
||||
if(is_still_relative && !(flag&1)) {
|
||||
/* relative expression : prepend working directory */
|
||||
sprintf(absolute_adr,"%s/%s",wd,adr);
|
||||
adr_start= absolute_adr;
|
||||
xorriso->prepended_wd= 1;
|
||||
is_still_relative= 0;
|
||||
} else
|
||||
adr_start= adr;
|
||||
/* count slashes */;
|
||||
cpt= adr_start;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
for(i= 0;1;i++) {
|
||||
cpt= strchr(cpt,'/');
|
||||
if(cpt==NULL)
|
||||
break;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
}
|
||||
count= i+1;
|
||||
xorriso->re= TSOB_FELD(regex_t,count);
|
||||
if(xorriso->re==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
xorriso->re_constants= TSOB_FELD(char *,count);
|
||||
if(xorriso->re_constants==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
for(i= 0;i<count;i++)
|
||||
xorriso->re_constants[i]= NULL;
|
||||
xorriso->re_count= count;
|
||||
xorriso->re_fill= 0;
|
||||
|
||||
/* loop over slash chunks*/;
|
||||
cpt= adr_start;
|
||||
xorriso->re_fill= 0;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
for(i= 0;i<count;i++) {
|
||||
npt= strchr(cpt,'/');
|
||||
if(npt==NULL) {
|
||||
if((int) strlen(cpt) >= adr_size)
|
||||
{ret= -1; goto ex;}
|
||||
strcpy(adr_part,cpt);
|
||||
} else {
|
||||
if(npt-cpt >= adr_size)
|
||||
{ret= -1; goto ex;}
|
||||
strncpy(adr_part,cpt,npt-cpt);
|
||||
adr_part[npt-cpt]= 0;
|
||||
}
|
||||
|
||||
if(adr_part[0]==0)
|
||||
goto next_adr_part;
|
||||
if(adr_part[0]=='.' && adr_part[1]==0 &&
|
||||
(xorriso->re_fill>0 || i<count-1))
|
||||
goto next_adr_part;
|
||||
if(adr_part[0]=='.' && adr_part[1]=='.' && adr_part[2]==0) {
|
||||
/* delete previous part */
|
||||
if(xorriso->re_fill <= 0) {
|
||||
bonked= 1;
|
||||
goto next_adr_part;
|
||||
}
|
||||
if(xorriso->re_constants[xorriso->re_fill-1]!=NULL) {
|
||||
free(xorriso->re_constants[xorriso->re_fill-1]);
|
||||
xorriso->re_constants[xorriso->re_fill-1]= NULL;
|
||||
} else
|
||||
regfree(&(xorriso->re[xorriso->re_fill-1]));
|
||||
(xorriso->re_fill)--;
|
||||
goto next_adr_part;
|
||||
}
|
||||
if(strcmp(adr_part,"*")==0) {
|
||||
adr_part[0]= 0;
|
||||
ret= 2;
|
||||
} else
|
||||
ret= Xorriso__bourne_to_reg(adr_part,xorriso->reg_expr,0);
|
||||
if(ret==2) {
|
||||
if(Sregex_string(&(xorriso->re_constants[xorriso->re_fill]),adr_part,0)
|
||||
<=0)
|
||||
{ret= -1; goto ex;}
|
||||
} else {
|
||||
if(regcomp(&(xorriso->re[xorriso->re_fill]),xorriso->reg_expr,0)!=0)
|
||||
goto cannot_compile;
|
||||
}
|
||||
xorriso->re_fill++;
|
||||
next_adr_part:;
|
||||
if(i==count-1)
|
||||
break;
|
||||
cpt= npt+1;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
}
|
||||
if(bonked) {
|
||||
if(flag&2)
|
||||
{ret= 2; goto ex;}
|
||||
sprintf(xorriso->info_text, "Your '..' bonked at the %s directory.",
|
||||
is_still_relative ? "working" : "root");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE",0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
|
||||
Xorriso__bourne_to_reg(adr_start,xorriso->reg_expr,0); /* just for show */
|
||||
|
||||
} else {
|
||||
is_constant= 0;
|
||||
if(strcmp(adr,"*")==0 || adr[0]==0) {
|
||||
is_constant= 1;
|
||||
} else if(xorriso->search_mode==3 || xorriso->search_mode==4) {
|
||||
ret= Xorriso__bourne_to_reg(adr,xorriso->reg_expr,0);
|
||||
is_constant= (ret==2);
|
||||
} else {
|
||||
if(strlen(adr)>=sizeof(xorriso->reg_expr))
|
||||
{ret= -1; goto ex;}
|
||||
strcpy(xorriso->reg_expr,adr);
|
||||
}
|
||||
xorriso->re_count= 0; /* tells matcher that this is not structured */
|
||||
xorriso->re_constants= TSOB_FELD(char *,1);
|
||||
if(xorriso->re_constants==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
xorriso->re_constants[0]= NULL;
|
||||
if(is_constant) {
|
||||
if(strcmp(adr,"*")==0) {
|
||||
if(Sregex_string(&(xorriso->re_constants[0]),"",0)<=0)
|
||||
{ret= -1; goto ex;}
|
||||
} else {
|
||||
if(Sregex_string(&(xorriso->re_constants[0]),adr,0)<=0)
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
xorriso->re_fill= 1;
|
||||
} else {
|
||||
xorriso->re= TSOB_FELD(regex_t,1);
|
||||
if(xorriso->re==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
if(regcomp(&(xorriso->re[0]),xorriso->reg_expr,0)!=0) {
|
||||
cannot_compile:;
|
||||
sprintf(xorriso->info_text, "Cannot compile regular expression : %s",
|
||||
xorriso->reg_expr);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE",0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
Xorriso_free_meM(adr_part);
|
||||
Xorriso_free_meM(absolute_adr);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not shortcut last component of to_match
|
||||
bit1= consider match if regex matches parent of path
|
||||
bit2= retry beginning at failed last component
|
||||
|
||||
@return 0=match , else no match
|
||||
*/
|
||||
int Xorriso_regexec(struct XorrisO *xorriso, char *to_match, int *failed_at,
|
||||
int flag)
|
||||
{
|
||||
int ret,i,re_start= 0,reg_nomatch= -1;
|
||||
char *cpt,*npt, *adr_part= NULL, *mpt;
|
||||
|
||||
Xorriso_alloc_meM(adr_part, char, SfileadrL);
|
||||
|
||||
reg_nomatch= REG_NOMATCH;
|
||||
|
||||
*failed_at= 0;
|
||||
if(!(xorriso->structured_search && xorriso->re_count>0)) {
|
||||
if(xorriso->re_constants!=NULL)
|
||||
if(xorriso->re_constants[0]!=NULL) {
|
||||
if(xorriso->re_constants[0][0]==0)
|
||||
{ret= 0; goto ex;}
|
||||
if(strcmp(xorriso->re_constants[0],to_match)!=0)
|
||||
{ret= reg_nomatch; goto ex;}
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
ret= regexec(&(xorriso->re[0]),to_match,1,xorriso->match,0);
|
||||
goto ex;
|
||||
}
|
||||
|
||||
cpt= to_match;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
if(flag&4)
|
||||
re_start= xorriso->re_failed_at;
|
||||
if(re_start<0)
|
||||
re_start= 0;
|
||||
for(i= re_start;i<xorriso->re_fill;i++) {
|
||||
*failed_at= i;
|
||||
npt= strchr(cpt,'/');
|
||||
if(npt==NULL) {
|
||||
if(i<xorriso->re_fill-1 && !(flag&1))
|
||||
{ret= reg_nomatch; goto ex;} /* this must be the last expression part */
|
||||
mpt= cpt;
|
||||
} else {
|
||||
strncpy(adr_part,cpt,npt-cpt);
|
||||
adr_part[npt-cpt]= 0;
|
||||
mpt= adr_part;
|
||||
}
|
||||
if(xorriso->re_constants[i]!=NULL) {
|
||||
if(xorriso->re_constants[i][0]!=0) /* empty constant matches anything */
|
||||
if(strcmp(xorriso->re_constants[i],mpt)!=0)
|
||||
{ret= reg_nomatch; goto ex;}
|
||||
} else {
|
||||
ret= regexec(&(xorriso->re[i]),mpt,1,xorriso->match,0);
|
||||
if(ret!=0)
|
||||
goto ex;
|
||||
}
|
||||
if(npt==NULL) {
|
||||
if(i>=xorriso->re_fill-1)
|
||||
{ret= 0; goto ex;} /* MATCH */
|
||||
*failed_at= i+1;
|
||||
{ret= reg_nomatch; goto ex;}
|
||||
}
|
||||
cpt= npt+1;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
}
|
||||
*failed_at= xorriso->re_fill;
|
||||
if(flag & 2)
|
||||
{ret= 0; goto ex;} /* MATCH */
|
||||
ret= reg_nomatch;
|
||||
ex:;
|
||||
Xorriso_free_meM(adr_part);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_is_in_patternlist(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT *patternlist, char *path,
|
||||
int flag)
|
||||
{
|
||||
int ret, failed_at, i= 0;
|
||||
struct Xorriso_lsT *s;
|
||||
|
||||
xorriso->search_mode= 3;
|
||||
xorriso->structured_search= 1;
|
||||
|
||||
for(s= patternlist; s != NULL; s= Xorriso_lst_get_next(s, 0)) {
|
||||
ret= Xorriso_prepare_regex(xorriso, Xorriso_lst_get_text(s, 0), 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
/* Match path or parent of path */
|
||||
ret= Xorriso_regexec(xorriso, path, &failed_at, 2);
|
||||
if(ret == 0)
|
||||
return(i + 1);
|
||||
i++;
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
char *Xorriso_get_pattern(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT *patternlist, int index, int flag)
|
||||
{
|
||||
int i= 0;
|
||||
struct Xorriso_lsT *s;
|
||||
|
||||
for(s= patternlist; s != NULL; s= Xorriso_lst_get_next(s, 0)) {
|
||||
if(i == index)
|
||||
return(Xorriso_lst_get_text(s, 0));
|
||||
i++;
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* @param flag bit2= this is a disk_pattern
|
||||
@return <=0 failure , 1 pattern ok , 2 pattern needed prepended wd */
|
||||
int Xorriso_prepare_expansion_pattern(struct XorrisO *xorriso, char *pattern,
|
||||
int flag)
|
||||
{
|
||||
int ret, prepwd= 0;
|
||||
|
||||
ret= Xorriso_prepare_regex(xorriso, pattern, 1|2|(flag&4));
|
||||
if(ret==2) {
|
||||
ret= Xorriso_prepare_regex(xorriso, pattern, flag&4);
|
||||
prepwd= 1;
|
||||
}
|
||||
if(ret<=0) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot compile pattern to regular expression: %s", pattern);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
return(1+prepwd);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= count results rather than storing them
|
||||
bit1= unexpected change of number is a FATAL event
|
||||
@return <=0 error , 1 is root (end processing) ,
|
||||
2 is not root (go on processing)
|
||||
*/
|
||||
int Xorriso_check_for_root_pattern(struct XorrisO *xorriso,
|
||||
int *filec, char **filev, int count_limit, off_t *mem, int flag)
|
||||
{
|
||||
if(xorriso->re_fill!=0)
|
||||
return(2);
|
||||
/* This is the empty pattern representing root */
|
||||
if(flag&1) {
|
||||
(*filec)++;
|
||||
(*mem)+= 8;
|
||||
} else {
|
||||
if(*filec >= count_limit) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Number of matching files changed unexpectedly (> %d)",
|
||||
count_limit);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag&2 ? "FATAL" : "WARNING"), 0);
|
||||
return(flag&2 ? -1 : 0);
|
||||
}
|
||||
filev[*filec]= strdup("/");
|
||||
if(filev[*filec]==NULL) {
|
||||
Xorriso_no_pattern_memory(xorriso, (off_t) 2, 0);
|
||||
return(-1);
|
||||
}
|
||||
(*filec)++;
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= count result rather than storing it
|
||||
bit1= unexpected change of number is a FATAL event
|
||||
*/
|
||||
int Xorriso_register_matched_adr(struct XorrisO *xorriso,
|
||||
char *adr, int count_limit,
|
||||
int *filec, char **filev, off_t *mem, int flag)
|
||||
{
|
||||
int l;
|
||||
|
||||
if(flag&1) {
|
||||
(*filec)++;
|
||||
l= strlen(adr)+1;
|
||||
(*mem)+= sizeof(char *)+l;
|
||||
if(l % sizeof(char *))
|
||||
(*mem)+= sizeof(char *)-(l % sizeof(char *));
|
||||
} else {
|
||||
if(*filec >= count_limit) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Number of matching files changed unexpectedly (> %d)",
|
||||
count_limit);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag&2 ? "FATAL" : "WARNING"), 0);
|
||||
return(flag&2 ? -1 : 0);
|
||||
}
|
||||
filev[*filec]= strdup(adr);
|
||||
if(filev[*filec]==NULL) {
|
||||
Xorriso_no_pattern_memory(xorriso, (off_t) (strlen(adr)+1), 0);
|
||||
return(-1);
|
||||
}
|
||||
(*filec)++;
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= count results rather than storing them
|
||||
bit1= this is a recursion
|
||||
bit2= prepend wd (automatically done if wd[0]!=0)
|
||||
@return <=0 error , 1 ok , 2 could not open directory
|
||||
*/
|
||||
int Xorriso_obtain_pattern_files_x(
|
||||
struct XorrisO *xorriso, char *wd, char *dir_adr,
|
||||
int *filec, char **filev, int count_limit, off_t *mem,
|
||||
int *dive_count, int flag)
|
||||
{
|
||||
int ret, failed_at, follow_mount, follow_links;
|
||||
struct DirseQ *dirseq= NULL;
|
||||
struct stat stbuf;
|
||||
dev_t dir_dev;
|
||||
char *path;
|
||||
char *adr= NULL, *name= NULL, *path_data= NULL;
|
||||
|
||||
adr= malloc(SfileadrL);
|
||||
name= malloc(SfileadrL);
|
||||
path_data= malloc(SfileadrL);
|
||||
if(adr==NULL || name==NULL || path_data==NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, &adr, 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
follow_mount= (xorriso->do_follow_mount || xorriso->do_follow_pattern);
|
||||
follow_links= (xorriso->do_follow_links || xorriso->do_follow_pattern);
|
||||
if(!(flag&2))
|
||||
*dive_count= 0;
|
||||
else
|
||||
(*dive_count)++;
|
||||
|
||||
ret= Xorriso_check_for_root_pattern(xorriso, filec, filev, count_limit,
|
||||
mem, flag&1);
|
||||
if(ret!=2)
|
||||
goto ex;
|
||||
|
||||
if(lstat(dir_adr, &stbuf)==-1)
|
||||
{ret= 2; goto ex;}
|
||||
dir_dev= stbuf.st_dev;
|
||||
if(S_ISLNK(stbuf.st_mode)) {
|
||||
if(stat(dir_adr, &stbuf)==-1)
|
||||
{ret= 2; goto ex;}
|
||||
if(dir_dev != stbuf.st_dev && !follow_mount)
|
||||
{ret= 2; goto ex;}
|
||||
}
|
||||
ret= Dirseq_new(&dirseq, dir_adr, 1);
|
||||
if(ret<0) {
|
||||
sprintf(xorriso->info_text, "Cannot obtain disk directory iterator");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
if(ret==0)
|
||||
{ret= 2; goto ex;}
|
||||
|
||||
while(1) {
|
||||
ret= Dirseq_next_adr(dirseq,name,0);
|
||||
if(ret==0)
|
||||
break;
|
||||
if(ret<0) {
|
||||
sprintf(xorriso->info_text,"Failed to obtain next directory entry");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
|
||||
ret= Xorriso_make_abs_adr(xorriso, wd, name, adr, flag&4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
ret= Xorriso_regexec(xorriso, adr, &failed_at, 1);
|
||||
if(ret>0) { /* no match */
|
||||
if(failed_at <= *dive_count) /* no hope for a match */
|
||||
continue;
|
||||
path= adr;
|
||||
if(adr[0]!='/') {
|
||||
path= path_data;
|
||||
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdx, adr, path, 1|4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
|
||||
if(follow_links)
|
||||
ret= stat(path,&stbuf);
|
||||
else
|
||||
ret= lstat(path,&stbuf);
|
||||
if(ret==-1)
|
||||
continue;
|
||||
if(!S_ISDIR(stbuf.st_mode))
|
||||
continue;
|
||||
if(dir_dev != stbuf.st_dev && !follow_mount)
|
||||
continue;
|
||||
|
||||
/* dive deeper */
|
||||
ret= Xorriso_obtain_pattern_files_x(xorriso, adr, path,
|
||||
filec, filev, count_limit, mem, dive_count, flag|2);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
} else {
|
||||
ret= Xorriso_register_matched_adr(xorriso, adr, count_limit,
|
||||
filec, filev, mem, flag&1);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
if(ret==0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(adr!=NULL)
|
||||
free(adr);
|
||||
if(name!=NULL)
|
||||
free(name);
|
||||
if(path_data!=NULL)
|
||||
free(path_data);
|
||||
Dirseq_destroy(&dirseq,0);
|
||||
if(flag&2)
|
||||
(*dive_count)--;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_eval_nonmatch(struct XorrisO *xorriso, char *pattern,
|
||||
int *nonconst_mismatches, off_t *mem, int flag)
|
||||
{
|
||||
int k,l;
|
||||
|
||||
/* Is this a constant pattern ? */
|
||||
for(k= 0; k<xorriso->re_fill; k++) {
|
||||
if(xorriso->re_constants[k]==NULL)
|
||||
break;
|
||||
if(xorriso->re_constants[k][0]==0)
|
||||
break;
|
||||
}
|
||||
if(k<xorriso->re_fill)
|
||||
(*nonconst_mismatches)++; /* it is not */
|
||||
|
||||
l= strlen(pattern)+1;
|
||||
(*mem)+= sizeof(char *)+l;
|
||||
if(l % sizeof(char *))
|
||||
(*mem)+= sizeof(char *)-(l % sizeof(char *));
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= a match count !=1 is a SORRY event
|
||||
bit1= a match count !=1 is a FAILURE event
|
||||
*/
|
||||
int Xorriso_check_matchcount(struct XorrisO *xorriso,
|
||||
int count, int nonconst_mismatches, int num_patterns,
|
||||
char **patterns, int flag)
|
||||
{
|
||||
|
||||
if((flag&1) && (count!=1 || nonconst_mismatches)){
|
||||
if(count-nonconst_mismatches>0)
|
||||
sprintf(xorriso->info_text,
|
||||
"Pattern match with more than one file object");
|
||||
else
|
||||
sprintf(xorriso->info_text, "No pattern match with any file object");
|
||||
if(num_patterns==1)
|
||||
sprintf(xorriso->info_text+strlen(xorriso->info_text), ": ");
|
||||
Text_shellsafe(patterns[0], xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag&2 ? "FAILURE" : "SORRY"), 0);
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_no_pattern_memory(struct XorrisO *xorriso, off_t mem, int flag)
|
||||
{
|
||||
char mem_text[80];
|
||||
|
||||
Sfile_scale((double) mem, mem_text,5,1e4,1);
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot allocate enough memory (%s) for pattern expansion",
|
||||
mem_text);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_alloc_pattern_mem(struct XorrisO *xorriso, off_t mem,
|
||||
int count, char ***filev, int flag)
|
||||
{
|
||||
char mem_text[80], limit_text[80];
|
||||
|
||||
Sfile_scale((double) mem, mem_text,5,1e4,0);
|
||||
sprintf(xorriso->info_text,
|
||||
"Temporary memory needed for pattern expansion : %s", mem_text);
|
||||
if(!(flag&1))
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
if(mem > xorriso->temp_mem_limit) {
|
||||
Sfile_scale((double) xorriso->temp_mem_limit, limit_text,5,1e4,1);
|
||||
sprintf(xorriso->info_text,
|
||||
"List of matching file addresses exceeds -temp_mem_limit (%s > %s)",
|
||||
mem_text, limit_text);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
(*filev)= (char **) calloc(count, sizeof(char *));
|
||||
if(*filev==NULL) {
|
||||
Xorriso_no_pattern_memory(xorriso, mem, 0);
|
||||
return(-1);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= a match count !=1 is a FAILURE event
|
||||
bit1= with bit0 tolerate 0 matches if pattern is a constant
|
||||
*/
|
||||
int Xorriso_expand_disk_pattern(struct XorrisO *xorriso,
|
||||
int num_patterns, char **patterns, int extra_filec,
|
||||
int *filec, char ***filev, off_t *mem, int flag)
|
||||
{
|
||||
int ret, count= 0, abs_adr= 0, i, was_count, was_filec;
|
||||
int nonconst_mismatches= 0, dive_count= 0;
|
||||
char *dir_adr= NULL;
|
||||
|
||||
Xorriso_alloc_meM(dir_adr, char, SfileadrL);
|
||||
|
||||
*filec= 0;
|
||||
*filev= NULL;
|
||||
|
||||
xorriso->search_mode= 3;
|
||||
xorriso->structured_search= 1;
|
||||
|
||||
for(i= 0; i<num_patterns; i++) {
|
||||
|
||||
ret= Xorriso_prepare_expansion_pattern(xorriso, patterns[i], 4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
if(ret==2)
|
||||
abs_adr= 4;
|
||||
|
||||
if(patterns[i][0]=='/' || abs_adr) {
|
||||
strcpy(dir_adr, "/");
|
||||
abs_adr= 4;
|
||||
} else {
|
||||
strcpy(dir_adr, xorriso->wdx);
|
||||
if(dir_adr[0]==0)
|
||||
strcpy(dir_adr, "/");
|
||||
ret= Sfile_type(dir_adr, 1|4);
|
||||
if(ret!=2) {
|
||||
Xorriso_msgs_submit(xorriso, 0, dir_adr, 0, "ERRFILE", 0);
|
||||
sprintf(xorriso->info_text, "Address set by -cdx is not a directory: ");
|
||||
Text_shellsafe(dir_adr, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
/* count the matches */
|
||||
was_count= count;
|
||||
ret= Xorriso_obtain_pattern_files_x(xorriso, "", dir_adr, &count, NULL, 0,
|
||||
mem, &dive_count, 1 | abs_adr);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
if(was_count==count && strcmp(patterns[i],"*")!=0 && (flag&3)!=1) {
|
||||
count++;
|
||||
ret= Xorriso_eval_nonmatch(xorriso, patterns[i],
|
||||
&nonconst_mismatches, mem, 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
ret= Xorriso_check_matchcount(xorriso, count, nonconst_mismatches,
|
||||
num_patterns, patterns, (flag&1)|2);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
count+= extra_filec;
|
||||
mem+= extra_filec*sizeof(char *);
|
||||
|
||||
if(count<=0)
|
||||
{ret= 0; goto ex;}
|
||||
|
||||
ret= Xorriso_alloc_pattern_mem(xorriso, *mem, count, filev, 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
/* now store addresses */
|
||||
for(i= 0; i<num_patterns; i++) {
|
||||
|
||||
ret= Xorriso_prepare_expansion_pattern(xorriso, patterns[i], 4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
if(patterns[i][0]=='/' || abs_adr) {
|
||||
strcpy(dir_adr, "/");
|
||||
abs_adr= 4;
|
||||
} else {
|
||||
strcpy(dir_adr, xorriso->wdx);
|
||||
if(dir_adr[0]==0)
|
||||
strcpy(dir_adr, "/");
|
||||
}
|
||||
|
||||
was_filec= *filec;
|
||||
ret= Xorriso_obtain_pattern_files_x(xorriso, "", dir_adr, filec, *filev,
|
||||
count, mem, &dive_count, abs_adr);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
if(was_filec == *filec && strcmp(patterns[i],"*")!=0) {
|
||||
(*filev)[*filec]= strdup(patterns[i]);
|
||||
if((*filev)[*filec]==NULL) {
|
||||
(*mem)= strlen(patterns[i])+1;
|
||||
Xorriso_no_pattern_memory(xorriso, *mem, 0);
|
||||
ret= -1; goto ex;
|
||||
}
|
||||
(*filec)++;
|
||||
}
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(ret<=0) {
|
||||
if(filev!=NULL)
|
||||
Sfile_destroy_argv(&count, filev, 0);
|
||||
*filec= 0;
|
||||
}
|
||||
Xorriso_free_meM(dir_adr);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= command without pattern capability
|
||||
bit1= disk_pattern rather than iso_rr_pattern
|
||||
*/
|
||||
int Xorriso_warn_of_wildcards(struct XorrisO *xorriso, char *path, int flag)
|
||||
{
|
||||
if(strchr(path,'*')!=NULL || strchr(path,'?')!=NULL ||
|
||||
strchr(path,'[')!=NULL) {
|
||||
if(flag&1) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Pattern expansion of wildcards \"*?[\" does not apply to this command");
|
||||
} else {
|
||||
sprintf(xorriso->info_text,
|
||||
"Pattern expansion of wildcards \"*?[\" is disabled by command %s",
|
||||
(flag&2) ? "-disk_pattern or -pathspecs" : "-iso_rr_pattern");
|
||||
}
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
|
||||
sprintf(xorriso->info_text,"Pattern seen: %s\n", path);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
|
||||
return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
74
xorriso/match.h
Normal file
74
xorriso/match.h
Normal file
@ -0,0 +1,74 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the implementation of functions for pattern matching.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_match_includeD
|
||||
#define Xorriso_pvt_match_includeD yes
|
||||
|
||||
|
||||
int Xorriso_prepare_regex(struct XorrisO *xorriso, char *adr, int flag);
|
||||
|
||||
/* @return 0=match , else no match
|
||||
*/
|
||||
int Xorriso_regexec(struct XorrisO *xorriso, char *to_match, int *failed_at,
|
||||
int flag);
|
||||
|
||||
int Xorriso_is_in_patternlist(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT *patternlist, char *path, int flag);
|
||||
|
||||
char *Xorriso_get_pattern(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT *patternlist, int index, int flag);
|
||||
|
||||
int Xorriso_prepare_expansion_pattern(struct XorrisO *xorriso, char *pattern,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= count results rather than storing them
|
||||
@return <=0 error , 1 is root (end processing) ,
|
||||
2 is not root (go on processing)
|
||||
*/
|
||||
int Xorriso_check_for_root_pattern(struct XorrisO *xorriso,
|
||||
int *filec, char **filev, int count_limit, off_t *mem, int flag);
|
||||
|
||||
/* @param flag bit0= count result rather than storing it
|
||||
bit1= unexpected change of number is a FATAL event
|
||||
*/
|
||||
int Xorriso_register_matched_adr(struct XorrisO *xorriso,
|
||||
char *adr, int count_limit,
|
||||
int *filec, char **filev, off_t *mem, int flag);
|
||||
|
||||
int Xorriso_eval_nonmatch(struct XorrisO *xorriso, char *pattern,
|
||||
int *nonconst_mismatches, off_t *mem, int flag);
|
||||
|
||||
/* @param flag bit0= a match count !=1 is a SORRY event
|
||||
*/
|
||||
int Xorriso_check_matchcount(struct XorrisO *xorriso,
|
||||
int count, int nonconst_mismatches, int num_patterns,
|
||||
char **patterns, int flag);
|
||||
|
||||
int Xorriso_no_pattern_memory(struct XorrisO *xorriso, off_t mem, int flag);
|
||||
|
||||
int Xorriso_alloc_pattern_mem(struct XorrisO *xorriso, off_t mem,
|
||||
int count, char ***filev, int flag);
|
||||
|
||||
/* @param flag bit0= command without pattern capability
|
||||
bit1= disk_pattern rather than iso_rr_pattern
|
||||
*/
|
||||
int Xorriso_warn_of_wildcards(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
/* @param flag bit0= a match count !=1 is a FAILURE event
|
||||
bit1= with bit0 tolerate 0 matches if pattern is a constant
|
||||
*/
|
||||
int Xorriso_expand_disk_pattern(struct XorrisO *xorriso,
|
||||
int num_patterns, char **patterns, int extra_filec,
|
||||
int *filec, char ***filev, off_t *mem, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_match_includeD */
|
||||
|
1236
xorriso/misc_funct.c
Normal file
1236
xorriso/misc_funct.c
Normal file
File diff suppressed because it is too large
Load Diff
97
xorriso/misc_funct.h
Normal file
97
xorriso/misc_funct.h
Normal file
@ -0,0 +1,97 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of cellaneous helper functions of xorriso.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_misc_includeD
|
||||
#define Xorriso_pvt_misc_includeD yes
|
||||
|
||||
#include <regex.h>
|
||||
|
||||
|
||||
char *Text_shellsafe(char *in_text, char *out_text, int flag);
|
||||
|
||||
int Sort_argv(int argc, char **argv, int flag);
|
||||
|
||||
/* @param flag bit0= single letters */
|
||||
char *Ftypetxt(mode_t st_mode, int flag);
|
||||
|
||||
/* @param flag bit0=with year and seconds
|
||||
bit1=timestamp format YYYY.MM.DD.hhmmss
|
||||
*/
|
||||
char *Ftimetxt(time_t t, char timetext[40], int flag);
|
||||
|
||||
int System_uname(char **sysname, char **release, char **version,
|
||||
char **machine, int flag);
|
||||
|
||||
/** Convert a text into a number of type double and multiply it by unit code
|
||||
[kmgtpe] (2^10 to 2^60) or [s] (2048). (Also accepts capital letters.)
|
||||
@param text Input like "42", "2k", "3.14m" or "-1g"
|
||||
@param flag Bitfield for control purposes:
|
||||
bit0= return -1 rathern than 0 on failure
|
||||
@return The derived double value
|
||||
*/
|
||||
double Scanf_io_size(char *text, int flag);
|
||||
|
||||
/*
|
||||
@flag bit0= do not initialize *diff_count
|
||||
@return <0 error , 0 = mismatch , 1 = match
|
||||
*/
|
||||
int Compare_text_lines(char *text1, char *text2, int *diff_count, int flag);
|
||||
|
||||
time_t Decode_timestring(char *code, time_t *date, int flag);
|
||||
|
||||
int Decode_ecma119_format(struct tm *erg, char *text, int flag);
|
||||
|
||||
int Wait_for_input(int fd, int microsec, int flag);
|
||||
|
||||
int Fileliste__target_source_limit(char *line, char sep, char **limit_pt,
|
||||
int flag);
|
||||
|
||||
int Hex_to_bin(char *hex,
|
||||
int bin_size, int *bin_count, unsigned char *bin_data, int flag);
|
||||
|
||||
|
||||
/* bit0= append (text!=NULL) */
|
||||
int Sregex_string(char **handle, char *text, int flag);
|
||||
|
||||
/* @param flag bit0= only test expression whether compilable
|
||||
*/
|
||||
int Sregex_match(char *pattern, char *text, int flag);
|
||||
|
||||
/*
|
||||
vars[][0] points to the variable names, vars[][1] to their contents.
|
||||
start marks the begin of variable names. It must be non-empty. esc before
|
||||
start disables this meaning. start and esc may be equal but else they must
|
||||
have disjoint character sets.
|
||||
end marks the end of a variable name. It may be empty but if non-empty it
|
||||
must not appear in vars[][0].
|
||||
@param flag bit0= Substitute unknown variables by empty text
|
||||
(else copy start,name,end unaltered to result).
|
||||
Parameter end must be non-empty for that.
|
||||
*/
|
||||
int Sregex_resolve_var(char *form, char *vars[][2], int num_vars,
|
||||
char *start, char *end, char *esc,
|
||||
char *result, int result_size, int flag);
|
||||
|
||||
/* reg_expr should be twice as large as bourne_expr ( + 2 to be exact) */
|
||||
/* return: 2= bourne_expr is surely a constant */
|
||||
int Xorriso__bourne_to_reg(char bourne_expr[], char reg_expr[], int flag);
|
||||
|
||||
|
||||
int Xorriso__hide_mode(char *mode, int flag);
|
||||
|
||||
char *Xorriso__hide_mode_text(int hide_mode, int flag);
|
||||
|
||||
/* @return 0=truncated, 1=ok
|
||||
*/
|
||||
int Xorriso__to_upper(char *in, char *out, int out_size, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_misc_includeD */
|
||||
|
2337
xorriso/opts_a_c.c
Normal file
2337
xorriso/opts_a_c.c
Normal file
File diff suppressed because it is too large
Load Diff
2058
xorriso/opts_d_h.c
Normal file
2058
xorriso/opts_d_h.c
Normal file
File diff suppressed because it is too large
Load Diff
1307
xorriso/opts_i_o.c
Normal file
1307
xorriso/opts_i_o.c
Normal file
File diff suppressed because it is too large
Load Diff
1954
xorriso/opts_p_z.c
Normal file
1954
xorriso/opts_p_z.c
Normal file
File diff suppressed because it is too large
Load Diff
2386
xorriso/parse_exec.c
Normal file
2386
xorriso/parse_exec.c
Normal file
File diff suppressed because it is too large
Load Diff
92
xorriso/parse_exec.h
Normal file
92
xorriso/parse_exec.h
Normal file
@ -0,0 +1,92 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which deal with parsing
|
||||
and interpretation of command input.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_cmd_includeD
|
||||
#define Xorriso_pvt_cmd_includeD yes
|
||||
|
||||
|
||||
/* @param flag bit0= do not warn of wildcards
|
||||
bit1= these are disk_paths
|
||||
*/
|
||||
int Xorriso_end_idx(struct XorrisO *xorriso,
|
||||
int argc, char **argv, int idx, int flag);
|
||||
|
||||
int Xorriso_opt_args(struct XorrisO *xorriso, char *cmd,
|
||||
int argc, char **argv, int idx,
|
||||
int *end_idx, int *optc, char ***optv, int flag);
|
||||
|
||||
int Xorriso_get_problem_status(struct XorrisO *xorriso, char severity[80],
|
||||
int flag);
|
||||
|
||||
int Xorriso_set_problem_status(struct XorrisO *xorriso, char *severity,
|
||||
int flag);
|
||||
|
||||
/**
|
||||
@param flag bit0= do not issue own event messages
|
||||
bit1= take xorriso->request_to_abort as reason for abort
|
||||
@return Gives the advice:
|
||||
2= pardon was given, go on
|
||||
1= no problem, go on
|
||||
0= function failed but xorriso would not abort, go on
|
||||
<0= do abort
|
||||
-1 = due to problem_status
|
||||
-2 = due to xorriso->request_to_abort
|
||||
*/
|
||||
int Xorriso_eval_problem_status(struct XorrisO *xorriso, int ret, int flag);
|
||||
|
||||
int Xorriso_cpmv_args(struct XorrisO *xorriso, char *cmd,
|
||||
int argc, char **argv, int *idx,
|
||||
int *optc, char ***optv, char eff_dest[SfileadrL],
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= with adr_mode sbsector: adr_value is possibly 16 too high
|
||||
*/
|
||||
int Xorriso_decode_load_adr(struct XorrisO *xorriso, char *cmd,
|
||||
char *adr_mode, char *adr_value,
|
||||
int *entity_code, char entity_id[81],
|
||||
int flag);
|
||||
|
||||
int Xorriso_check_name_len(struct XorrisO *xorriso, char *name, int size,
|
||||
char *cmd, int flag);
|
||||
|
||||
/* @param flag bit0= prepend wd only if name does not begin by '/'
|
||||
bit2= prepend wd (automatically done if wd[0]!=0)
|
||||
*/
|
||||
int Xorriso_make_abs_adr(struct XorrisO *xorriso, char *wd, char *name,
|
||||
char adr[], int flag);
|
||||
|
||||
/* @param flag bit0= do not complain in case of error, but set info_text */
|
||||
int Xorriso_convert_datestring(struct XorrisO *xorriso, char *cmd,
|
||||
char *time_type, char *timestring,
|
||||
int *t_type, time_t *t, int flag);
|
||||
|
||||
int Xorriso_check_temp_mem_limit(struct XorrisO *xorriso, off_t mem, int flag);
|
||||
|
||||
/* @param flag bit0= use env_path to find the desired program
|
||||
*/
|
||||
int Xorriso_execv(struct XorrisO *xorriso, char *cmd, char *env_path,
|
||||
int *status, int flag);
|
||||
|
||||
int Xorriso_path_is_excluded(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
int Xorriso_path_is_hidden(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
|
||||
/* Normalize ACL and sort apart "access" ACL from "default" ACL.
|
||||
*/
|
||||
int Xorriso_normalize_acl_text(struct XorrisO *xorriso, char *in_text,
|
||||
char **access_acl_text, char **default_acl_text, int flag);
|
||||
|
||||
int Xorriso_read_mkisofsrc(struct XorrisO *xorriso, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_cmd_includeD */
|
||||
|
2131
xorriso/read_run.c
Normal file
2131
xorriso/read_run.c
Normal file
File diff suppressed because it is too large
Load Diff
70
xorriso/read_run.h
Normal file
70
xorriso/read_run.h
Normal file
@ -0,0 +1,70 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_read_run_includeD
|
||||
#define Xorriso_pvt_read_run_includeD yes
|
||||
|
||||
|
||||
int Xorriso__read_pacifier(IsoImage *image, IsoFileSource *filesource);
|
||||
|
||||
int Xorriso_restore_properties(struct XorrisO *xorriso, char *disk_path,
|
||||
IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_restore_implicit_properties(struct XorrisO *xorriso,
|
||||
char *full_disk_path, char *disk_path, char *full_img_path, int flag);
|
||||
|
||||
int Xorriso_tree_restore_node(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *img_path, off_t img_offset,
|
||||
char *disk_path, off_t disk_offset, off_t bytes,
|
||||
int flag);
|
||||
|
||||
int Xorriso_restore_overwrite(struct XorrisO *xorriso,
|
||||
IsoNode *node, char *img_path,
|
||||
char *path, char *nominal_path,
|
||||
struct stat *stbuf, int flag);
|
||||
|
||||
int Xorriso_restore_target_hl(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *disk_path, int *node_idx, int flag);
|
||||
|
||||
int Xorriso_restore_prefix_hl(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *disk_path, int node_idx, int flag);
|
||||
|
||||
int Xorriso_register_node_target(struct XorrisO *xorriso, int node_idx,
|
||||
char *disk_path, int flag);
|
||||
|
||||
int Xorriso_restore_disk_object(struct XorrisO *xorriso,
|
||||
char *img_path, IsoNode *node,
|
||||
char *disk_path,
|
||||
off_t offset, off_t bytes, int flag);
|
||||
|
||||
int Xorriso_handle_collision(struct XorrisO *xorriso,
|
||||
IsoNode *node, char *img_path,
|
||||
char *disk_path, char *nominal_disk_path,
|
||||
int *stbuf_ret, int flag);
|
||||
|
||||
int Xorriso_restore_tree(struct XorrisO *xorriso, IsoDir *dir,
|
||||
char *img_dir_path, char *disk_dir_path,
|
||||
off_t boss_mem,
|
||||
struct LinkiteM *link_stack, int flag);
|
||||
|
||||
int Xorriso_read_file_data(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *img_path, char *disk_path,
|
||||
off_t img_offset, off_t disk_offset,
|
||||
off_t bytes, int flag);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_read_run_includeD */
|
||||
|
905
xorriso/sfile.c
Normal file
905
xorriso/sfile.c
Normal file
@ -0,0 +1,905 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the implementation of functions around files and strings.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
|
||||
|
||||
#include "sfile.h"
|
||||
|
||||
|
||||
/* @param flag bit0= do not clip off carriage return at line end
|
||||
*/
|
||||
char *Sfile_fgets_n(char *line, int maxl, FILE *fp, int flag)
|
||||
{
|
||||
int l;
|
||||
char *ret;
|
||||
|
||||
ret= fgets(line,maxl,fp);
|
||||
if(ret==NULL)
|
||||
return(NULL);
|
||||
l= strlen(line);
|
||||
if(l > 0 && !(flag & 1)) if(line[l-1] == '\r') line[--l]= 0;
|
||||
if(l > 0) if(line[l-1] == '\n') line[--l]= 0;
|
||||
if(l > 0 && !(flag & 1)) if(line[l-1] == '\r') line[--l]= 0;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_count_components(char *path, int flag)
|
||||
/*
|
||||
bit0= do not ignore trailing slash
|
||||
bit1= do not ignore empty components (other than the empty root name)
|
||||
*/
|
||||
{
|
||||
int l,count= 0;
|
||||
char *cpt;
|
||||
|
||||
l= strlen(path);
|
||||
if(l==0)
|
||||
return(0);
|
||||
count= 1;
|
||||
for(cpt= path+l-1;cpt>=path;cpt--) {
|
||||
if(*cpt=='/') {
|
||||
if(*(cpt+1)==0 && !(flag&1))
|
||||
continue;
|
||||
if(*(cpt+1)=='/' && !(flag&2))
|
||||
continue;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return(count);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_component_pointer(char *path, char **sourcept, int idx, int flag)
|
||||
/*
|
||||
bit0= do not ignore trailing slash
|
||||
bit1= do not ignore empty components (other than the empty root name)
|
||||
bit2= accept 0 as '/'
|
||||
*/
|
||||
{
|
||||
int count= 0;
|
||||
char *spt;
|
||||
|
||||
for(spt= path;*spt!=0 || (flag&4);spt++) {
|
||||
if(count>=idx) {
|
||||
*sourcept= spt;
|
||||
return(1);
|
||||
}
|
||||
if(*spt=='/' || *spt==0) {
|
||||
if(*(spt+1)=='/' && !(flag&2))
|
||||
continue;
|
||||
if(*(spt+1)==0 && !(flag&1))
|
||||
continue;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if((flag&1) && count>=idx)
|
||||
return(1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_leafname(char *path, char leafname[SfileadrL], int flag)
|
||||
{
|
||||
int count, ret;
|
||||
char *lpt;
|
||||
|
||||
leafname[0]= 0;
|
||||
count= Sfile_count_components(path, 0);
|
||||
if(count==0)
|
||||
return(0);
|
||||
ret= Sfile_component_pointer(path, &lpt, count-1, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
if(Sfile_str(leafname, lpt, 0)<=0)
|
||||
return(0);
|
||||
lpt= strchr(leafname, '/');
|
||||
if(lpt!=NULL)
|
||||
*lpt= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_add_to_path(char path[SfileadrL], char *addon, int flag)
|
||||
{
|
||||
int l;
|
||||
|
||||
l= strlen(path);
|
||||
if(l+1>=SfileadrL)
|
||||
return(0);
|
||||
if(l==0) {
|
||||
strcpy(path,"/");
|
||||
l= 1;
|
||||
} else if(path[l-1]!='/') {
|
||||
path[l++]= '/';
|
||||
path[l]= 0;
|
||||
}
|
||||
if(l+strlen(addon)>=SfileadrL)
|
||||
return(0);
|
||||
if(addon[0]=='/')
|
||||
strcpy(path+l,addon+1);
|
||||
else
|
||||
strcpy(path+l,addon);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_prepend_path(char *prefix, char path[SfileadrL], int flag)
|
||||
{
|
||||
int l, i, slashes, prefix_len, path_len;
|
||||
|
||||
l= strlen(prefix);
|
||||
if(l == 0)
|
||||
return(1);
|
||||
|
||||
/* Do not copy slashes between both parts */
|
||||
for(prefix_len= l; prefix_len > 0; prefix_len--)
|
||||
if(prefix[prefix_len - 1] != '/')
|
||||
break;
|
||||
if(prefix_len == 0)
|
||||
prefix_len= strlen(prefix) - 1;
|
||||
path_len= strlen(path);
|
||||
for(slashes= 0; slashes < path_len; slashes++)
|
||||
if(path[slashes] != '/')
|
||||
break;
|
||||
|
||||
l= (strlen(path) - slashes) + prefix_len + 1;
|
||||
if(l>=SfileadrL) {
|
||||
|
||||
#ifdef Not_yeT
|
||||
/* >>> ??? how to transport messages to xorriso ? */
|
||||
sprintf(xorriso->info_text,
|
||||
"Combination of wd and relative address too long (%d > %d)",
|
||||
l,SfileadrL-1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
#endif
|
||||
|
||||
return(-1);
|
||||
}
|
||||
l-= strlen(path);
|
||||
if(l < 0) {
|
||||
for(i= slashes; i <= path_len + 1; i++)
|
||||
path[i+l]= path[i];
|
||||
} else if(l > 0) {
|
||||
for(i= path_len + 1; i >= slashes; i--)
|
||||
path[i+l]= path[i];
|
||||
}
|
||||
if(prefix_len > 0)
|
||||
memcpy(path, prefix, prefix_len);
|
||||
path[l - 1 + slashes]= '/';
|
||||
return(1);
|
||||
}
|
||||
|
||||
int Sfile_being_group_member(struct stat *stbuf, int flag)
|
||||
{
|
||||
int i, suppl_groups;
|
||||
gid_t *suppl_glist;
|
||||
|
||||
if (getegid()==stbuf->st_gid)
|
||||
return(1);
|
||||
suppl_groups= getgroups(0, NULL);
|
||||
suppl_glist= (gid_t *) malloc((suppl_groups + 1) * sizeof(gid_t));
|
||||
if (suppl_glist==NULL)
|
||||
return(-1);
|
||||
suppl_groups= getgroups(suppl_groups+1,suppl_glist);
|
||||
for (i= 0; i<suppl_groups; i++) {
|
||||
if (suppl_glist[i]==stbuf->st_gid) {
|
||||
free((char *) suppl_glist);
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
free((char *) suppl_glist);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_type(char *filename, int flag)
|
||||
/*
|
||||
bit0= return -1 if file is missing
|
||||
bit1= return a hardlink with siblings as type 5
|
||||
bit2= evaluate eventual link target rather than the link object itself
|
||||
bit3= return a socket or a char device as types 7 or 8 rather than 0
|
||||
*/
|
||||
/*
|
||||
return:
|
||||
0=unknown
|
||||
1=regular
|
||||
2=directory
|
||||
3=symbolic link
|
||||
4=named pipe
|
||||
5=multiple hardlink (with bit1)
|
||||
6=block device
|
||||
7=socket (with bit3)
|
||||
8=character device (with bit3)
|
||||
*/
|
||||
{
|
||||
struct stat stbuf;
|
||||
if(flag&4) {
|
||||
if(stat(filename,&stbuf)==-1) {
|
||||
if(flag&1) return(-1);
|
||||
else return(0);
|
||||
}
|
||||
} else {
|
||||
if(lstat(filename,&stbuf)==-1) {
|
||||
if(flag&1) return(-1);
|
||||
else return(0);
|
||||
}
|
||||
}
|
||||
if(S_ISREG(stbuf.st_mode)) {
|
||||
if(flag&2)
|
||||
if(stbuf.st_nlink>1)
|
||||
return(5);
|
||||
return(1);
|
||||
}
|
||||
if(S_ISDIR(stbuf.st_mode))
|
||||
return(2);
|
||||
if((stbuf.st_mode&S_IFMT)==S_IFLNK)
|
||||
return(3);
|
||||
if(S_ISFIFO(stbuf.st_mode))
|
||||
return(4);
|
||||
if(S_ISBLK(stbuf.st_mode))
|
||||
return(6);
|
||||
if(flag&8)
|
||||
if((stbuf.st_mode&S_IFMT)==S_IFSOCK)
|
||||
return(7);
|
||||
if(flag&8)
|
||||
if(S_ISCHR(stbuf.st_mode))
|
||||
return(8);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
char *Sfile_datestr(time_t tim, short int flag)
|
||||
/*
|
||||
bit0=with hours+minutes
|
||||
bit1=with seconds
|
||||
|
||||
bit8= local time rather than UTC
|
||||
*/
|
||||
{
|
||||
static char zeitcode[80]={"000000"};
|
||||
char puff[80];
|
||||
struct tm *azt;
|
||||
|
||||
if(flag&256)
|
||||
azt = localtime(&tim);
|
||||
else
|
||||
azt = gmtime(&tim);
|
||||
|
||||
if(azt->tm_year>99)
|
||||
sprintf(zeitcode,"%c%1.1d%2.2d%2.2d",
|
||||
'A'+(azt->tm_year-100)/10,azt->tm_year%10,
|
||||
azt->tm_mon+1,azt->tm_mday);
|
||||
else
|
||||
sprintf(zeitcode,"%2.2d%2.2d%2.2d",
|
||||
azt->tm_year,azt->tm_mon+1,azt->tm_mday);
|
||||
if(flag&1){
|
||||
sprintf(puff,".%2.2d%2.2d",azt->tm_hour,azt->tm_min);
|
||||
strcat(zeitcode,puff);
|
||||
}
|
||||
if(flag&2){
|
||||
sprintf(puff,"%2.2d",azt->tm_sec);
|
||||
strcat(zeitcode,puff);
|
||||
}
|
||||
|
||||
return(zeitcode);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_scale(double value, char *result, int siz, double thresh, int flag)
|
||||
/*
|
||||
bit0= eventually ommit 'b'
|
||||
bit1= make text as short as possible
|
||||
bit2= no fraction (if it would fit at all)
|
||||
*/
|
||||
{
|
||||
char scale_c,scales[7],form[80], *negpt= NULL, *cpt;
|
||||
int i,dec_siz= 0,avail_siz= 1;
|
||||
|
||||
if(value<0) {
|
||||
value= -value;
|
||||
siz--;
|
||||
result[0]= '-';
|
||||
negpt= result;
|
||||
result++;
|
||||
}
|
||||
strcpy(scales,"bkmgtp");
|
||||
scale_c= scales[0];
|
||||
for(i=1;scales[i]!=0;i++) {
|
||||
if(value<thresh-0.5)
|
||||
break;
|
||||
value/= 1024.0;
|
||||
scale_c= scales[i];
|
||||
}
|
||||
if(scale_c!='b' && !(flag&4)) { /* is there room for fractional part ? */
|
||||
avail_siz= siz-1;
|
||||
sprintf(form,"%%.f");
|
||||
sprintf(result,"%.f",value);
|
||||
if(((int) strlen(result)) <= avail_siz - 2)
|
||||
dec_siz= 1; /* we are very modest */
|
||||
}
|
||||
if(scale_c=='b' && (flag&1)) {
|
||||
if(flag&2)
|
||||
sprintf(form,"%%.f");
|
||||
else
|
||||
sprintf(form,"%%%d.f",siz);
|
||||
sprintf(result,form,value);
|
||||
} else {
|
||||
if(flag&2)
|
||||
sprintf(form,"%%.f%%c");
|
||||
else if(dec_siz>0)
|
||||
sprintf(form,"%%%d.%df%%c",avail_siz,dec_siz);
|
||||
else
|
||||
sprintf(form,"%%%d.f%%c",siz-1);
|
||||
sprintf(result,form,value,scale_c);
|
||||
}
|
||||
if(negpt != NULL) {
|
||||
for(cpt= result; *cpt==' '; cpt++);
|
||||
if(cpt > result) {
|
||||
*negpt= ' ';
|
||||
*(cpt - 1)= '-';
|
||||
}
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_off_t_text(char text[80], off_t num, int flag)
|
||||
{
|
||||
char *tpt;
|
||||
off_t hnum, scale= 1;
|
||||
int digits= 0, d, i;
|
||||
|
||||
tpt= text;
|
||||
hnum= num;
|
||||
if(hnum<0) {
|
||||
*(tpt++)= '-';
|
||||
hnum= -num;
|
||||
}
|
||||
if(hnum<0) { /* it can stay nastily persistent */
|
||||
strcpy(text, "_overflow_");
|
||||
return(0);
|
||||
}
|
||||
for(i= 0; i<23; i++) { /* good for up to 70 bit = 10 exp 21.07... */
|
||||
if(hnum==0)
|
||||
break;
|
||||
hnum/= 10;
|
||||
if(hnum)
|
||||
scale*= 10;
|
||||
}
|
||||
if(i==0) {
|
||||
strcpy(text, "0");
|
||||
return(1);
|
||||
}
|
||||
if(i==23) {
|
||||
strcpy(text, "_overflow_");
|
||||
return(0);
|
||||
}
|
||||
digits= i;
|
||||
hnum= num;
|
||||
for(; i>0; i--) {
|
||||
d= hnum/scale;
|
||||
tpt[digits-i]= '0'+d;
|
||||
hnum= hnum%scale;
|
||||
scale/= 10;
|
||||
}
|
||||
tpt[digits]= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* Converts backslash codes into single characters:
|
||||
\a BEL 7 , \b BS 8 , \e ESC 27 , \f FF 12 , \n LF 10 , \r CR 13 ,
|
||||
\t HT 9 , \v VT 11 , \\ \ 92
|
||||
\[0-9][0-9][0-9] octal code , \x[0-9a-f][0-9a-f] hex code ,
|
||||
\cX control-x (ascii(X)-64)
|
||||
@param upto maximum number of characters to examine for backslash.
|
||||
The scope of a backslash (0 to 3 characters) is not affected.
|
||||
@param eaten returns the difference in length between input and output
|
||||
@param flag bit0= only determine *eaten, do not convert
|
||||
bit1= allow to convert \000 to binary 0
|
||||
*/
|
||||
int Sfile_bsl_interpreter(char *text, int upto, int *eaten, int flag)
|
||||
{
|
||||
char *rpt, *wpt, num_text[8], wdummy[8];
|
||||
unsigned int num= 0;
|
||||
|
||||
*eaten= 0;
|
||||
wpt= text;
|
||||
for(rpt= text; *rpt != 0 && rpt - text < upto; rpt++) {
|
||||
if(flag & 1)
|
||||
wpt= wdummy;
|
||||
if(*rpt == '\\') {
|
||||
rpt++;
|
||||
(*eaten)++;
|
||||
if(*rpt == 'a') {
|
||||
*(wpt++)= 7;
|
||||
} else if(*rpt == 'b') {
|
||||
*(wpt++)= 8;
|
||||
} else if(*rpt == 'e') {
|
||||
*(wpt++)= 27;
|
||||
} else if(*rpt == 'f') {
|
||||
*(wpt++)= 12;
|
||||
} else if(*rpt == 'n') {
|
||||
*(wpt++)= 10;
|
||||
} else if(*rpt == 'r') {
|
||||
*(wpt++)= 13;
|
||||
} else if(*rpt == 't') {
|
||||
*(wpt++)= 9;
|
||||
} else if(*rpt == 'v') {
|
||||
*(wpt++)= 11;
|
||||
} else if(*rpt == '\\') {
|
||||
*(wpt++)= '\\';
|
||||
} else if(rpt[0] >= '0' && rpt[0] <= '7' &&
|
||||
rpt[1] >= '0' && rpt[1] <= '7' &&
|
||||
rpt[2] >= '0' && rpt[2] <= '7') {
|
||||
num_text[0]= '0';
|
||||
num_text[1]= *(rpt + 0);
|
||||
num_text[2]= *(rpt + 1);
|
||||
num_text[3]= *(rpt + 2);
|
||||
num_text[4]= 0;
|
||||
sscanf(num_text, "%o", &num);
|
||||
if((num > 0 || (flag & 2)) && num <= 255) {
|
||||
rpt+= 2;
|
||||
(*eaten)+= 2;
|
||||
*(wpt++)= num;
|
||||
} else
|
||||
goto not_a_code;
|
||||
} else if(rpt[0] == 'x' &&
|
||||
((rpt[1] >= '0' && rpt[1] <= '9') ||
|
||||
(rpt[1] >= 'A' && rpt[1] <= 'F') ||
|
||||
(rpt[1] >= 'a' && rpt[1] <= 'f'))
|
||||
&&
|
||||
((rpt[2] >= '0' && rpt[2] <= '9') ||
|
||||
(rpt[2] >= 'A' && rpt[2] <= 'F') ||
|
||||
(rpt[2] >= 'a' && rpt[2] <= 'f'))
|
||||
) {
|
||||
num_text[0]= *(rpt + 1);
|
||||
num_text[1]= *(rpt + 2);
|
||||
num_text[2]= 0;
|
||||
sscanf(num_text, "%x", &num);
|
||||
if(num > 0 && num <= 255) {
|
||||
rpt+= 2;
|
||||
(*eaten)+= 2;
|
||||
*(wpt++)= num;
|
||||
} else
|
||||
goto not_a_code;
|
||||
} else if(*rpt == 'c') {
|
||||
if(rpt[1] > 64 && rpt[1] < 96) {
|
||||
*(wpt++)= rpt[1] - 64;
|
||||
rpt++;
|
||||
(*eaten)++;
|
||||
} else
|
||||
goto not_a_code;
|
||||
} else {
|
||||
not_a_code:;
|
||||
*(wpt++)= '\\';
|
||||
rpt--;
|
||||
(*eaten)--;
|
||||
}
|
||||
} else
|
||||
*(wpt++)= *rpt;
|
||||
}
|
||||
*wpt= *rpt;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_argv_bsl(int argc, char ***argv, int flag)
|
||||
{
|
||||
int i, ret, eaten;
|
||||
char **new_argv= NULL;
|
||||
|
||||
if(argc <= 0)
|
||||
return(0);
|
||||
new_argv= (char **) Smem_malloC(argc * sizeof(char *));
|
||||
if(new_argv == NULL)
|
||||
return(-1);
|
||||
for(i= 0; i < argc; i++) {
|
||||
new_argv[i]= strdup((*argv)[i]);
|
||||
if(new_argv[i] == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
ret= Sfile_bsl_interpreter(new_argv[i], strlen(new_argv[i]), &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(ret <= 0) {
|
||||
if(new_argv != NULL)
|
||||
free((char *) new_argv);
|
||||
} else
|
||||
*argv= new_argv;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= only encode inside quotes
|
||||
bit1= encode < 32 outside quotes except 7, 8, 9, 10, 12, 13
|
||||
bit2= encode in any case above 126
|
||||
bit3= encode in any case shellsafe and name-value-safe:
|
||||
<=42 , 59, 60, 61, 62, 63, 92, 94, 96, >=123
|
||||
*/
|
||||
int Sfile_bsl_encoder(char **result, char *text, size_t text_len, int flag)
|
||||
{
|
||||
signed char *rpt;
|
||||
char *wpt;
|
||||
int count, sq_open= 0, dq_open= 0;
|
||||
|
||||
count= 0;
|
||||
for(rpt= (signed char *) text; (size_t) (((char *) rpt) - text) < text_len;
|
||||
rpt++) {
|
||||
count++;
|
||||
if(flag & 8) {
|
||||
if(!(*rpt <= 42 || (*rpt >= 59 && *rpt <= 63) ||
|
||||
*rpt == 92 || *rpt == 94 || *rpt == 96 || *rpt >= 123))
|
||||
continue;
|
||||
} else if(*rpt >= 32 && *rpt <= 126 && *rpt != '\\')
|
||||
continue;
|
||||
if(((*rpt >= 7 && *rpt <= 13) || *rpt == 27 || *rpt == '\\') && !(flag & 8))
|
||||
count++;
|
||||
else
|
||||
count+= 3;
|
||||
}
|
||||
(*result)= wpt= calloc(count + 1, 1);
|
||||
if(wpt == NULL)
|
||||
return(-1);
|
||||
for(rpt= (signed char *) text; (size_t) (((char *) rpt) - text) < text_len;
|
||||
rpt++) {
|
||||
if(*rpt == '\'')
|
||||
sq_open= !(sq_open || dq_open);
|
||||
if(*rpt == '"')
|
||||
dq_open= !(sq_open || dq_open);
|
||||
|
||||
if(flag & 8) {
|
||||
if(!(*rpt <= 42 || (*rpt >= 59 && *rpt <= 63) ||
|
||||
*rpt == 92 || *rpt == 94 || *rpt == 96 || *rpt >= 123)) {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
}
|
||||
} else if(*rpt >= 32 && *rpt <= 126 && *rpt != '\\') {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
} else if( ((flag & 1) && !(sq_open || dq_open)) &&
|
||||
!((flag & 2) && (*rpt >= 1 && * rpt <= 31 &&
|
||||
!(*rpt == 7 || *rpt == 8 || *rpt == 9 || *rpt == 10 ||
|
||||
*rpt == 12 || *rpt == 13))) &&
|
||||
!((flag & 4) && (*rpt > 126 || *rpt < 0)) &&
|
||||
!((flag & 6) && *rpt == '\\')) {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
}
|
||||
*(wpt++)= '\\';
|
||||
if(((*rpt >= 7 && *rpt <= 13) || *rpt == 27 || *rpt == '\\') && !(flag&8)) {
|
||||
if(*rpt == 7)
|
||||
*(wpt++)= 'a';
|
||||
else if(*rpt == 8)
|
||||
*(wpt++)= 'b';
|
||||
else if(*rpt == 9)
|
||||
*(wpt++)= 't';
|
||||
else if(*rpt == 10) {
|
||||
*(wpt++)= 'n';
|
||||
} else if(*rpt == 11)
|
||||
*(wpt++)= 'v';
|
||||
else if(*rpt == 12)
|
||||
*(wpt++)= 'f';
|
||||
else if(*rpt == 13)
|
||||
*(wpt++)= 'c';
|
||||
else if(*rpt == 27)
|
||||
*(wpt++)= 'e';
|
||||
else if(*rpt == '\\')
|
||||
*(wpt++)= '\\';
|
||||
} else {
|
||||
sprintf(wpt, "%-3.3o", (unsigned int) *((unsigned char *) rpt));
|
||||
wpt+= 3;
|
||||
}
|
||||
}
|
||||
*wpt= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_destroy_argv(int *argc, char ***argv, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(*argc>0 && *argv!=NULL){
|
||||
for(i=0;i<*argc;i++){
|
||||
if((*argv)[i]!=NULL)
|
||||
Smem_freE((*argv)[i]);
|
||||
}
|
||||
Smem_freE((char *) *argv);
|
||||
}
|
||||
*argc= 0;
|
||||
*argv= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv,
|
||||
int flag)
|
||||
/*
|
||||
bit0= read progname as first argument from line
|
||||
bit1= just release argument list argv and return
|
||||
bit2= abort with return(0) if incomplete quotes are found
|
||||
bit3= eventually prepend missing '-' to first argument read from line
|
||||
bit4= like bit2 but only check quote completeness, do not allocate memory
|
||||
bit5+6= interpretation of backslashes:
|
||||
0= no interpretation, leave unchanged
|
||||
1= only inside double quotes
|
||||
2= outside single quotes
|
||||
3= everywhere
|
||||
bit7= append a NULL element to argv
|
||||
*/
|
||||
{
|
||||
int i,pass,maxl=0,l,argzaehl=0,bufl,line_start_argc, bsl_mode, ret= 0, eaten;
|
||||
char *cpt,*start;
|
||||
char *buf= NULL;
|
||||
|
||||
Sfile_destroy_argv(argc,argv,0);
|
||||
if(flag&2)
|
||||
{ret= 1; goto ex;}
|
||||
|
||||
if(flag & 16)
|
||||
flag|= 4;
|
||||
bsl_mode= (flag >> 5) & 3;
|
||||
|
||||
buf= calloc(strlen(line) + SfileadrL, 1);
|
||||
if(buf == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
for(pass=0;pass<2;pass++) {
|
||||
cpt= line-1;
|
||||
if(!(flag&1)){
|
||||
argzaehl= line_start_argc= 1;
|
||||
if(pass==0)
|
||||
maxl= strlen(progname);
|
||||
else
|
||||
strcpy((*argv)[0],progname);
|
||||
} else {
|
||||
argzaehl= line_start_argc= 0;
|
||||
if(pass==0) maxl= 0;
|
||||
}
|
||||
while(*(++cpt)!=0){
|
||||
if(isspace(*cpt)) continue;
|
||||
start= cpt;
|
||||
buf[0]= 0;
|
||||
cpt--;
|
||||
while(*(++cpt)!=0) {
|
||||
if(isspace(*cpt)) break;
|
||||
if(*cpt=='"'){
|
||||
l= cpt-start; bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
|
||||
if(bsl_mode >= 3) {
|
||||
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
l= strlen(buf);
|
||||
start= cpt+1;
|
||||
while(*(++cpt)!=0) if(*cpt=='"') break;
|
||||
if((flag&4) && *cpt==0)
|
||||
{ret= 0; goto ex;}
|
||||
l= cpt-start; bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncpy(buf + bufl, start, l);
|
||||
buf[bufl + l]= 0;
|
||||
if(bsl_mode >= 1) {
|
||||
ret= Sfile_bsl_interpreter(buf + bufl, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
start= cpt+1;
|
||||
}else if(*cpt=='\''){
|
||||
l= cpt-start; bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
|
||||
if(bsl_mode >= 3) {
|
||||
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
l= strlen(buf);
|
||||
start= cpt+1;
|
||||
while(*(++cpt)!=0) if(*cpt=='\'') break;
|
||||
if((flag&4) && *cpt==0)
|
||||
{ret= 0; goto ex;}
|
||||
l= cpt-start; bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncat(buf,start,l);buf[bufl+l]= 0;
|
||||
if(bsl_mode >= 2) {
|
||||
ret= Sfile_bsl_interpreter(buf + bufl, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
start= cpt+1;
|
||||
}
|
||||
if(*cpt==0) break;
|
||||
}
|
||||
l= cpt-start;
|
||||
bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
|
||||
if(bsl_mode >= 3) {
|
||||
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
l= strlen(buf);
|
||||
if(pass==0){
|
||||
if(argzaehl==line_start_argc && (flag&8))
|
||||
if(buf[0]!='-' && buf[0]!=0 && buf[0]!='#')
|
||||
l++;
|
||||
if(l>maxl) maxl= l;
|
||||
}else{
|
||||
strcpy((*argv)[argzaehl],buf);
|
||||
if(argzaehl==line_start_argc && (flag&8))
|
||||
if(buf[0]!='-' && buf[0]!=0 && buf[0]!='#')
|
||||
sprintf((*argv)[argzaehl],"-%s", buf);
|
||||
}
|
||||
argzaehl++;
|
||||
if(*cpt==0) break;
|
||||
}
|
||||
if(pass==0){
|
||||
if(flag & 16)
|
||||
{ret= 1; goto ex;}
|
||||
*argc= argzaehl;
|
||||
if(argzaehl>0 || (flag & 128)) {
|
||||
*argv= (char **) Smem_malloC((argzaehl + !!(flag & 128))
|
||||
* sizeof(char *));
|
||||
if(*argv==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
for(i=0;i<*argc;i++) {
|
||||
(*argv)[i]= (char *) Smem_malloC((maxl+1));
|
||||
if((*argv)[i]==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
if(flag & 128)
|
||||
(*argv)[*argc]= NULL;
|
||||
}
|
||||
}
|
||||
ret= 1;
|
||||
ex:
|
||||
if(buf != NULL)
|
||||
free(buf);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= append */
|
||||
int Sfile_str(char target[SfileadrL], char *source, int flag)
|
||||
{
|
||||
int l;
|
||||
|
||||
l= strlen(source);
|
||||
if(flag&1)
|
||||
l+= strlen(target);
|
||||
if(l>=SfileadrL) {
|
||||
fprintf(stderr, "--- Path string overflow (%d > %d). Malicious input ?\n",
|
||||
l,SfileadrL-1);
|
||||
return(0);
|
||||
}
|
||||
if(flag&1)
|
||||
strcat(target, source);
|
||||
else
|
||||
strcpy(target, source);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/** Combine environment variable HOME with given filename
|
||||
@param filename Address relative to $HOME
|
||||
@param fileadr Resulting combined address
|
||||
@param fa_size Size of array fileadr
|
||||
@param flag Unused yet
|
||||
@return 1=ok , 0=no HOME variable , -1=result address too long
|
||||
*/
|
||||
int Sfile_home_adr_s(char *filename, char *fileadr, int fa_size, int flag)
|
||||
{
|
||||
char *home;
|
||||
|
||||
strcpy(fileadr,filename);
|
||||
home= getenv("HOME");
|
||||
if(home==NULL)
|
||||
return(0);
|
||||
if((int) (strlen(home) + strlen(filename) + 1) >= fa_size)
|
||||
return(-1);
|
||||
strcpy(fileadr,home);
|
||||
if(filename[0]!=0){
|
||||
strcat(fileadr,"/");
|
||||
strcat(fileadr,filename);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/** Return a double representing seconds and microseconds since 1 Jan 1970 */
|
||||
double Sfile_microtime(int flag)
|
||||
{
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
gettimeofday(&tv,&tz);
|
||||
return((double) (tv.tv_sec+1.0e-6*tv.tv_usec));
|
||||
}
|
||||
|
||||
|
||||
int Sfile_decode_datestr(struct tm *reply, char *text, int flag)
|
||||
/* YYMMDD[.hhmm[ss]] */
|
||||
{
|
||||
int i,l;
|
||||
time_t current_time;
|
||||
struct tm *now;
|
||||
|
||||
current_time= time(0);
|
||||
now= localtime(¤t_time);
|
||||
for(i=0; i < (int) sizeof(struct tm); i++)
|
||||
((char *) reply)[i]= ((char *) now)[i];
|
||||
|
||||
if(text[0]<'0'|| (text[0]>'9' && text[0]<'A') || text[0]>'Z')
|
||||
return(0);
|
||||
l= strlen(text);
|
||||
for(i=1;i<l;i++)
|
||||
if(text[i]<'0'||text[i]>'9')
|
||||
break;
|
||||
if(i!=6)
|
||||
return(0);
|
||||
if(text[i]==0)
|
||||
goto decode;
|
||||
if(text[i]!='.' || (l!=11 && l!=13))
|
||||
return(0);
|
||||
for(i++;i<l;i++)
|
||||
if(text[i]<'0'||text[i]>'9')
|
||||
break;
|
||||
if(i!=l)
|
||||
return(0);
|
||||
|
||||
decode:;
|
||||
reply->tm_hour= 0;
|
||||
reply->tm_min= 0;
|
||||
reply->tm_sec= 0;
|
||||
i= 0;
|
||||
if(text[0]>='A')
|
||||
reply->tm_year= 100+(text[i]-'A')*10+text[1]-'0';
|
||||
else
|
||||
reply->tm_year= 10*(text[0]-'0')+text[1]-'0';
|
||||
reply->tm_mon= 10*(text[2]-'0')+text[3]-'0'-1;
|
||||
reply->tm_mday= 10*(text[4]-'0')+text[5]-'0';
|
||||
if(l==6)
|
||||
return(1);
|
||||
reply->tm_hour= 10*(text[7]-'0')+text[8]-'0';
|
||||
reply->tm_min= 10*(text[9]-'0')+text[10]-'0';
|
||||
if(l==11)
|
||||
return(1);
|
||||
reply->tm_sec= 10*(text[11]-'0')+text[12]-'0';
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
135
xorriso/sfile.h
Normal file
135
xorriso/sfile.h
Normal file
@ -0,0 +1,135 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions around files and strings.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_sfile_includeD
|
||||
#define Xorriso_pvt_sfile_includeD yes
|
||||
|
||||
#define TSOB_FELD(typ, count) (typ *) calloc(1, (count)*sizeof(typ));
|
||||
#define Smem_malloC malloc
|
||||
#define Smem_freE free
|
||||
|
||||
#define Xorriso_alloc_meM(pt, typ, count) { \
|
||||
pt= (typ *) calloc(1, (count) * sizeof(typ)); \
|
||||
if(pt == NULL) { \
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0); \
|
||||
ret= -1; \
|
||||
goto ex; \
|
||||
} }
|
||||
|
||||
#define Xorriso_free_meM(pt) { \
|
||||
if(pt != NULL) \
|
||||
free((char *) pt); \
|
||||
}
|
||||
|
||||
|
||||
#define SfileadrL 4096
|
||||
|
||||
|
||||
int Sfile_str(char target[SfileadrL], char *source, int flag);
|
||||
|
||||
double Sfile_microtime(int flag);
|
||||
|
||||
int Sfile_add_to_path(char path[SfileadrL], char *addon, int flag);
|
||||
|
||||
int Sfile_scale(double value, char *result, int siz, double thresh, int flag);
|
||||
|
||||
int Sfile_destroy_argv(int *argc, char ***argv, int flag);
|
||||
|
||||
/*
|
||||
bit0= do not ignore trailing slash
|
||||
bit1= do not ignore empty components (other than the empty root name)
|
||||
*/
|
||||
int Sfile_count_components(char *path, int flag);
|
||||
|
||||
/*
|
||||
@param flag
|
||||
bit0= return -1 if file is missing
|
||||
bit1= return a hardlink with siblings as type 5
|
||||
bit2= evaluate eventual link target rather than the link object itself
|
||||
bit3= return a socket or a char device as types 7 or 8 rather than 0
|
||||
@return
|
||||
0=unknown
|
||||
1=regular
|
||||
2=directory
|
||||
3=symbolic link
|
||||
4=named pipe
|
||||
5=multiple hardlink (with bit1)
|
||||
6=block device
|
||||
7=socket (with bit3)
|
||||
8=character device (with bit3)
|
||||
*/
|
||||
int Sfile_type(char *filename, int flag);
|
||||
|
||||
/* @param flag bit0= only encode inside quotes
|
||||
bit1= encode < 32 outside quotes except 7, 8, 9, 10, 12, 13
|
||||
bit2= encode in any case above 126
|
||||
bit3= encode in any case shellsafe:
|
||||
<=42 , 59, 60, 62, 63, 92, 94, 96, >=123
|
||||
*/
|
||||
int Sfile_bsl_encoder(char **result, char *text, size_t text_len, int flag);
|
||||
|
||||
int Sfile_argv_bsl(int argc, char ***argv, int flag);
|
||||
|
||||
/*
|
||||
bit0= read progname as first argument from line
|
||||
bit1= just release argument list argv and return
|
||||
bit2= abort with return(0) if incomplete quotes are found
|
||||
bit3= eventually prepend missing '-' to first argument read from line
|
||||
bit4= like bit2 but only check quote completeness, do not allocate memory
|
||||
bit5+6= interpretation of backslashes:
|
||||
0= no interpretation, leave unchanged
|
||||
1= only inside double quotes
|
||||
2= outside single quotes
|
||||
3= everywhere
|
||||
bit7= append a NULL element to argv
|
||||
*/
|
||||
int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv,
|
||||
int flag);
|
||||
|
||||
/* YYMMDD[.hhmm[ss]] */
|
||||
int Sfile_decode_datestr(struct tm *reply, char *text, int flag);
|
||||
|
||||
int Sfile_off_t_text(char text[80], off_t num, int flag);
|
||||
|
||||
int Sfile_leafname(char *path, char leafname[SfileadrL], int flag);
|
||||
|
||||
/* @param flag bit0= do not clip of carriage return at line end
|
||||
*/
|
||||
char *Sfile_fgets_n(char *line, int maxl, FILE *fp, int flag);
|
||||
|
||||
/*
|
||||
bit0=with hours+minutes
|
||||
bit1=with seconds
|
||||
|
||||
bit8= local time rather than UTC
|
||||
*/
|
||||
char *Sfile_datestr(time_t tim, short int flag);
|
||||
|
||||
/* Converts backslash codes into single characters:
|
||||
\a BEL 7 , \b BS 8 , \e ESC 27 , \f FF 12 , \n LF 10 , \r CR 13 ,
|
||||
\t HT 9 , \v VT 11 , \\ \ 92
|
||||
\[0-9][0-9][0-9] octal code , \x[0-9a-f][0-9a-f] hex code ,
|
||||
\cX control-x (ascii(X)-64)
|
||||
@param upto maximum number of characters to examine for backslash.
|
||||
The scope of a backslash (0 to 3 characters) is not affected.
|
||||
@param eaten returns the difference in length between input and output
|
||||
@param flag bit0= only determine *eaten, do not convert
|
||||
bit1= allow to convert \000 to binary 0
|
||||
*/
|
||||
int Sfile_bsl_interpreter(char *text, int upto, int *eaten, int flag);
|
||||
|
||||
int Sfile_prepend_path(char *prefix, char path[SfileadrL], int flag);
|
||||
|
||||
int Sfile_home_adr_s(char *filename, char *fileadr, int fa_size, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_sfile_includeD */
|
||||
|
722
xorriso/sort_cmp.c
Normal file
722
xorriso/sort_cmp.c
Normal file
@ -0,0 +1,722 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which sort and compare tree nodes.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
#include "base_obj.h"
|
||||
#include "lib_mgt.h"
|
||||
#include "sort_cmp.h"
|
||||
#include "iso_tree.h"
|
||||
#include "iso_manip.h"
|
||||
|
||||
|
||||
int Xorriso__findi_sorted_ino_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
IsoNode *n1, *n2;
|
||||
|
||||
n1= *((IsoNode **) p1);
|
||||
n2= *((IsoNode **) p2);
|
||||
|
||||
ret= Xorriso__node_lba_cmp(&n1, &n2);
|
||||
if(ret)
|
||||
return (ret > 0 ? 1 : -1);
|
||||
ret= iso_node_cmp_ino(n1, n2, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* Not suitable for qsort() but for cross-array comparisons.
|
||||
p1 and p2 are actually IsoNode *p1, IsoNode *p2
|
||||
*/
|
||||
int Xorriso__hln_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= Xorriso__findi_sorted_ino_cmp(&p1, &p2);
|
||||
if(ret)
|
||||
return (ret > 0 ? 1 : -1);
|
||||
if(p1 != p2)
|
||||
return(p1 < p2 ? -1 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
p1 and p2 are actually IsoNode **p1, IsoNode **p2
|
||||
*/
|
||||
int Xorriso__findi_sorted_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= Xorriso__findi_sorted_ino_cmp(p1, p2);
|
||||
if(ret)
|
||||
return (ret > 0 ? 1 : -1);
|
||||
if(p1 != p2)
|
||||
return(p1 < p2 ? -1 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_sort_node_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
if(xorriso->node_counter <= 0)
|
||||
return(0);
|
||||
qsort(xorriso->node_array, xorriso->node_counter, sizeof(IsoNode *),
|
||||
Xorriso__findi_sorted_cmp);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__search_node(void *node_array[], int n,
|
||||
int (*cmp)(const void *p1, const void *p2),
|
||||
void *node, int *idx, int flag)
|
||||
{
|
||||
int ret, l, r, p, pos;
|
||||
|
||||
if(n == 0)
|
||||
return(0);
|
||||
l= 0;
|
||||
r= n + 1;
|
||||
while(1) {
|
||||
p= (r - l) / 2;
|
||||
if(p == 0)
|
||||
break;
|
||||
p+= l;
|
||||
|
||||
/* NULL elements may indicate invalid nodes. Their first valid right neigbor
|
||||
will serve as proxy. If none exists, then the test pushes leftwards.
|
||||
*/
|
||||
for(pos= p - 1; pos < n; pos++)
|
||||
if(node_array[pos] != NULL)
|
||||
break;
|
||||
if(pos < n)
|
||||
ret= (*cmp)(&(node_array[pos]), &node);
|
||||
else
|
||||
ret= 1;
|
||||
|
||||
if(ret < 0)
|
||||
l= p;
|
||||
else if(ret > 0)
|
||||
r= p;
|
||||
else {
|
||||
*idx= pos;
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_search_in_hln_array(struct XorrisO *xorriso,
|
||||
void *node, int *idx, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(xorriso->hln_array == NULL || xorriso->hln_count <= 0)
|
||||
return(0);
|
||||
ret= Xorriso__search_node(xorriso->hln_array, xorriso->hln_count,
|
||||
Xorriso__findi_sorted_ino_cmp, node, idx, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__get_di(IsoNode *node, dev_t *dev, ino_t *ino, int flag)
|
||||
{
|
||||
int ret, i, i_end, imgid, error_code;
|
||||
size_t value_length= 0;
|
||||
char *value= NULL, *msg= NULL, severity[80];
|
||||
unsigned char *vpt;
|
||||
static char *name= "isofs.di";
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
Xorriso_get_di_counteR++;
|
||||
#endif /* NIX */
|
||||
|
||||
msg= TSOB_FELD(char, ISO_MSGS_MESSAGE_LEN);
|
||||
if(msg == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
*dev= 0;
|
||||
*ino= 0;
|
||||
ret= iso_node_lookup_attr(node, name, &value_length, &value, 0);
|
||||
if(ret <= 0) {
|
||||
/* Drop any pending messages because there is no xorriso to take them */
|
||||
iso_obtain_msgs("NEVER", &error_code, &imgid, msg, severity);
|
||||
goto ex;
|
||||
}
|
||||
vpt= (unsigned char *) value;
|
||||
for(i= 1; i <= vpt[0] && i < (int) value_length; i++)
|
||||
*dev= ((*dev) << 8) | vpt[i];
|
||||
i_end= i + vpt[i] + 1;
|
||||
for(i++; i < i_end && i < (int) value_length; i++)
|
||||
*ino= ((*ino) << 8) | vpt[i];
|
||||
free(value);
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(msg != NULL)
|
||||
free(msg);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__di_ino_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
IsoNode *n1, *n2;
|
||||
dev_t d1, d2;
|
||||
ino_t i1, i2;
|
||||
|
||||
n1= *((IsoNode **) p1);
|
||||
n2= *((IsoNode **) p2);
|
||||
|
||||
ret= Xorriso__get_di(n1, &d1, &i1, 0);
|
||||
if(ret <= 0)
|
||||
{d1= 0; i1= 0;}
|
||||
ret= Xorriso__get_di(n2, &d2, &i2, 0);
|
||||
if(ret <= 0)
|
||||
{d2= 0; i2= 0;}
|
||||
|
||||
if(d1 < d2)
|
||||
return(-1);
|
||||
if(d1 > d2)
|
||||
return(1);
|
||||
if(i1 < i2)
|
||||
return(-1);
|
||||
if(i1 > i2)
|
||||
return(1);
|
||||
if(d1 == 0 && i1 == 0 && n1 != n2)
|
||||
return(n1 < n2 ? -1 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__di_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
IsoNode *n1, *n2;
|
||||
|
||||
ret= Xorriso__di_ino_cmp(p1, p2);
|
||||
if(ret)
|
||||
return(ret);
|
||||
n1= *((IsoNode **) p1);
|
||||
n2= *((IsoNode **) p2);
|
||||
if(n1 != n2)
|
||||
return(n1 < n2 ? -1 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__sort_di(void *node_array[], int count, int flag)
|
||||
{
|
||||
if(count <= 0)
|
||||
return(0);
|
||||
qsort(node_array, count, sizeof(IsoNode *), Xorriso__di_cmp);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_invalidate_di_item(struct XorrisO *xorriso, IsoNode *node,
|
||||
int flag)
|
||||
{
|
||||
int ret, idx;
|
||||
|
||||
if(xorriso->di_array == NULL)
|
||||
return(1);
|
||||
ret= Xorriso__search_node(xorriso->di_array, xorriso->di_count,
|
||||
Xorriso__di_cmp, node, &idx, 0);
|
||||
if(ret <= 0)
|
||||
return(ret == 0);
|
||||
if(xorriso->di_array[idx] != NULL)
|
||||
iso_node_unref(xorriso->di_array[idx]);
|
||||
xorriso->di_array[idx]= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= return 1 even if matching nodes were found but node is
|
||||
not among them
|
||||
bit1= use Xorriso__di_cmp() rather than Xorriso__di_ino_cmp()
|
||||
*/
|
||||
int Xorriso_search_di_range(struct XorrisO *xorriso, IsoNode *node,
|
||||
int *idx, int *low, int *high, int flag)
|
||||
{
|
||||
int ret, i, found;
|
||||
int (*cmp)(const void *p1, const void *p2)= Xorriso__di_ino_cmp;
|
||||
|
||||
if(flag & 2)
|
||||
cmp= Xorriso__di_cmp;
|
||||
|
||||
*high= *low= *idx= -1;
|
||||
ret= Xorriso__search_node(xorriso->di_array, xorriso->di_count,
|
||||
cmp, node, &found, 0);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
*low= *high= found;
|
||||
for(i= found + 1; i < xorriso->di_count; i++)
|
||||
if(xorriso->di_array[i] != NULL) {
|
||||
if((*cmp)(&node, &(xorriso->di_array[i])) != 0)
|
||||
break;
|
||||
*high= i;
|
||||
}
|
||||
for(i= found - 1; i >= 0; i--)
|
||||
if(xorriso->di_array[i] != NULL) {
|
||||
if((*cmp)(&node, &(xorriso->di_array[i])) != 0)
|
||||
break;
|
||||
*low= i;
|
||||
}
|
||||
for(i= *low; i <= *high; i++)
|
||||
if(xorriso->di_array[i] == node) {
|
||||
*idx= i;
|
||||
break;
|
||||
}
|
||||
return(*idx >= 0 || (flag & 1));
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__node_lba_cmp(const void *node1, const void *node2)
|
||||
{
|
||||
int ret;
|
||||
int lba1= 0, lba2= 0;
|
||||
|
||||
ret= Xorriso__file_start_lba(*((IsoNode **) node1), &lba1, 0);
|
||||
if(ret!=1)
|
||||
lba1= 0;
|
||||
ret= Xorriso__file_start_lba(*((IsoNode **) node2), &lba2, 0);
|
||||
if(ret!=1)
|
||||
lba2= 0;
|
||||
return(lba1-lba2);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__node_name_cmp(const void *node1, const void *node2)
|
||||
{
|
||||
char *name1, *name2;
|
||||
|
||||
name1= (char *) iso_node_get_name(*((IsoNode **) node1));
|
||||
name2= (char *) iso_node_get_name(*((IsoNode **) node2));
|
||||
return(strcmp(name1,name2));
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= only accept directory nodes
|
||||
bit1= do not report memory usage as DEBUG
|
||||
bit2= do not apply search pattern but accept any node
|
||||
*/
|
||||
int Xorriso_sorted_node_array(struct XorrisO *xorriso,
|
||||
IsoDir *dir_node,
|
||||
int *nodec, IsoNode ***node_array,
|
||||
off_t boss_mem, int flag)
|
||||
{
|
||||
int i, ret, failed_at;
|
||||
char *npt;
|
||||
IsoDirIter *iter= NULL;
|
||||
IsoNode *node;
|
||||
off_t mem;
|
||||
|
||||
mem= ((*nodec)+1)*sizeof(IsoNode *);
|
||||
ret= Xorriso_check_temp_mem_limit(xorriso, mem+boss_mem, flag&2);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
|
||||
*node_array= calloc(sizeof(IsoNode *), (*nodec)+1);
|
||||
if(*node_array==NULL) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot allocate memory for %d directory entries", *nodec);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
ret= iso_dir_get_children(dir_node, &iter);
|
||||
if(ret<0) {
|
||||
Xorriso_cannot_create_iter(xorriso, ret, 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
for(i= 0; iso_dir_iter_next(iter, &node) == 1 && i<*nodec; ) {
|
||||
npt= (char *) iso_node_get_name(node);
|
||||
if(!(flag&4)) {
|
||||
ret= Xorriso_regexec(xorriso, npt, &failed_at, 0);
|
||||
if(ret)
|
||||
continue; /* no match */
|
||||
}
|
||||
if(flag&1)
|
||||
if(!LIBISO_ISDIR(node))
|
||||
continue;
|
||||
(*node_array)[i++]= node;
|
||||
}
|
||||
iso_dir_iter_free(iter);
|
||||
*nodec= i;
|
||||
if(*nodec<=0)
|
||||
return(1);
|
||||
qsort(*node_array, *nodec, sizeof(IsoNode *), Xorriso__node_name_cmp);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_remake_hln_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, addon_nodes= 0, i, old_count, old_pt, new_pt;
|
||||
IsoNode **old_nodes;
|
||||
char **old_targets;
|
||||
|
||||
/* Count hln_targets of which the node has been deleted meanwhile */
|
||||
for(i= 0; i < xorriso->hln_count; i++) {
|
||||
if(xorriso->hln_targets[i] == NULL)
|
||||
continue;
|
||||
if(Xorriso_node_is_valid(xorriso, xorriso->hln_array[i], 0))
|
||||
continue;
|
||||
addon_nodes++;
|
||||
}
|
||||
ret= Xorriso_all_node_array(xorriso, addon_nodes, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if(addon_nodes > 0) {
|
||||
/* Transfer delete nodes with hln_target to node array */
|
||||
for(i= 0; i < xorriso->hln_count; i++) {
|
||||
if(xorriso->hln_targets[i] == NULL)
|
||||
continue;
|
||||
if(Xorriso_node_is_valid(xorriso, xorriso->hln_array[i], 0))
|
||||
continue;
|
||||
if(xorriso->node_counter < xorriso->node_array_size) {
|
||||
xorriso->node_array[xorriso->node_counter++]= xorriso->hln_array[i];
|
||||
iso_node_ref(xorriso->node_array[xorriso->node_counter - 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Xorriso_sort_node_array(xorriso, 0);
|
||||
old_nodes= (IsoNode **) xorriso->hln_array;
|
||||
old_targets= (char **) xorriso->hln_targets;
|
||||
old_count= xorriso->hln_count;
|
||||
xorriso->hln_array= 0;
|
||||
xorriso->hln_targets= NULL;
|
||||
|
||||
/* Transfer node_array to di_array without unrefering nodes */
|
||||
xorriso->hln_count= xorriso->node_counter;
|
||||
xorriso->hln_array= xorriso->node_array;
|
||||
xorriso->node_counter= 0;
|
||||
xorriso->node_array_size= 0;
|
||||
xorriso->node_array= NULL;
|
||||
|
||||
/* Allocate hln_targets */
|
||||
ret= Xorriso_new_hln_array(xorriso, xorriso->temp_mem_limit, 1);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
xorriso->node_targets_availmem= xorriso->temp_mem_limit;
|
||||
if(old_targets != NULL) {
|
||||
/* Transfer targets from old target array */;
|
||||
new_pt= old_pt= 0;
|
||||
while(new_pt < xorriso->hln_count && old_pt < old_count) {
|
||||
ret= Xorriso__hln_cmp(xorriso->hln_array[new_pt], old_nodes[old_pt]);
|
||||
if(ret < 0) {
|
||||
new_pt++;
|
||||
} else if(ret > 0) {
|
||||
old_pt++;
|
||||
} else {
|
||||
xorriso->hln_targets[new_pt]= old_targets[old_pt];
|
||||
if(old_targets[old_pt] != NULL)
|
||||
xorriso->temp_mem_limit-= strlen(old_targets[old_pt]) + 1;
|
||||
old_targets[old_pt]= NULL;
|
||||
new_pt++;
|
||||
old_pt++;
|
||||
}
|
||||
}
|
||||
for(old_pt= 0; old_pt < old_count; old_pt++)
|
||||
if(old_targets[old_pt] != NULL) /* (should not happen) */
|
||||
free(old_targets[old_pt]);
|
||||
free((char *) old_targets);
|
||||
}
|
||||
if(old_nodes != NULL) {
|
||||
for(old_pt= 0; old_pt < old_count; old_pt++)
|
||||
if(old_nodes[old_pt] != NULL)
|
||||
iso_node_unref(old_nodes[old_pt]);
|
||||
free((char *) old_nodes);
|
||||
}
|
||||
xorriso->hln_change_pending= 0;
|
||||
ret= 1;
|
||||
ex:;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= overwrite existing hln_array (else return 2)
|
||||
*/
|
||||
int Xorriso_make_hln_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(xorriso->hln_array != NULL && !(flag & 1)) {
|
||||
/* If no fresh image manipulations occured: keep old array */
|
||||
if(!xorriso->hln_change_pending)
|
||||
return(2);
|
||||
ret= Xorriso_remake_hln_array(xorriso, 0);
|
||||
return(ret);
|
||||
}
|
||||
Xorriso_destroy_hln_array(xorriso, 0);
|
||||
|
||||
ret= Xorriso_all_node_array(xorriso, 0, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
Xorriso_sort_node_array(xorriso, 0);
|
||||
|
||||
/* Transfer node_array to di_array without unrefering nodes */
|
||||
xorriso->hln_count= xorriso->node_counter;
|
||||
xorriso->hln_array= xorriso->node_array;
|
||||
xorriso->node_counter= 0;
|
||||
xorriso->node_array_size= 0;
|
||||
xorriso->node_array= NULL;
|
||||
|
||||
/* Allocate hln_targets */
|
||||
ret= Xorriso_new_hln_array(xorriso, xorriso->temp_mem_limit, 1);
|
||||
if(ret<=0) {
|
||||
Xorriso_destroy_hln_array(xorriso, 0);
|
||||
goto ex;
|
||||
}
|
||||
xorriso->node_targets_availmem= xorriso->temp_mem_limit;
|
||||
xorriso->hln_change_pending= 0;
|
||||
ret= 1;
|
||||
ex:;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= overwrite existing di_array (else return 2)
|
||||
bit1= make di_array despite xorriso->ino_behavior bit 3
|
||||
*/
|
||||
int Xorriso_make_di_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, bytes;
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
unsigned long old_gdic;
|
||||
old_gdic= Xorriso_get_di_counteR;
|
||||
#endif /* NIX */
|
||||
|
||||
if((xorriso->ino_behavior & 8 ) && !(flag & 2))
|
||||
return(2);
|
||||
if(xorriso->di_array != NULL && !(flag & 1))
|
||||
return(2);
|
||||
Xorriso_finish_hl_update(xorriso, 0);
|
||||
|
||||
ret= Xorriso_all_node_array(xorriso, 0, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
bytes= xorriso->node_array_size / 8 + 1;
|
||||
xorriso->di_do_widen= calloc(bytes, 1);
|
||||
if(xorriso->di_do_widen == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
ret= -1; goto ex;
|
||||
}
|
||||
|
||||
/* Transfer node_array to di_array without unrefering nodes */
|
||||
xorriso->di_count= xorriso->node_counter;
|
||||
xorriso->di_array= xorriso->node_array;
|
||||
xorriso->node_counter= 0;
|
||||
xorriso->node_array_size= 0;
|
||||
xorriso->node_array= NULL;
|
||||
|
||||
Xorriso__sort_di((void *) xorriso->di_array, xorriso->di_count, 0);
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
fprintf(stderr, "xorriso_DEBUG: sort_count= %lu\n",
|
||||
Xorriso_get_di_counteR - old_gdic);
|
||||
#endif /* NIX */
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@param flag bit0= iso_rr_path is freshly added and up to date
|
||||
bit1= do not mark as changed content (implied by bit0 too)
|
||||
bit2= -follow: this is not a command parameter
|
||||
@return -1= severe error
|
||||
0= not applicable for hard links
|
||||
1= go on with processing
|
||||
2= iso_rr_path is fully updated
|
||||
*/
|
||||
int Xorriso_hardlink_update(struct XorrisO *xorriso, int *compare_result,
|
||||
char *disk_path, char *iso_rr_path, int flag)
|
||||
{
|
||||
int ret, hret, idx, low, high, i, do_overwrite= 0, did_fake_di= 0;
|
||||
int follow_links, old_idx= -1;
|
||||
IsoNode *node;
|
||||
struct stat stbuf;
|
||||
dev_t old_dev;
|
||||
ino_t old_ino;
|
||||
|
||||
if(xorriso->di_array == NULL)
|
||||
return(1);
|
||||
follow_links= xorriso->do_follow_links ||
|
||||
(xorriso->do_follow_param && !(flag & 4));
|
||||
ret= Xorriso_node_from_path(xorriso, NULL, iso_rr_path, &node, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
if(LIBISO_ISDIR(node))
|
||||
return(1);
|
||||
|
||||
/* Handle eventual hardlink split : */
|
||||
/* This is achieved by setting the content change bit. Reason:
|
||||
The node needs to be removed from di_array because its di is
|
||||
not matching its array index any more. So it becomes invisible for
|
||||
the join check of eventual later hardlink siblings. Therefore
|
||||
it must be updated now, even if it has currently no siblings
|
||||
which it leaves or which it joins.
|
||||
*/
|
||||
if(!(flag & (1 | 2)))
|
||||
do_overwrite= 1;
|
||||
|
||||
Xorriso__get_di(node, &old_dev, &old_ino, 0);
|
||||
ret= Xorriso__search_node(xorriso->di_array, xorriso->di_count,
|
||||
Xorriso__di_cmp, node, &idx, 0);
|
||||
if(ret < 0)
|
||||
{ret= 0; goto ex;}
|
||||
if(ret > 0)
|
||||
old_idx= idx;
|
||||
|
||||
/* Handle eventual hardlink joining : */
|
||||
|
||||
if(follow_links)
|
||||
ret= stat(disk_path, &stbuf);
|
||||
else
|
||||
ret= lstat(disk_path, &stbuf);
|
||||
if(ret==-1)
|
||||
{ret= 0; goto ex;}
|
||||
|
||||
/* Are there new dev-ino-siblings in the image ? */
|
||||
/* Fake isofs.di */
|
||||
if(!(flag & 1)) {
|
||||
ret= Xorriso_record_dev_inode(xorriso, disk_path, stbuf.st_dev,
|
||||
stbuf.st_ino, node, iso_rr_path, 1);
|
||||
if(ret <= 0)
|
||||
{ret= -1; goto ex;}
|
||||
did_fake_di= 1;
|
||||
/* temporarily remove node from di_array so it does not disturb
|
||||
search by its fake di info */;
|
||||
if(old_idx >= 0)
|
||||
xorriso->di_array[old_idx]= NULL;
|
||||
}
|
||||
ret= Xorriso_search_di_range(xorriso, node, &idx, &low, &high, 1);
|
||||
if(did_fake_di) {
|
||||
/* Revoke fake of isofs.di */
|
||||
hret= Xorriso_record_dev_inode(xorriso, disk_path, old_dev, old_ino,
|
||||
node, iso_rr_path, 1);
|
||||
if(hret <= 0)
|
||||
{ret= -1; goto ex;}
|
||||
if(old_idx >= 0)
|
||||
xorriso->di_array[old_idx]= node;
|
||||
}
|
||||
if(ret == 0)
|
||||
{ret= 1; goto ex;}
|
||||
if(ret < 0)
|
||||
{ret= 0; goto ex;}
|
||||
|
||||
|
||||
#ifdef Xorriso_hardlink_update_debuG
|
||||
/* <<< */
|
||||
if(low < high || idx < 0) {
|
||||
fprintf(stderr,
|
||||
"xorriso_DEBUG: old_idx= %d , low= %d , high= %d , iso= '%s' , disk='%s'\n",
|
||||
old_idx, low, high, iso_rr_path, disk_path);
|
||||
fprintf(stderr,
|
||||
"xorriso_DEBUG: old_dev= %lu , old_ino= %lu , dev= %lu , ino= %lu\n",
|
||||
(unsigned long) old_dev, (unsigned long) old_ino,
|
||||
(unsigned long) stbuf.st_dev, (unsigned long) stbuf.st_ino);
|
||||
|
||||
if(idx >= 0 && idx != old_idx)
|
||||
fprintf(stderr, "xorriso_DEBUG: idx= %d , old_idx = %d\n", idx, old_idx);
|
||||
}
|
||||
#endif /* Xorriso_hardlink_update_debuG */
|
||||
|
||||
/* Overwrite all valid siblings : */
|
||||
for(i= low; i <= high; i++) {
|
||||
if(i == idx || xorriso->di_array[i] == NULL)
|
||||
continue;
|
||||
|
||||
#ifdef Xorriso_hardlink_update_debuG
|
||||
/* <<< */
|
||||
{
|
||||
ino_t ino;
|
||||
dev_t dev;
|
||||
|
||||
Xorriso__get_di(xorriso->di_array[i], &dev, &ino, 0);
|
||||
fprintf(stderr, "xorriso_DEBUG: iso_sibling= '%s' , dev= %lu , ino= %lu\n",
|
||||
node_path, (unsigned long) dev, (unsigned long) ino);
|
||||
}
|
||||
#endif /* Xorriso_hardlink_update_debuG */
|
||||
|
||||
xorriso->di_do_widen[i / 8]|= 1 << (i % 8);
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(do_overwrite)
|
||||
*compare_result|= (1<<15);
|
||||
if(old_idx >= 0 && (*compare_result & (3 << 21))) {
|
||||
/* The old di info is obsolete */
|
||||
if(xorriso->di_array[old_idx] != NULL)
|
||||
iso_node_unref(xorriso->di_array[old_idx]);
|
||||
xorriso->di_array[old_idx]= NULL;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not destroy di_array
|
||||
*/
|
||||
int Xorriso_finish_hl_update(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, zero= 0;
|
||||
char *argv[4];
|
||||
struct Xorriso_lsT *disk_lst, *iso_lst;
|
||||
|
||||
if(xorriso->di_array == NULL)
|
||||
{ret= 1; goto ex;}
|
||||
disk_lst= xorriso->di_disk_paths;
|
||||
iso_lst= xorriso->di_iso_paths;
|
||||
while(disk_lst != NULL && iso_lst != NULL) {
|
||||
argv[0]= Xorriso_lst_get_text(iso_lst, 0);
|
||||
argv[1]= "-exec";
|
||||
argv[2]= "widen_hardlinks";
|
||||
argv[3]= Xorriso_lst_get_text(disk_lst, 0);
|
||||
zero= 0;
|
||||
ret= Xorriso_option_find(xorriso, 4, argv, &zero, 0); /* -findi */
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
disk_lst= Xorriso_lst_get_next(disk_lst, 0);
|
||||
iso_lst= Xorriso_lst_get_next(iso_lst, 0);
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(!(flag & 1))
|
||||
Xorriso_destroy_di_array(xorriso, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
62
xorriso/sort_cmp.h
Normal file
62
xorriso/sort_cmp.h
Normal file
@ -0,0 +1,62 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which sort and compare
|
||||
tree nodes.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_sort_cmp_includeD
|
||||
#define Xorriso_pvt_sort_cmp_includeD yes
|
||||
|
||||
|
||||
int Xorriso__findi_sorted_ino_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__hln_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__findi_sorted_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__search_node(void *node_array[], int n,
|
||||
int (*cmp)(const void *p1, const void *p2),
|
||||
void *node, int *idx, int flag);
|
||||
|
||||
int Xorriso_search_in_hln_array(struct XorrisO *xorriso,
|
||||
void *node, int *idx, int flag);
|
||||
|
||||
int Xorriso__get_di(IsoNode *node, dev_t *dev, ino_t *ino, int flag);
|
||||
|
||||
int Xorriso__di_ino_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__di_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__sort_di(void *node_array[], int count, int flag);
|
||||
|
||||
int Xorriso_invalidate_di_item(struct XorrisO *xorriso, IsoNode *node,
|
||||
int flag);
|
||||
|
||||
int Xorriso_search_di_range(struct XorrisO *xorriso, IsoNode *node,
|
||||
int *idx, int *low, int *high, int flag);
|
||||
|
||||
int Xorriso__node_lba_cmp(const void *node1, const void *node2);
|
||||
|
||||
int Xorriso__node_name_cmp(const void *node1, const void *node2);
|
||||
|
||||
int Xorriso_sorted_node_array(struct XorrisO *xorriso,
|
||||
IsoDir *dir_node,
|
||||
int *nodec, IsoNode ***node_array,
|
||||
off_t boss_mem, int flag);
|
||||
|
||||
int Xorriso_remake_hln_array(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_make_di_array(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_search_hardlinks(struct XorrisO *xorriso, IsoNode *node,
|
||||
int *node_idx, int *min_hl, int *max_hl, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_sort_cmp_includeD */
|
||||
|
2140
xorriso/text_io.c
Normal file
2140
xorriso/text_io.c
Normal file
File diff suppressed because it is too large
Load Diff
90
xorriso/text_io.h
Normal file
90
xorriso/text_io.h
Normal file
@ -0,0 +1,90 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of text i/o functions.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_textio_includeD
|
||||
#define Xorriso_pvt_textio_includeD yes
|
||||
|
||||
|
||||
int Xorriso_dialog_input(struct XorrisO *xorriso, char line[], int linesize,
|
||||
int flag);
|
||||
|
||||
/** @return -1= abort , 0= no , 1= yes
|
||||
*/
|
||||
int Xorriso_reassure(struct XorrisO *xorriso, char *cmd, char *which_will,
|
||||
int flag);
|
||||
|
||||
int Xorriso_request_confirmation(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* @param flag bit0= quoted multiline mode
|
||||
bit1= release allocated memory and return 1
|
||||
bit2= with bit0: warn of empty text arguments
|
||||
bit3= deliver as single quoted text including all whitespace
|
||||
and without any backslash interpretation
|
||||
@return -1=out of memory , 0=line format error , 1=ok, go on , 2=done
|
||||
*/
|
||||
int Xorriso_read_lines(struct XorrisO *xorriso, FILE *fp, int *linecount,
|
||||
int *argc, char ***argv, int flag);
|
||||
|
||||
int Xorriso_write_to_channel(struct XorrisO *xorriso,
|
||||
char *in_text, int channel_no, int flag);
|
||||
|
||||
int Xorriso_result(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_restxt(struct XorrisO *xorriso, char *text);
|
||||
|
||||
int Xorriso_info(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_mark(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
int Xorriso_write_session_log(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
int Xorriso_status_result(struct XorrisO *xorriso, char *filter, FILE *fp,
|
||||
int flag);
|
||||
|
||||
int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag);
|
||||
|
||||
int Xorriso_pacifier_reset(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* This call is to be issued by long running workers in short intervals.
|
||||
It will check whether enough time has elapsed since the last pacifier
|
||||
message and eventually issue an update message.
|
||||
@param what_done A sparse description of the action, preferrably in past
|
||||
tense. E.g. "done" , "files added".
|
||||
@param count The number of objects processed so far.
|
||||
Is ignored if <=0.
|
||||
@param todo The number of objects to be done in total.
|
||||
Is ignored if <=0.
|
||||
@param current_object A string telling the object currently processed.
|
||||
Ignored if "".
|
||||
@param flag bit0= report unconditionally, no time check
|
||||
*/
|
||||
int Xorriso_pacifier_callback(struct XorrisO *xorriso, char *what_done,
|
||||
off_t count, off_t todo, char *current_object,
|
||||
int flag);
|
||||
|
||||
int Xorriso_reset_counters(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_no_malloc_memory(struct XorrisO *xorriso, char **to_free,
|
||||
int flag);
|
||||
|
||||
int Xorriso_much_too_long(struct XorrisO *xorriso, int len, int flag);
|
||||
|
||||
int Xorriso_no_findjob(struct XorrisO *xorriso, char *cmd, int flag);
|
||||
|
||||
int Xorriso_report_md5_outcome(struct XorrisO *xorriso, char *severity,
|
||||
int flag);
|
||||
|
||||
int Xorriso_protect_stdout(struct XorrisO *xorriso, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_textio_includeD */
|
||||
|
2550
xorriso/write_run.c
Normal file
2550
xorriso/write_run.c
Normal file
File diff suppressed because it is too large
Load Diff
53
xorriso/write_run.h
Normal file
53
xorriso/write_run.h
Normal file
@ -0,0 +1,53 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which are needed to write
|
||||
sessions.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_write_run_includeD
|
||||
#define Xorriso_pvt_write_run_includeD yes
|
||||
|
||||
|
||||
/* CD specs say one shall not write tracks < 600 kiB */
|
||||
#define Xorriso_cd_min_track_sizE 300
|
||||
|
||||
|
||||
/* Default setting for -compliance */
|
||||
#define Xorriso_relax_compliance_defaulT \
|
||||
(isoburn_igopt_allow_deep_paths | isoburn_igopt_allow_longer_paths | \
|
||||
isoburn_igopt_always_gmt | \
|
||||
isoburn_igopt_rrip_version_1_10 | isoburn_igopt_aaip_susp_1_10 | \
|
||||
isoburn_igopt_only_iso_versions | isoburn_igopt_no_j_force_dots)
|
||||
|
||||
|
||||
int Xorriso_make_write_options(
|
||||
struct XorrisO *xorriso, struct burn_drive *drive,
|
||||
struct burn_write_opts **burn_options, int flag);
|
||||
|
||||
int Xorriso_sanitize_image_size(struct XorrisO *xorriso,
|
||||
struct burn_drive *drive, struct burn_disc *disc,
|
||||
struct burn_write_opts *burn_options, int flag);
|
||||
|
||||
int Xorriso_auto_format(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_set_system_area(struct XorrisO *xorriso, struct burn_drive *drive,
|
||||
IsoImage *img, struct isoburn_imgen_opts *sopts,
|
||||
int flag);
|
||||
|
||||
int Xorriso_check_burn_abort(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive,
|
||||
int flag);
|
||||
|
||||
int Xorriso_set_isolinux_options(struct XorrisO *xorriso,
|
||||
IsoImage *image, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_write_run_includeD */
|
||||
|
3880
xorriso/xorriso.1
3880
xorriso/xorriso.1
File diff suppressed because it is too large
Load Diff
20675
xorriso/xorriso.c
20675
xorriso/xorriso.c
File diff suppressed because it is too large
Load Diff
@ -1,14 +1,42 @@
|
||||
|
||||
/* Command line oriented batch and dialog tool which creates, loads,
|
||||
manipulates and burns ISO 9660 filesystem images.
|
||||
/* xorriso - libisoburn higher level API which creates, loads, manipulates
|
||||
and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
Copyright 2007-2011 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the public option interface of xorriso.
|
||||
This file contains the public API of xorriso which covers all of its
|
||||
operations.
|
||||
|
||||
An example of its usage is xorriso_main.c which checks version compatibility,
|
||||
creates a xorriso object, initializes the libraries, and runs the command
|
||||
interpreters of the API to constitute the command line oriented batch and
|
||||
dialog tool xorriso.
|
||||
|
||||
Alternatively to command interpreters it is possible to run all options of
|
||||
xorriso directly via the calls of the "Options API".
|
||||
The "Problem Status and Message API" shall then be used to obtain the
|
||||
text output of the options.
|
||||
|
||||
Mandatory calls are:
|
||||
Xorriso_new(), Xorriso_startup_libraries(), Xorriso_destroy()
|
||||
|
||||
This architecture is fully public since version 0.5.8. From then on, new
|
||||
features get marked by
|
||||
@since major.minor.micro
|
||||
If this mark is missing, then the feature was present before release 0.5.8.
|
||||
|
||||
|
||||
There is a lower level of API which consists of libisofs.h, libburn.h and
|
||||
libisoburn.h. One should not mix those calls with the ones of xorriso.h .
|
||||
*/
|
||||
|
||||
/* Important: If you add a public API function then add its name to file
|
||||
libisoburn/libisoburn.ver
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_includeD
|
||||
#define Xorriso_includeD yes
|
||||
|
||||
@ -16,17 +44,106 @@
|
||||
struct XorrisO;
|
||||
|
||||
|
||||
#define Xorriso_program_versioN "0.4.8"
|
||||
|
||||
/* This may be changed to Xorriso_GNU_xorrisO in order to create GNU xorriso
|
||||
under GPLv3+ derived from above GPLv2+.
|
||||
*/
|
||||
#define Xorriso_libburnia_xorrisO yes
|
||||
|
||||
|
||||
/* --------------------- Fundamental Management ------------------- */
|
||||
|
||||
|
||||
/* Get the version text (e.g. "0.4.2") of the program code.
|
||||
/** These three release version numbers tell the revision of this header file
|
||||
and of the API which it describes. They shall be memorized by applications
|
||||
at build time.
|
||||
@since 0.5.8
|
||||
*/
|
||||
#define Xorriso_header_version_majoR 1
|
||||
#define Xorriso_header_version_minoR 1
|
||||
#define Xorriso_header_version_micrO 4
|
||||
|
||||
|
||||
/** Eventually something like ".pl01" to indicate a bug fix. Normally empty.
|
||||
@since 0.5.8
|
||||
*/
|
||||
#define Xorriso_program_patch_leveL ""
|
||||
|
||||
|
||||
/** Obtain the three release version numbers of the library. These are the
|
||||
numbers encountered by the application when linking with libisoburn,
|
||||
i.e. possibly not before run time.
|
||||
Better do not base the fundamental compatibility decision of an application
|
||||
on these numbers. For a reliable check use Xorriso__is_compatible().
|
||||
@since 0.5.8
|
||||
@param major The maturity version (0 for now, as we are still learning)
|
||||
@param minor The development goal version.
|
||||
@param micro The development step version. This has an additional meaning:
|
||||
|
||||
Pare numbers indicate a version with frozen API. I.e. you can
|
||||
rely on the same set of features to be present in all
|
||||
published releases with that major.minor.micro combination.
|
||||
Features of a pare release will stay available and ABI
|
||||
compatible as long as the SONAME of libisoburn stays "1".
|
||||
Currently there are no plans to ever change the SONAME.
|
||||
|
||||
Odd numbers indicate that API upgrades are in progress.
|
||||
I.e. new features might be already present or they might
|
||||
be still missing. Newly introduced features may be changed
|
||||
incompatibly or even be revoked before release of a pare
|
||||
version.
|
||||
So micro revisions {1,3,5,7,9} should never be used for
|
||||
dynamic linking unless the proper library match can be
|
||||
guaranteed by external circumstances.
|
||||
|
||||
@return 1 success, <=0 might in future become an error indication
|
||||
*/
|
||||
void Xorriso__version(int *major, int *minor, int *micro);
|
||||
|
||||
|
||||
/** Check whether all features of header file xorriso.h from the given
|
||||
major.minor.micro revision triple can be delivered by the library version
|
||||
which is performing this call.
|
||||
if (! Xorriso__is_compatible(Xorriso_header_version_majoR,
|
||||
Xorriso_header_version_minoR,
|
||||
Xorriso_header_version_micrO, 0))
|
||||
...refuse to start the program with this dynamic library version...
|
||||
@since 0.5.8
|
||||
@param major obtained at build time
|
||||
@param minor obtained at build time
|
||||
@param micro obtained at build time
|
||||
@param flag Bitfield for control purposes. Unused yet. Submit 0.
|
||||
@return 1= library can work for caller
|
||||
0= library is not usable in some aspects. Caller must restrict
|
||||
itself to an earlier API version or must not use this library
|
||||
at all.
|
||||
*/
|
||||
int Xorriso__is_compatible(int major, int minor, int micro, int flag);
|
||||
|
||||
|
||||
/* Get the patch level text (e.g. "" or ".pl01") of the program code.
|
||||
@param flag unused yet, submit 0
|
||||
@return readonly character string
|
||||
*/
|
||||
char *Xorriso__get_version_text(int flag);
|
||||
char *Xorriso__get_patch_level_text(int flag);
|
||||
|
||||
|
||||
/* Choose how Xorriso_startup_libraries() and the XorrisO object shall
|
||||
prepare for eventual signals.
|
||||
@param behavior Default is behavior 1.
|
||||
0= no own signal handling. The main application has to do
|
||||
that. Do not start burn runs without any handling !
|
||||
1= use libburn signal handler. Most time with action
|
||||
0. During writing, formatting, blanking: 0x30.
|
||||
Only usable with a single xorriso object.
|
||||
2= Enable system default reaction on all signals
|
||||
@since 1.0.9
|
||||
3= Try to ignore nearly all signals
|
||||
@since 1.0.9
|
||||
@param flag unused yet, submit 0
|
||||
@return <= 0 is error, >0 is success
|
||||
*/
|
||||
int Xorriso__preset_signal_behavior(int behavior, int flag);
|
||||
|
||||
|
||||
/* Mandatory call:
|
||||
@ -50,32 +167,18 @@ char *Xorriso__get_version_text(int flag);
|
||||
int Xorriso_new(struct XorrisO ** xorriso, char *progname, int flag);
|
||||
|
||||
|
||||
/* Interpret certain commands which shall get into effect before the
|
||||
libraries get initialized:
|
||||
-abort_on , -report_about , -return_with , -list_delimiter
|
||||
Some commands get executed only if they are the only command in argv:
|
||||
-prog_help , -help , -no_rc
|
||||
Some get examined for the need to redirect stdout messages
|
||||
-dev , -outdev , -indev , -as
|
||||
@param xorriso The context object in which to perform the commands.
|
||||
@param argc Number of arguments.
|
||||
@param argv The arguments. argv[0] contains the program name.
|
||||
argv[1] to argv[argc-1] contain commands and parameters.
|
||||
@param idx Argument cursor. When this function is called, *idx must
|
||||
be at least 1, argv[*idx] must be to a command.
|
||||
*idx will iterate over commands and parameters until this
|
||||
function aborts or until argc is reached.
|
||||
@param flag bit0= do not interpret argv[1]
|
||||
@return <0 error
|
||||
0 end program
|
||||
1 ok, go on
|
||||
/* Note: Between Xorriso_new() and the next call Xorriso_startup_libraries()
|
||||
there may be called the special command interpreter
|
||||
Xorriso_prescan_args().
|
||||
The other command interpreters may be used only after
|
||||
Xorriso_startup_libraries(). The same restriction applies to the
|
||||
calls of the Options API further below.
|
||||
*/
|
||||
int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int flag);
|
||||
|
||||
|
||||
/* Mandatory call:
|
||||
It has to be made before calling any function listed below this point.
|
||||
Only exception is the special command interpreter Xorriso_prescan_args().
|
||||
|
||||
Make global library initializations.
|
||||
This must be done with the first xorriso object that gets created and
|
||||
@ -87,6 +190,78 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Note: After library startup, you may run Command Interpreters or call
|
||||
functions from the Options API.
|
||||
|
||||
Wenn all desired activities are done, you may check whether there are
|
||||
uncommited changes pending, compute an exit value, destroy the XorrisO
|
||||
object, and exit your program.
|
||||
*/
|
||||
|
||||
|
||||
/* Inquire whether option -commit would make sense.
|
||||
@param xorriso The context object to inquire.
|
||||
@param flag @since 0.6.6
|
||||
bit0= do not return 1 if -as mkisofs -print-size was
|
||||
performed on the current image.
|
||||
@return 0= -commit would have nothing to do
|
||||
1= a new image session would emerge at -commit
|
||||
*/
|
||||
int Xorriso_change_is_pending(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Compute the exit value from the recorded maximum event severity.
|
||||
@param xorriso The context object to inquire.
|
||||
@param flag unused yet, submit 0
|
||||
@return The computed exit value
|
||||
*/
|
||||
int Xorriso_make_return_value(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Mandatory call:
|
||||
Destroy xorriso object when it is no longer needed.
|
||||
@param xorriso The context object to destroy. *xorriso will become NULL.
|
||||
@param flag bit0= Perform global library shutdown.
|
||||
Use only with last xorriso object to be destroyed.
|
||||
@return <=0 error, >0 success
|
||||
*/
|
||||
int Xorriso_destroy(struct XorrisO **xorriso, int flag);
|
||||
|
||||
|
||||
/* --------------------- Command Interpreters ------------------- */
|
||||
|
||||
|
||||
/* This special interpreter may be called between Xorriso_new() and
|
||||
Xorriso_startup_libraries(). It interprets certain commands which shall
|
||||
get into effect before the libraries get initialized:
|
||||
-abort_on , -report_about , -return_with , -list_delimiter ,
|
||||
-scsi_log , -signal_handling
|
||||
Some commands get executed only if they are the only command in argv:
|
||||
-prog_help , -help , -no_rc
|
||||
Some get examined for the need to redirect stdout messages
|
||||
-dev , -outdev , -indev , -as
|
||||
Commands -list_delimiter and -add_plainly get into effect during this
|
||||
call. But their setting at begin of the call gets restored before the
|
||||
call returns.
|
||||
@param xorriso The context object in which to perform the commands.
|
||||
@param argc Number of arguments.
|
||||
@param argv The arguments. argv[0] contains the program name.
|
||||
argv[1] to argv[argc-1] contain commands and parameters.
|
||||
@param idx Argument cursor. When this function is called, *idx must
|
||||
be at least 1, argv[*idx] must be a command.
|
||||
*idx will iterate over commands and parameters until this
|
||||
function aborts or until argc is reached.
|
||||
@param flag bit0= do not interpret argv[1]
|
||||
bit1= produce FAILURE events on unknown commands
|
||||
@since 1.1.0
|
||||
@return <0 error
|
||||
0 end program
|
||||
1 ok, go on
|
||||
*/
|
||||
int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int flag);
|
||||
|
||||
|
||||
/* Read and interpret commands from eventual startup files as listed in
|
||||
man xorriso.
|
||||
@param xorriso The context object in which to perform the commands.
|
||||
@ -98,7 +273,7 @@ int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag);
|
||||
int Xorriso_read_rc(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Check whether program arguments shall be backslash decoded and eventually
|
||||
/* Check whether program arguments shall be backslash decoded. If so, then
|
||||
replace *argv by a new argument vector. The old one will not be freed
|
||||
by this call. If it is dynamic memory then you need to keep a copy of
|
||||
the pointer and free it yourself after this call.
|
||||
@ -132,8 +307,9 @@ int Xorriso_program_arg_bsl(struct XorrisO *xorriso, int argc, char ***argv,
|
||||
be at least 1, argv[*idx] must be a command.
|
||||
*idx will iterate over commands and parameters until this
|
||||
function aborts or until argc is reached.
|
||||
@param flag bit0= recursion
|
||||
bit1= these are the main() program start arguments
|
||||
@param flag bit0= reserved. Indicates recursion. Submit 0.
|
||||
bit1= Indicates that these are the main() program start
|
||||
arguments
|
||||
@return <=0 = error
|
||||
1 = success
|
||||
2 = problem event ignored
|
||||
@ -157,7 +333,8 @@ int Xorriso_interpreter(struct XorrisO *xorriso,
|
||||
int Xorriso_execute_option(struct XorrisO *xorriso, char *line, int flag);
|
||||
|
||||
|
||||
/* Enter xorriso command line dialog mode, eventually using libreadline.
|
||||
/* Enter xorriso command line dialog mode, using libreadline if configured
|
||||
at build time and not disabled at run time.
|
||||
This call returns immediately if not option -dialog "on" was performed
|
||||
before.
|
||||
@param xorriso The context object in which to perform the commands.
|
||||
@ -168,33 +345,6 @@ int Xorriso_execute_option(struct XorrisO *xorriso, char *line, int flag);
|
||||
int Xorriso_dialog(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Inquire whether option -commit would make sense.
|
||||
@param xorriso The context object to inquire.
|
||||
@param flag unused yet, submit 0
|
||||
@return 0= -commit would have nothing to do
|
||||
1= a new image session would emerge at -commit
|
||||
*/
|
||||
int Xorriso_change_is_pending(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Compute the exit value from the recorded maximum event severity.
|
||||
@param xorriso The context object to inquire.
|
||||
@param flag unused yet, submit 0
|
||||
@return The computed exit value
|
||||
*/
|
||||
int Xorriso_make_return_value(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Mandatory call:
|
||||
Destroy xorriso object when it is no longer needed.
|
||||
@param xorriso The context object to destroy. *xorriso will become NULL.
|
||||
@param flag bit0= Perform global library shutdown.
|
||||
Use only with last xorriso object to be destroyed.
|
||||
@return <=0 error, >0 success
|
||||
*/
|
||||
int Xorriso_destroy(struct XorrisO **xorriso, int flag);
|
||||
|
||||
|
||||
/* --------------------- Problem Status and Message API ------------------- */
|
||||
|
||||
|
||||
@ -217,8 +367,9 @@ int Xorriso_destroy(struct XorrisO **xorriso, int flag);
|
||||
A final newline character gets appended automatically.
|
||||
@param os_errno Eventual errno related to the message. Submit 0 if
|
||||
the message is not related to a operating system error.
|
||||
@param severity One of "ABORT", "FATAL", "SORRY", "WARNING", "HINT",
|
||||
"NOTE", "UPDATE", "DEBUG". Defaults to "FATAL".
|
||||
@param severity One of "ABORT", "FATAL", "FAILURE", "MISHAP", "SORRY",
|
||||
"WARNING", "HINT", "NOTE", "UPDATE", "DEBUG".
|
||||
Defaults to "FATAL".
|
||||
@param flag Bitfield for control purposes
|
||||
bit0= use pager (as with result)
|
||||
bit1= permission to suppress output
|
||||
@ -400,6 +551,7 @@ struct Xorriso_lsT *Xorriso_lst_get_prev(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
/** Destroy all list items which are directly or indirectly connected to
|
||||
the given link item.
|
||||
All pointers obtained by Xorriso_lst_get_text() become invalid by this.
|
||||
Apply this to each of the two list handles obtained by
|
||||
Xorriso_pull_outlists() when the lists are no longer needed.
|
||||
@param lstring *lstring will be freed and set to NULL.
|
||||
@ -423,26 +575,35 @@ int Xorriso_lst_destroy_all(struct Xorriso_lsT **lstring, int flag);
|
||||
Xorriso_eval_problem_status()
|
||||
One should follow its eventual advice to abort.
|
||||
|
||||
Options with a varying number of arguments get them passed like
|
||||
Options with a varying number of arguments get then passed like
|
||||
Xorriso_interpreter(). E.g.:
|
||||
int Xorriso_option_add(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
They begin to read the arguments at position *idx and will see the list
|
||||
end either at the next argv which contains the -list_delimiter text or
|
||||
at argv[argc-1]. After the call, *idx will be the index of the first not
|
||||
yet interpreted argv.
|
||||
The option functions will begin to read the arguments at position *idx
|
||||
and will see the list end either at the next argv which contains the
|
||||
-list_delimiter text or at argv[argc-1].
|
||||
After the call, *idx will be the index of the first not yet interpreted
|
||||
argv.
|
||||
|
||||
Do not set any flag bits which are not described by "@param flag".
|
||||
I.e. if flag is not mentioned, then submit 0.
|
||||
Yet undefined flag bits might get a meaning in future. Unset bits will
|
||||
then produce the traditional behavior, whereas set bits might bring
|
||||
surprises to inadverted callers.
|
||||
*/
|
||||
|
||||
|
||||
/* Option -abort_on */
|
||||
int Xorriso_option_abort_on(struct XorrisO *xorriso, char *severity, int flag);
|
||||
|
||||
/* Option -abstract_file */
|
||||
/* @since 0.6.0 */
|
||||
int Xorriso_option_abstract_file(struct XorrisO *xorriso, char *name,
|
||||
int flag);
|
||||
|
||||
/* Option -acl "on"|"off" */
|
||||
int Xorriso_option_acl(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
|
||||
/* Option -add */
|
||||
/* @param flag bit0=do not report the added item
|
||||
bit1=do not reset pacifier, no final pacifier message
|
||||
@ -462,6 +623,11 @@ int Xorriso_option_alter_date(struct XorrisO *xorriso,
|
||||
char *time_type, char *timestring,
|
||||
int argc, char **argv, int *idx, int flag);
|
||||
|
||||
/* Option -append_partition */
|
||||
/* @since 0.6.4 */
|
||||
int Xorriso_option_append_partition(struct XorrisO *xorriso, char *partno_text,
|
||||
char *type_text, char *image_path, int flag);
|
||||
|
||||
/* Option -application_id */
|
||||
int Xorriso_option_application_id(struct XorrisO *xorriso, char *name,
|
||||
int flag);
|
||||
@ -487,6 +653,10 @@ int Xorriso_option_backslash_codes(struct XorrisO *xorriso, char *mode,
|
||||
/* Option -ban_stdio_write */
|
||||
int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -biblio_file */
|
||||
/* @since 0.6.0 */
|
||||
int Xorriso_option_biblio_file(struct XorrisO *xorriso, char *name, int flag);
|
||||
|
||||
/* Option -blank and -format */
|
||||
/* @param flag bit0= format rather than blank
|
||||
@return <=0 error , 1 success, 2 revoked by -reassure
|
||||
@ -547,9 +717,22 @@ int Xorriso_option_chmodi(struct XorrisO *xorriso, char *mode,
|
||||
int Xorriso_option_chowni(struct XorrisO *xorriso, char *uid,
|
||||
int argc, char **argv, int *idx, int flag);
|
||||
|
||||
/* Option -clone */
|
||||
/* @since 1.0.2 */
|
||||
int Xorriso_option_clone(struct XorrisO *xorriso, char *origin, char *dest,
|
||||
int flag);
|
||||
|
||||
/* Option -close "on"|"off" */
|
||||
int Xorriso_option_close(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -close_damaged */
|
||||
/* @since 1.1.0 */
|
||||
int Xorriso_option_close_damaged(struct XorrisO *xorriso, char *mode,
|
||||
int flag);
|
||||
|
||||
/* Option -close_filter_list */
|
||||
int Xorriso_option_close_filter_list(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -commit */
|
||||
/* @param flag bit0= leave indrive and outdrive aquired as they were,
|
||||
i.e. do not aquire outdrive as new in-out-drive
|
||||
@ -572,6 +755,19 @@ int Xorriso_option_commit_eject(struct XorrisO *xorriso, char *which, int flag);
|
||||
int Xorriso_option_compare(struct XorrisO *xorriso, char *disk_path,
|
||||
char *iso_path, int flag);
|
||||
|
||||
/* Option -compliance */
|
||||
int Xorriso_option_compliance(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -copyright_file */
|
||||
/* @since 0.6.0 */
|
||||
int Xorriso_option_copyright_file(struct XorrisO *xorriso, char *name,
|
||||
int flag);
|
||||
|
||||
/* Option -cp_clone */
|
||||
/* @since 1.0.2 */
|
||||
int Xorriso_option_cp_clone(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
|
||||
/* Option -cpr alias -cpri */
|
||||
int Xorriso_option_cpri( struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
@ -594,7 +790,8 @@ int Xorriso_option_cut_out(struct XorrisO *xorriso, char *disk_path,
|
||||
int Xorriso_option_dev(struct XorrisO *xorriso, char *adr, int flag);
|
||||
|
||||
/* Option -devices */
|
||||
/* @return <=0 error , 1 success, 2 revoked by -reassure
|
||||
/* @param flag bit0= perform -device_links rather than -devices
|
||||
@return <=0 error , 1 success, 2 revoked by -reassure
|
||||
*/
|
||||
int Xorriso_option_devices(struct XorrisO *xorriso, int flag);
|
||||
|
||||
@ -607,6 +804,11 @@ int Xorriso_option_disk_dev_ino(struct XorrisO *xorriso, char *mode, int flag);
|
||||
/* Option -disk_pattern "on"|"ls"|"off" */
|
||||
int Xorriso_option_disk_pattern(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -displacement [-]offset */
|
||||
/* @since 0.6.6 */
|
||||
int Xorriso_option_displacement(struct XorrisO *xorriso, char *value,
|
||||
int flag);
|
||||
|
||||
/* Option -drive_class */
|
||||
int Xorriso_option_drive_class(struct XorrisO *xorriso,
|
||||
char *d_class, char *pattern, int flag);
|
||||
@ -617,6 +819,11 @@ int Xorriso_option_dummy(struct XorrisO *xorriso, char *mode, int flag);
|
||||
/* Option -dvd_obs "default"|"32k"|"64k" */
|
||||
int Xorriso_option_dvd_obs(struct XorrisO *xorriso, char *obs, int flag);
|
||||
|
||||
/* Option -early_stdio_test */
|
||||
/* @since 1.0.6 */
|
||||
int Xorriso_option_early_stdio_test(struct XorrisO *xorriso, char *mode,
|
||||
int flag);
|
||||
|
||||
/* Option -eject */
|
||||
/* @param flag bit0=do not report toc of eventually remaining drives
|
||||
*/
|
||||
@ -643,7 +850,7 @@ int Xorriso_option_external_filter(struct XorrisO *xorriso,
|
||||
/* Options -extract , -extract_single */
|
||||
/* @param flag bit0=do not report the restored item
|
||||
bit1=do not reset pacifier, no final pacifier message
|
||||
bit5= -extract_single: eventually do not insert directory tree
|
||||
bit5= -extract_single: do not insert directory tree
|
||||
*/
|
||||
int Xorriso_option_extract(struct XorrisO *xorriso, char *disk_path,
|
||||
char *iso_path, int flag);
|
||||
@ -652,8 +859,10 @@ int Xorriso_option_extract(struct XorrisO *xorriso, char *disk_path,
|
||||
int Xorriso_option_extract_cut(struct XorrisO *xorriso, char *iso_rr_path,
|
||||
char *start, char *count, char *disk_path, int flag);
|
||||
|
||||
/* Option -follow */
|
||||
int Xorriso_option_follow(struct XorrisO *xorriso, char *mode, int flag);
|
||||
/* Option -file_size_limit */
|
||||
int Xorriso_option_file_size_limit(struct XorrisO *xorriso,
|
||||
int argc, char **argv, int *idx, int flag);
|
||||
|
||||
|
||||
/* Option -find alias -findi, and -findx */
|
||||
/* @param flag bit0= -findx rather than -findi
|
||||
@ -663,6 +872,9 @@ int Xorriso_option_follow(struct XorrisO *xorriso, char *mode, int flag);
|
||||
int Xorriso_option_find(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
|
||||
/* Option -follow */
|
||||
int Xorriso_option_follow(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -fs */
|
||||
int Xorriso_option_fs(struct XorrisO *xorriso, char *size, int flag);
|
||||
|
||||
@ -684,6 +896,11 @@ int Xorriso_option_hardlinks(struct XorrisO *xorriso, char *mode, int flag);
|
||||
/* Option -help and part of -prog_help */
|
||||
int Xorriso_option_help(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -hide */
|
||||
/* @since 0.6.0 */
|
||||
int Xorriso_option_hide(struct XorrisO *xorriso, char *hide_state,
|
||||
int argc, char **argv, int *idx, int flag);
|
||||
|
||||
/* Option -history */
|
||||
int Xorriso_option_history(struct XorrisO *xorriso, char *line, int flag);
|
||||
|
||||
@ -691,6 +908,11 @@ int Xorriso_option_history(struct XorrisO *xorriso, char *line, int flag);
|
||||
int Xorriso_option_iso_rr_pattern(struct XorrisO *xorriso, char *mode,
|
||||
int flag);
|
||||
|
||||
/* Option -jigdo aspect argument */
|
||||
/* @since 0.6.4 */
|
||||
int Xorriso_option_jigdo(struct XorrisO *xorriso, char *aspect, char *arg,
|
||||
int flag);
|
||||
|
||||
/* Option -joliet "on"|"off" */
|
||||
int Xorriso_option_joliet(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
@ -705,6 +927,9 @@ int Xorriso_option_list_formats(struct XorrisO *xorriso, int flag);
|
||||
int Xorriso_option_list_profiles(struct XorrisO *xorriso, char *which,
|
||||
int flag);
|
||||
|
||||
/* Option -list_speeds */
|
||||
int Xorriso_option_list_speeds(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -load session|track|sbsector value */
|
||||
/* @param flag bit0= with adr_mode sbsector: adr_value is possibly 16 too high
|
||||
@return <=0 error , 1 success, 2 revoked by -reassure
|
||||
@ -780,14 +1005,28 @@ int Xorriso_option_mvi(struct XorrisO *xorriso, int argc, char **argv,
|
||||
/* Option -no_rc */
|
||||
int Xorriso_option_no_rc(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -not_leaf */
|
||||
/* Option -not_leaf , -as mkisofs -hide without '/' */
|
||||
/* @param flag bit0= add to iso_rr hide list rather than to disk exclusions
|
||||
@since 0.6.0
|
||||
bit1= add to joliet hide list rather than disk exclusions
|
||||
@since 0.6.0
|
||||
*/
|
||||
int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag);
|
||||
|
||||
/* Option -not_list , -quoted_not_list */
|
||||
/* @param flag bit0= -quoted_not_list */
|
||||
int Xorriso_option_not_list(struct XorrisO *xorriso, char *adr, int flag);
|
||||
|
||||
/* Option -not_paths */
|
||||
/* Option -not_mgt */
|
||||
int Xorriso_option_not_mgt(struct XorrisO *xorriso, char *setting, int flag);
|
||||
|
||||
/* Option -not_paths , -as mkisofs -hide with '/' */
|
||||
/* @param flag bit0= add to iso_rr hide list rather than to disk exclusions
|
||||
@since 0.6.0
|
||||
bit1= add to joliet hide list rather than disk exclusions
|
||||
@since 0.6.0
|
||||
bit2= enable disk pattern expansion regardless of -disk_pattern
|
||||
*/
|
||||
int Xorriso_option_not_paths(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
|
||||
@ -825,7 +1064,16 @@ int Xorriso_option_pathspecs(struct XorrisO *xorriso, char *mode, int flag);
|
||||
/* Option -pkt_output */
|
||||
int Xorriso_option_pkt_output(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -print */
|
||||
/* Option -preparer_id */
|
||||
/* @since 0.6.2 */
|
||||
int Xorriso_option_preparer_id(struct XorrisO *xorriso, char *name, int flag);
|
||||
|
||||
/* Options -print, -print_info , -print_mark */
|
||||
/* @param flag bit0-1= output channel:
|
||||
0= result channel
|
||||
1= info channel @since 1.0.6
|
||||
2= mark channel @since 1.0.6
|
||||
*/
|
||||
int Xorriso_option_print(struct XorrisO *xorriso, char *text, int flag);
|
||||
|
||||
/* Option -print_size
|
||||
@ -836,6 +1084,9 @@ int Xorriso_option_print_size(struct XorrisO *xorriso, int flag);
|
||||
/* Option -prog */
|
||||
int Xorriso_option_prog(struct XorrisO *xorriso, char *name, int flag);
|
||||
|
||||
/* Option -prompt */
|
||||
int Xorriso_option_prompt(struct XorrisO *xorriso, char *text, int flag);
|
||||
|
||||
/* Option -prog_help */
|
||||
int Xorriso_option_prog_help(struct XorrisO *xorriso, char *name, int flag);
|
||||
|
||||
@ -851,13 +1102,13 @@ int Xorriso_option_pwdi(struct XorrisO *xorriso, int flag);
|
||||
/* Option -pwdx */
|
||||
int Xorriso_option_pwdx(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -read_mkisofsrc */
|
||||
/* @since 0.6.0 */
|
||||
int Xorriso_option_read_mkisofsrc(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -reassure "on"|"tree"|"off" */
|
||||
int Xorriso_option_reassure(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -relax_compliance */
|
||||
int Xorriso_option_relax_compliance(struct XorrisO *xorriso, char *mode,
|
||||
int flag);
|
||||
|
||||
/* Option -report_about */
|
||||
int Xorriso_option_report_about(struct XorrisO *xorriso, char *severity,
|
||||
int flag);
|
||||
@ -866,9 +1117,6 @@ int Xorriso_option_report_about(struct XorrisO *xorriso, char *severity,
|
||||
int Xorriso_option_return_with(struct XorrisO *xorriso, char *severity,
|
||||
int exit_value, int flag);
|
||||
|
||||
/* Option -revoke_exclusions */
|
||||
int Xorriso_option_revoke_exclusions(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Options -rm alias -rmi , -rm_r alias -rm_ri , -rmdir alias -rmdiri */
|
||||
/* @param flag bit0=recursive , bit2= remove empty directory: rmdir */
|
||||
int Xorriso_option_rmi(struct XorrisO *xorriso, int argc, char **argv,
|
||||
@ -887,6 +1135,8 @@ int Xorriso_option_rom_toc_scan(struct XorrisO *xorriso, char *mode,
|
||||
/* Option -scdbackup_tag */
|
||||
int Xorriso_option_scdbackup_tag(struct XorrisO *xorriso, char *list_path,
|
||||
char *record_name, int flag);
|
||||
/* Option -scsi_log */
|
||||
int Xorriso_option_scsi_log(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -session_log */
|
||||
int Xorriso_option_session_log(struct XorrisO *xorriso, char *path, int flag);
|
||||
@ -917,6 +1167,12 @@ int Xorriso_option_setfattr_listi(struct XorrisO *xorriso, char *path,
|
||||
int Xorriso_option_set_filter(struct XorrisO *xorriso, char *name,
|
||||
int argc, char **argv, int *idx, int flag);
|
||||
|
||||
/* Option -signal_handling */
|
||||
/* @param flag bit0= do not yet install the eventual handler
|
||||
*/
|
||||
int Xorriso_option_signal_handling(struct XorrisO *xorriso, char *mode,
|
||||
int flag);
|
||||
|
||||
/* Option -speed */
|
||||
int Xorriso_option_speed(struct XorrisO *xorriso, char *speed, int flag);
|
||||
|
||||
@ -973,11 +1229,17 @@ int Xorriso_option_use_readline(struct XorrisO *xorriso, char *mode, int flag);
|
||||
int Xorriso_option_version(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -volid */
|
||||
/* @param flag bit0= do not warn of problematic volid
|
||||
*/
|
||||
int Xorriso_option_volid(struct XorrisO *xorriso, char *volid, int flag);
|
||||
|
||||
/* Option -volset_id */
|
||||
int Xorriso_option_volset_id(struct XorrisO *xorriso, char *name, int flag);
|
||||
|
||||
/* Option -volume_date */
|
||||
int Xorriso_option_volume_date(struct XorrisO *xorriso,
|
||||
char *time_type, char *timestring, int flag);
|
||||
|
||||
/* Option -xattr "on"|"off" */
|
||||
int Xorriso_option_xattr(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
|
4717
xorriso/xorriso.info
Normal file
4717
xorriso/xorriso.info
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user