Compare commits
1077 Commits
libssh-0.7
...
libssh-0.8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7850307210 | ||
|
|
30c0f0c0e3 | ||
|
|
b0edec4e8d | ||
|
|
391c78de9d | ||
|
|
2ba1dea549 | ||
|
|
82c375b7c9 | ||
|
|
4aea835974 | ||
|
|
2fbeb2ac88 | ||
|
|
e981113ee1 | ||
|
|
3736a0367b | ||
|
|
be73335f8e | ||
|
|
52986115b8 | ||
|
|
7a49ee5ffc | ||
|
|
c842bc2e8b | ||
|
|
8892577296 | ||
|
|
ac7c64a769 | ||
|
|
47014eb273 | ||
|
|
2223106113 | ||
|
|
4af77362b0 | ||
|
|
f4a0fcc85e | ||
|
|
fa150ef8d2 | ||
|
|
810dbd3db1 | ||
|
|
fa6aa125a2 | ||
|
|
a4948f6212 | ||
|
|
e05e4ae971 | ||
|
|
b6d275537e | ||
|
|
e69fb89e98 | ||
|
|
f9beb3c690 | ||
|
|
bfc39d578d | ||
|
|
0acfd81f85 | ||
|
|
d028b2495d | ||
|
|
68fc17caac | ||
|
|
d327712739 | ||
|
|
fded1fb9eb | ||
|
|
a6e055c42b | ||
|
|
32221ea9fb | ||
|
|
917ba07478 | ||
|
|
bcdbc11732 | ||
|
|
79289dc506 | ||
|
|
45172a70fa | ||
|
|
7b0c80b475 | ||
|
|
d5bc9a1ace | ||
|
|
80d3e10b47 | ||
|
|
455d495c74 | ||
|
|
b1bae1d90f | ||
|
|
ad4f1dbea0 | ||
|
|
5ffe695c3c | ||
|
|
230a437288 | ||
|
|
1df272c3cc | ||
|
|
c3a57fe2dc | ||
|
|
a238df2436 | ||
|
|
f5e8fa5c5f | ||
|
|
0a07266d9c | ||
|
|
953eae880f | ||
|
|
1d5215a5af | ||
|
|
2d06a83b82 | ||
|
|
fd844cac6d | ||
|
|
a106a00e0d | ||
|
|
d8372c3063 | ||
|
|
946210534e | ||
|
|
fe0331cf40 | ||
|
|
709c48eab6 | ||
|
|
3d56bdae37 | ||
|
|
8b4de1c477 | ||
|
|
906f63ba97 | ||
|
|
26ea4f059a | ||
|
|
3b46198c42 | ||
|
|
3de34944ad | ||
|
|
69cb3c5835 | ||
|
|
5102b16cf1 | ||
|
|
dc071dc6cf | ||
|
|
a8d4fbaccb | ||
|
|
56b7d2da4d | ||
|
|
a4b99eedf2 | ||
|
|
8a8498b586 | ||
|
|
44b32e940e | ||
|
|
059079581a | ||
|
|
f11be32e11 | ||
|
|
a9be4ab73e | ||
|
|
273fb4cfc6 | ||
|
|
56f7c27852 | ||
|
|
1285b37b60 | ||
|
|
b7de358cdc | ||
|
|
bea6393de0 | ||
|
|
9158cc524c | ||
|
|
8ba10ef42b | ||
|
|
2ff8a09ee6 | ||
|
|
d52fa9a02c | ||
|
|
ec3fdb434c | ||
|
|
d877969db3 | ||
|
|
b1a7bd21ad | ||
|
|
0831b85002 | ||
|
|
34d1f5e097 | ||
|
|
fcf2cd0d9e | ||
|
|
4a4ca44b19 | ||
|
|
17a6c3f88f | ||
|
|
e24bb932ed | ||
|
|
5c2d444fa8 | ||
|
|
9763563c02 | ||
|
|
5f9d9f4a53 | ||
|
|
e8f3207a0d | ||
|
|
e5cee205c1 | ||
|
|
63056d1bb1 | ||
|
|
09e4f3d331 | ||
|
|
4b886ac656 | ||
|
|
789df0b7d0 | ||
|
|
66a222a73c | ||
|
|
09a7638575 | ||
|
|
203818608a | ||
|
|
f8c452cbef | ||
|
|
adeaa69cc5 | ||
|
|
72bce5ece7 | ||
|
|
7819621fc2 | ||
|
|
fcfba0d8aa | ||
|
|
b166ac4749 | ||
|
|
160a416ef6 | ||
|
|
59071bc4c5 | ||
|
|
2ae63251d3 | ||
|
|
eefae820b5 | ||
|
|
0792fb37b0 | ||
|
|
e23c28a82b | ||
|
|
7291b50420 | ||
|
|
c1d61617fb | ||
|
|
488fb47c32 | ||
|
|
721132696c | ||
|
|
ee034e0484 | ||
|
|
d56c8fdfc6 | ||
|
|
4269b62153 | ||
|
|
c6c63030c5 | ||
|
|
afa5dbb8b1 | ||
|
|
bd7e8295e2 | ||
|
|
933d9c6b07 | ||
|
|
0f0eb05e03 | ||
|
|
171a950a80 | ||
|
|
b1b1da0f97 | ||
|
|
7453038d74 | ||
|
|
29ef92a95e | ||
|
|
6650685758 | ||
|
|
bdca6b7efa | ||
|
|
97b2a61d74 | ||
|
|
781ce47dea | ||
|
|
277ee932d6 | ||
|
|
c91f530610 | ||
|
|
69740ea841 | ||
|
|
1bb7895cd9 | ||
|
|
a028b88aed | ||
|
|
8a25f6bb07 | ||
|
|
2db453db16 | ||
|
|
03134c2932 | ||
|
|
95d0c143b3 | ||
|
|
3dcdafa6d7 | ||
|
|
75c446c529 | ||
|
|
4a9c32fc81 | ||
|
|
1634c5a91a | ||
|
|
dfa7593c27 | ||
|
|
034af66338 | ||
|
|
55c7b93a0a | ||
|
|
4818cf5606 | ||
|
|
316a3a42a4 | ||
|
|
546d9da185 | ||
|
|
3b7d997b54 | ||
|
|
129744692c | ||
|
|
83f6ce0928 | ||
|
|
b5c7f07064 | ||
|
|
223ba36d54 | ||
|
|
9141e9d4fe | ||
|
|
ead42db7c8 | ||
|
|
d5a68bedfd | ||
|
|
4307489702 | ||
|
|
f0da1f2e03 | ||
|
|
50477cb80b | ||
|
|
ded4a81ffe | ||
|
|
c2bc4e62dd | ||
|
|
f7ab481b22 | ||
|
|
628b529a91 | ||
|
|
7e25963130 | ||
|
|
91d8f1a256 | ||
|
|
61dcc023b0 | ||
|
|
4468a78ee2 | ||
|
|
8f18063b6d | ||
|
|
a167faee3e | ||
|
|
0e8f6aaee5 | ||
|
|
f0a1b94d0d | ||
|
|
5d1ddf5920 | ||
|
|
152ae623c2 | ||
|
|
e7bd9d02bc | ||
|
|
9196639940 | ||
|
|
786d7e39a3 | ||
|
|
c33710d112 | ||
|
|
a14a80f35f | ||
|
|
0389ff6d9d | ||
|
|
8954fccfdb | ||
|
|
332df98fc9 | ||
|
|
d4cc3f69c6 | ||
|
|
534c58c475 | ||
|
|
84fd910423 | ||
|
|
d51f77c2b1 | ||
|
|
47376cbc77 | ||
|
|
85c3db3e89 | ||
|
|
3f8a522c7f | ||
|
|
eb08802b7c | ||
|
|
dc587045bf | ||
|
|
9b495b72c5 | ||
|
|
2ce6c56609 | ||
|
|
9caef95899 | ||
|
|
66c2630aaf | ||
|
|
b8f63ee2df | ||
|
|
68adb49996 | ||
|
|
12e94bfd18 | ||
|
|
4fc3d7a27f | ||
|
|
466bb332c1 | ||
|
|
ff25b45367 | ||
|
|
df83f4fb57 | ||
|
|
5bda3ab9f6 | ||
|
|
9a057159a2 | ||
|
|
9c0875dd5d | ||
|
|
1fa5a2a504 | ||
|
|
a08a2f52fb | ||
|
|
21d37f8605 | ||
|
|
e43586b4de | ||
|
|
dc7e1bdb39 | ||
|
|
03d559b066 | ||
|
|
3191c1f6be | ||
|
|
d46f01cb7c | ||
|
|
04e290a19b | ||
|
|
bad407f5e2 | ||
|
|
2787756efe | ||
|
|
7b35afdf6b | ||
|
|
dba2903e38 | ||
|
|
965014b035 | ||
|
|
c4ec92f375 | ||
|
|
54cf9d1364 | ||
|
|
23ce6d7156 | ||
|
|
07473976e1 | ||
|
|
51063fe07e | ||
|
|
9cc1af1d53 | ||
|
|
8a83bc0569 | ||
|
|
0181f5b5ed | ||
|
|
eaae8ce086 | ||
|
|
0b2072dd30 | ||
|
|
2e77cf6b34 | ||
|
|
ad3c052e1c | ||
|
|
57d9d97866 | ||
|
|
22747c862a | ||
|
|
fed755eee5 | ||
|
|
804410f8ad | ||
|
|
df57a9a81d | ||
|
|
97076780a5 | ||
|
|
899553f9f7 | ||
|
|
2edff5e69e | ||
|
|
37f451171b | ||
|
|
2efc1721d8 | ||
|
|
e9613e6b52 | ||
|
|
73fbe68ccd | ||
|
|
0cb282df99 | ||
|
|
fdb0c0a29b | ||
|
|
2e56db3b2f | ||
|
|
4eb759bf40 | ||
|
|
c3987a9796 | ||
|
|
a070c942e7 | ||
|
|
113b1872cf | ||
|
|
c7dc2937fc | ||
|
|
075895da40 | ||
|
|
7930086a37 | ||
|
|
3f376f848d | ||
|
|
3cee61a65b | ||
|
|
90321f732e | ||
|
|
c6140b1a4c | ||
|
|
9290d89570 | ||
|
|
da9ab71f88 | ||
|
|
53dfee98d2 | ||
|
|
bb14611f86 | ||
|
|
b1aca92268 | ||
|
|
2b524655ae | ||
|
|
b51594c34a | ||
|
|
b409b7d092 | ||
|
|
4256936fed | ||
|
|
fdb6dc7069 | ||
|
|
6291900234 | ||
|
|
216bd2abd8 | ||
|
|
574f279f00 | ||
|
|
d886870bbf | ||
|
|
f56c93cccd | ||
|
|
bbd17bc97a | ||
|
|
26fa923b55 | ||
|
|
177a082974 | ||
|
|
ce3ee332d4 | ||
|
|
eb95f8fa85 | ||
|
|
8d3db75724 | ||
|
|
e1fbc02209 | ||
|
|
766041d956 | ||
|
|
f880a7728f | ||
|
|
013203301f | ||
|
|
bfb60befa7 | ||
|
|
4d34890624 | ||
|
|
6751c0e2c3 | ||
|
|
a641b6ea79 | ||
|
|
fa3c73016d | ||
|
|
ffabd8c6ed | ||
|
|
219a311925 | ||
|
|
8e3af4d859 | ||
|
|
9fa614a36d | ||
|
|
3d207f72a0 | ||
|
|
f53d2f7511 | ||
|
|
b853d99546 | ||
|
|
a09976e3d6 | ||
|
|
1ba0432524 | ||
|
|
7dcd749ee1 | ||
|
|
30368fb06a | ||
|
|
fd6b7db1ce | ||
|
|
53514b2a40 | ||
|
|
0e20418296 | ||
|
|
92b59ace9e | ||
|
|
af7b5b78ee | ||
|
|
2b67e2d54c | ||
|
|
f44994f1e6 | ||
|
|
97d6eb84a4 | ||
|
|
33f2211cae | ||
|
|
03aff19b80 | ||
|
|
cf660fe27c | ||
|
|
f9d60e1360 | ||
|
|
1098280e43 | ||
|
|
62301834f4 | ||
|
|
3e0ac84001 | ||
|
|
4d26e08789 | ||
|
|
3c4403c400 | ||
|
|
8dcde7a74f | ||
|
|
bb7cd8e22b | ||
|
|
7458e95ee5 | ||
|
|
2f69c5f022 | ||
|
|
efdd567a1b | ||
|
|
cff8f7c0b5 | ||
|
|
fe4a4b1b79 | ||
|
|
8caf653e97 | ||
|
|
88c4d532ab | ||
|
|
e69d063252 | ||
|
|
a35218da74 | ||
|
|
4d8e2cdc8b | ||
|
|
3d0f2977bf | ||
|
|
230929a4b2 | ||
|
|
c847216ca4 | ||
|
|
cacd2fa999 | ||
|
|
0b688e4829 | ||
|
|
27cf0ea06b | ||
|
|
e473108e1b | ||
|
|
c74cc9a606 | ||
|
|
619e60cf0e | ||
|
|
37b3657481 | ||
|
|
c1211a4e1a | ||
|
|
95d34b5937 | ||
|
|
6dc3f666c5 | ||
|
|
8e4491a532 | ||
|
|
492095b2a7 | ||
|
|
d516642980 | ||
|
|
193845ecdd | ||
|
|
598d04d5d9 | ||
|
|
06c5dd9c84 | ||
|
|
6632659907 | ||
|
|
86bf835d50 | ||
|
|
c9d0362a6b | ||
|
|
d2989f28db | ||
|
|
0bab6013d0 | ||
|
|
361d93586c | ||
|
|
0db13661b4 | ||
|
|
c866592d7d | ||
|
|
eb90325bed | ||
|
|
c878545977 | ||
|
|
741021513b | ||
|
|
97e8aba080 | ||
|
|
802d46d040 | ||
|
|
96718df15e | ||
|
|
89bd779e78 | ||
|
|
b5af3e74d7 | ||
|
|
2d3932d988 | ||
|
|
d0c1583ad2 | ||
|
|
59ff4064ba | ||
|
|
00a68c985f | ||
|
|
e862ea556c | ||
|
|
a4704cba0b | ||
|
|
455b3a7865 | ||
|
|
fabaab1540 | ||
|
|
8ac49ff181 | ||
|
|
cdf55a18d2 | ||
|
|
d158ca7101 | ||
|
|
664b7ebfa1 | ||
|
|
163c488e30 | ||
|
|
4b5bfa7a9d | ||
|
|
decbadda45 | ||
|
|
f00d780c16 | ||
|
|
1daa2e4609 | ||
|
|
d84bc3ad8e | ||
|
|
a9350e3205 | ||
|
|
95e3a7e7a3 | ||
|
|
e4cecee7d3 | ||
|
|
8b867b41d3 | ||
|
|
c6bd2fe734 | ||
|
|
d7e52b99bd | ||
|
|
a640d9472a | ||
|
|
b15103ef4e | ||
|
|
95071cd1fe | ||
|
|
18a888f9fb | ||
|
|
bbfc41948a | ||
|
|
c29a8cc084 | ||
|
|
54e7af83e6 | ||
|
|
3483d6327d | ||
|
|
5869345899 | ||
|
|
0cad2778b4 | ||
|
|
24de1fbde8 | ||
|
|
131728a680 | ||
|
|
e949e135b6 | ||
|
|
1510b63d20 | ||
|
|
0db4d9bd46 | ||
|
|
1e17e084bf | ||
|
|
a2c14c5ec5 | ||
|
|
b99849c831 | ||
|
|
c7d4286ca1 | ||
|
|
434e2b7212 | ||
|
|
acf0f0fa6e | ||
|
|
220e6b66e8 | ||
|
|
c4d4731ddf | ||
|
|
139ccaa78c | ||
|
|
c42410b560 | ||
|
|
120f11812d | ||
|
|
500486d501 | ||
|
|
6708debd4c | ||
|
|
852a8b4875 | ||
|
|
9c6b4ecb48 | ||
|
|
d66ea0b3b1 | ||
|
|
1d93b94086 | ||
|
|
efc427fdce | ||
|
|
0f64bc78a8 | ||
|
|
2dbb7ff091 | ||
|
|
b77fa93551 | ||
|
|
8ce4004260 | ||
|
|
8c11367410 | ||
|
|
460026459b | ||
|
|
6c87316a9c | ||
|
|
96476f74af | ||
|
|
52b57077de | ||
|
|
2839d48cb8 | ||
|
|
5ea81166bf | ||
|
|
a86d1d335b | ||
|
|
18dd902307 | ||
|
|
d85827f646 | ||
|
|
6e74c6c1dc | ||
|
|
ec6df9896a | ||
|
|
ab7c5c448c | ||
|
|
5871d604cd | ||
|
|
f6fe7488e3 | ||
|
|
24aef4fbf1 | ||
|
|
fbfe002460 | ||
|
|
c7525c056c | ||
|
|
1509693cce | ||
|
|
67ef808a95 | ||
|
|
aeefcd8199 | ||
|
|
9bc050d07d | ||
|
|
c2776f70c1 | ||
|
|
e6020f94bf | ||
|
|
9305762fcd | ||
|
|
e0e0d62a71 | ||
|
|
708f127788 | ||
|
|
dd3d867452 | ||
|
|
5443863723 | ||
|
|
edcdef94ee | ||
|
|
04cc7b769a | ||
|
|
83b43443e5 | ||
|
|
6a077fe750 | ||
|
|
b2a681bd29 | ||
|
|
18077673ac | ||
|
|
25407209b0 | ||
|
|
0e886ba803 | ||
|
|
c8429113fa | ||
|
|
e1d2454dd7 | ||
|
|
ed738bee34 | ||
|
|
12284b75fa | ||
|
|
afa4021ded | ||
|
|
c425082394 | ||
|
|
db9da99a36 | ||
|
|
c3dac948c9 | ||
|
|
c866768da4 | ||
|
|
2b40ad29c0 | ||
|
|
38c53db953 | ||
|
|
c503bb572e | ||
|
|
36a727e656 | ||
|
|
7b9a07c363 | ||
|
|
4b298ca770 | ||
|
|
8e211c0689 | ||
|
|
d25b8fb550 | ||
|
|
f1b36c18f6 | ||
|
|
b3a7e86a4a | ||
|
|
d316390825 | ||
|
|
3141dec632 | ||
|
|
539d7ba249 | ||
|
|
83a46c7756 | ||
|
|
2d90bc9d6b | ||
|
|
de44fdfd35 | ||
|
|
65a5154eff | ||
|
|
613dcc95e6 | ||
|
|
77e1761734 | ||
|
|
e49e4e13f3 | ||
|
|
e73ae60e1a | ||
|
|
584c345451 | ||
|
|
bfbd574098 | ||
|
|
b4462bdea0 | ||
|
|
6b8d1aa836 | ||
|
|
d90b88588f | ||
|
|
6a715b80d6 | ||
|
|
084769b88c | ||
|
|
f4408f38a3 | ||
|
|
6dd9303729 | ||
|
|
a19513b87a | ||
|
|
21962dd154 | ||
|
|
8917b84840 | ||
|
|
4b0fd10a99 | ||
|
|
3350fd7479 | ||
|
|
c98b00a5f4 | ||
|
|
88673b2d1f | ||
|
|
f425ebb098 | ||
|
|
f6284eafd6 | ||
|
|
cf250171de | ||
|
|
a82e24f024 | ||
|
|
60450ef936 | ||
|
|
d11d764c9d | ||
|
|
ac5c90d771 | ||
|
|
14045f516e | ||
|
|
3e70f06fc8 | ||
|
|
a2a6dddacf | ||
|
|
a366bb3b45 | ||
|
|
a4a6017e6e | ||
|
|
e60cb2ee10 | ||
|
|
da0f360478 | ||
|
|
206f3ff895 | ||
|
|
81b4320318 | ||
|
|
bed60f9b84 | ||
|
|
10728f8577 | ||
|
|
72141cae0b | ||
|
|
ec842c3ca3 | ||
|
|
054d2dffc1 | ||
|
|
d971983d5e | ||
|
|
946f8f64ef | ||
|
|
84ac7d1de0 | ||
|
|
f4ddf9df53 | ||
|
|
d7477dc745 | ||
|
|
1444ae5add | ||
|
|
aa95eb1965 | ||
|
|
649a7490a6 | ||
|
|
c089b700c6 | ||
|
|
c8d6445d44 | ||
|
|
d4a4ce4d44 | ||
|
|
7a2624dee4 | ||
|
|
f827833d82 | ||
|
|
6f38e0b771 | ||
|
|
622ff855f5 | ||
|
|
26734a547a | ||
|
|
1ece5a849c | ||
|
|
23accdde1a | ||
|
|
321ec2cb1c | ||
|
|
27711f6a4c | ||
|
|
238202d380 | ||
|
|
8a735d5eb7 | ||
|
|
d038c4dee7 | ||
|
|
ebd76bf347 | ||
|
|
acc1ade74a | ||
|
|
72e4500da9 | ||
|
|
c4f3bf4ffa | ||
|
|
c563ed636a | ||
|
|
f3de2974a9 | ||
|
|
1b8ce5a6ed | ||
|
|
deb7630c67 | ||
|
|
cbd9569b99 | ||
|
|
a45a04ff4d | ||
|
|
7aa496d844 | ||
|
|
bf10a66b5d | ||
|
|
adc817cf13 | ||
|
|
787a649390 | ||
|
|
54690e6cdd | ||
|
|
4e3fb81172 | ||
|
|
6273c409e3 | ||
|
|
7798d39187 | ||
|
|
58ef1e96b8 | ||
|
|
732818ebb2 | ||
|
|
448de134ac | ||
|
|
fd3d8d6496 | ||
|
|
0b90ab102e | ||
|
|
cd3170fcb1 | ||
|
|
9eaf55898e | ||
|
|
10e1e396fc | ||
|
|
c1db283c39 | ||
|
|
6c97122120 | ||
|
|
0dd33d8ed1 | ||
|
|
0db12d7f75 | ||
|
|
c1d8ba47dd | ||
|
|
dc4cc08c3a | ||
|
|
e880cafed0 | ||
|
|
1ae014f52a | ||
|
|
1369559385 | ||
|
|
7ef72ec91f | ||
|
|
b74a184172 | ||
|
|
b50fb638f7 | ||
|
|
e06ae8e096 | ||
|
|
0940b0f29b | ||
|
|
03b05c8a5e | ||
|
|
9e4f9a26d4 | ||
|
|
f5f8c0fc76 | ||
|
|
c4dbe3b863 | ||
|
|
669678119c | ||
|
|
34e7a3cf8c | ||
|
|
1001cbbb99 | ||
|
|
36d52ee205 | ||
|
|
0ad462102a | ||
|
|
c6ee41bff3 | ||
|
|
5012a9c146 | ||
|
|
93781f9d5a | ||
|
|
4550c99222 | ||
|
|
a209f928d2 | ||
|
|
f23dbe6f42 | ||
|
|
974e1831a0 | ||
|
|
963c46e4fb | ||
|
|
32c49ea134 | ||
|
|
a465ea2d49 | ||
|
|
702e9e8ad5 | ||
|
|
250bf37a28 | ||
|
|
952c64b4c0 | ||
|
|
bcaeaf17af | ||
|
|
f4e57a6e22 | ||
|
|
8457580f61 | ||
|
|
f1ff9ae00c | ||
|
|
ed4ea51bb8 | ||
|
|
22a92da30d | ||
|
|
362b20a0bc | ||
|
|
72f6b34dbc | ||
|
|
816234350d | ||
|
|
4aeb0cfd9c | ||
|
|
be414423d7 | ||
|
|
abd1a1f372 | ||
|
|
c705fb6e3b | ||
|
|
1a36aa21ba | ||
|
|
c2f8010b60 | ||
|
|
64985f7bea | ||
|
|
3f562ee586 | ||
|
|
eb796b4bbb | ||
|
|
87b8d232bd | ||
|
|
6f1f8d2bdb | ||
|
|
a95bc8a016 | ||
|
|
f3a19d8c96 | ||
|
|
e005fd310f | ||
|
|
fb2fefb3c6 | ||
|
|
6026fc8036 | ||
|
|
2cc5b5865c | ||
|
|
8d65edb41f | ||
|
|
1247ba3398 | ||
|
|
be22c0d442 | ||
|
|
467d78a442 | ||
|
|
a4aeee972c | ||
|
|
16217454d5 | ||
|
|
7e1e0e5098 | ||
|
|
3fa0e3959c | ||
|
|
dd20253fec | ||
|
|
85ab4ee53a | ||
|
|
25f31760aa | ||
|
|
d11869bdb6 | ||
|
|
81847bf513 | ||
|
|
bba40abc76 | ||
|
|
0c12643466 | ||
|
|
1319d2ceb2 | ||
|
|
cc1f496741 | ||
|
|
963111b836 | ||
|
|
ebcff9fd63 | ||
|
|
25ff1214a4 | ||
|
|
d84b0926f0 | ||
|
|
f19158cadf | ||
|
|
459677e20e | ||
|
|
43bd7b6eee | ||
|
|
d7c47f529f | ||
|
|
2cff66c155 | ||
|
|
78ce67f579 | ||
|
|
2fb8198c48 | ||
|
|
2ea3683347 | ||
|
|
aaeb938ca4 | ||
|
|
ef4a81ea0c | ||
|
|
e9073a6bdb | ||
|
|
9086d5ca33 | ||
|
|
3c65057fad | ||
|
|
f9b1dece41 | ||
|
|
f7a2330de7 | ||
|
|
67b8f3d6df | ||
|
|
b0af812710 | ||
|
|
d13a17a27c | ||
|
|
ddfc36aa56 | ||
|
|
a5997d180d | ||
|
|
51875db70c | ||
|
|
5ad7da7fd2 | ||
|
|
59308bc269 | ||
|
|
fd2ef07f37 | ||
|
|
e19163eabb | ||
|
|
37acd3eca8 | ||
|
|
cc13e85202 | ||
|
|
720739bc2a | ||
|
|
ea99215664 | ||
|
|
c3c492a190 | ||
|
|
778652460f | ||
|
|
5c3b1ee0a4 | ||
|
|
4dec2f989c | ||
|
|
5fdfa8fe44 | ||
|
|
176b92a4f4 | ||
|
|
afc6a4e973 | ||
|
|
53d84abb17 | ||
|
|
dab8985c05 | ||
|
|
0bd6ccc066 | ||
|
|
5c7b8802f2 | ||
|
|
b8e301ade3 | ||
|
|
99c5160cb5 | ||
|
|
110da49504 | ||
|
|
f3754dc072 | ||
|
|
78a3ab2eaa | ||
|
|
4da7985204 | ||
|
|
2a66c38efa | ||
|
|
2e31dffdb7 | ||
|
|
88e43d2502 | ||
|
|
4166bb2a26 | ||
|
|
f818e63f8f | ||
|
|
094aa5eb02 | ||
|
|
5d3ab421e1 | ||
|
|
f8f7989c3d | ||
|
|
b92c499626 | ||
|
|
9fce33a2e3 | ||
|
|
7a65f7f028 | ||
|
|
f525fdb2e1 | ||
|
|
01994ea302 | ||
|
|
c4ddf62f7e | ||
|
|
2ec633f33d | ||
|
|
748d749675 | ||
|
|
77f632a559 | ||
|
|
54165a394a | ||
|
|
16818bd0e4 | ||
|
|
d29d199592 | ||
|
|
17c03005d8 | ||
|
|
509fa8a7b2 | ||
|
|
954da14c15 | ||
|
|
7527876fad | ||
|
|
9d79b7629c | ||
|
|
538f1bc00e | ||
|
|
f0ddde4826 | ||
|
|
d3834f69bc | ||
|
|
f7b8394127 | ||
|
|
72cf2e3ae2 | ||
|
|
164cee66ee | ||
|
|
9003f92e8f | ||
|
|
8d7563a9c3 | ||
|
|
4c4a03f056 | ||
|
|
73d76a2638 | ||
|
|
1c9eb4dfb9 | ||
|
|
94fa1e382f | ||
|
|
2e70077bbc | ||
|
|
2493e962fe | ||
|
|
a9846ccc0d | ||
|
|
7204d2f485 | ||
|
|
6252aab88a | ||
|
|
4c602f2255 | ||
|
|
6803c2f86d | ||
|
|
316ee071cf | ||
|
|
895055ab38 | ||
|
|
de35212789 | ||
|
|
337306600b | ||
|
|
efb7635162 | ||
|
|
8ecd65bcdb | ||
|
|
74d17a6531 | ||
|
|
b9b89ef7c6 | ||
|
|
a4dc74064c | ||
|
|
fa86229673 | ||
|
|
c317d95911 | ||
|
|
380390c4b6 | ||
|
|
e66f370682 | ||
|
|
a5bc81d406 | ||
|
|
2f42296edd | ||
|
|
d9ff44b46e | ||
|
|
c480ac8522 | ||
|
|
a89a67e008 | ||
|
|
a97db12f4f | ||
|
|
14d8e940e6 | ||
|
|
effd7ba13c | ||
|
|
a64ddff3fe | ||
|
|
25384e9558 | ||
|
|
0cb2974bd8 | ||
|
|
87527adada | ||
|
|
0cffb88b80 | ||
|
|
b0c2ca1b66 | ||
|
|
c50f2d1356 | ||
|
|
48e7b098f8 | ||
|
|
5333be5988 | ||
|
|
e4f80bd142 | ||
|
|
abbd6e304a | ||
|
|
7c79b5c154 | ||
|
|
5eb41492c4 | ||
|
|
c78c6c6542 | ||
|
|
d5d8349224 | ||
|
|
67a2ba6f99 | ||
|
|
79437fa0c9 | ||
|
|
76ba2b0055 | ||
|
|
68b7ca6e92 | ||
|
|
c165c396de | ||
|
|
f21ddefedb | ||
|
|
0cf1c85542 | ||
|
|
57550e6211 | ||
|
|
34bdc1ca78 | ||
|
|
5f202d7ffa | ||
|
|
c3a8b5009f | ||
|
|
9ef7e90821 | ||
|
|
38cb19268a | ||
|
|
72fdb4867e | ||
|
|
9dc650b7fb | ||
|
|
3ec8babfaf | ||
|
|
462c7726c3 | ||
|
|
e0fa48d2ed | ||
|
|
73e8277072 | ||
|
|
c7e9dc2ee3 | ||
|
|
166b9f7709 | ||
|
|
de369b46b1 | ||
|
|
043560d7dd | ||
|
|
4b33c6bb97 | ||
|
|
2f6a866373 | ||
|
|
f8ef200e76 | ||
|
|
3daf1760a1 | ||
|
|
2dff359a33 | ||
|
|
3341f49a49 | ||
|
|
5d2e9ee66e | ||
|
|
607c671f67 | ||
|
|
cf1e808e2f | ||
|
|
b6cfde8987 | ||
|
|
d73f665edd | ||
|
|
52efbc3a23 | ||
|
|
639dc3b5fd | ||
|
|
cff7882391 | ||
|
|
5d1a8cd88b | ||
|
|
528b9c5323 | ||
|
|
fab85b495e | ||
|
|
293ab4bd40 | ||
|
|
a45db022e9 | ||
|
|
02be4802d5 | ||
|
|
5437deed1b | ||
|
|
422271bd40 | ||
|
|
801bc29494 | ||
|
|
857ce2376e | ||
|
|
1bf6c965e4 | ||
|
|
fa2332354b | ||
|
|
e9aebb1198 | ||
|
|
fbe8ccdf3b | ||
|
|
34241cbb2b | ||
|
|
e9ba2da9e9 | ||
|
|
5b84772343 | ||
|
|
d8474207b6 | ||
|
|
b78f2ed75d | ||
|
|
2af88a679d | ||
|
|
ad0ac12c40 | ||
|
|
e3a866b8c1 | ||
|
|
f62cded9f0 | ||
|
|
7e315629b9 | ||
|
|
3c2ea78a09 | ||
|
|
85bcfab719 | ||
|
|
67ffe26dea | ||
|
|
bc78383fac | ||
|
|
1ec528b048 | ||
|
|
2a9c396603 | ||
|
|
4f392ebc7e | ||
|
|
1cc1a352fc | ||
|
|
cfe7065ce1 | ||
|
|
f561e6bcb3 | ||
|
|
83421c0e8c | ||
|
|
095733ed9c | ||
|
|
155a155d1d | ||
|
|
dbf72ffba2 | ||
|
|
47d21b6420 | ||
|
|
72eb4adbf0 | ||
|
|
3f9ce10525 | ||
|
|
412c501442 | ||
|
|
5c70dd8b85 | ||
|
|
d5068ed07d | ||
|
|
bc2db86d1c | ||
|
|
2fe9c2e352 | ||
|
|
d4e3401c23 | ||
|
|
2bd6501552 | ||
|
|
4f7be0dbb2 | ||
|
|
1da5c94b44 | ||
|
|
3d1edffe77 | ||
|
|
cb52ed7b12 | ||
|
|
22799b107d | ||
|
|
c3ce3d5cc3 | ||
|
|
32eea120af | ||
|
|
8e42d3959c | ||
|
|
f8be4d1b3b | ||
|
|
9b3648ded0 | ||
|
|
0701745cbc | ||
|
|
bbe437dbb1 | ||
|
|
5c67530f1e | ||
|
|
e40e6e8686 | ||
|
|
6f3a7d36bb | ||
|
|
5dddebd338 | ||
|
|
80d88dd3d9 | ||
|
|
0faffac020 | ||
|
|
5aaae4cb6b | ||
|
|
c092101e01 | ||
|
|
d7df4429eb | ||
|
|
ffe8b98cc2 | ||
|
|
aa5c7c3b0c | ||
|
|
886fdc8bc2 | ||
|
|
33ecaaac01 | ||
|
|
3c69092cde | ||
|
|
e8b28f978e | ||
|
|
92fdf31d29 | ||
|
|
878a650c7a | ||
|
|
e518ec1cb7 | ||
|
|
ed34425306 | ||
|
|
1d7f87fc0e | ||
|
|
735e34f932 | ||
|
|
fea9e3050c | ||
|
|
bbd0522026 | ||
|
|
e37fd83254 | ||
|
|
926b9e937b | ||
|
|
fc9434465c | ||
|
|
ba3ee9f007 | ||
|
|
38d8befcd0 | ||
|
|
e1d36314a2 | ||
|
|
9a54f91bb7 | ||
|
|
16d58e93af | ||
|
|
2384236849 | ||
|
|
252cd6eae9 | ||
|
|
8fe8dbb378 | ||
|
|
8923a01264 | ||
|
|
6cbab4936d | ||
|
|
0310cba2b6 | ||
|
|
0b9804a95b | ||
|
|
7c2db045a8 | ||
|
|
5027627344 | ||
|
|
4d43fbfb50 | ||
|
|
4e6ff36a9a | ||
|
|
f8bde7156f | ||
|
|
66c6ae1a55 | ||
|
|
1bc4176d65 | ||
|
|
de309c51a7 | ||
|
|
f128ffd88b | ||
|
|
063430744d | ||
|
|
cbd75c3e35 | ||
|
|
1729d4a168 | ||
|
|
773771659e | ||
|
|
c365ff3d05 | ||
|
|
1bbfe058f9 | ||
|
|
02d9b05f54 | ||
|
|
5c5b1aaaa7 | ||
|
|
6953c8ec91 | ||
|
|
58aff4495e | ||
|
|
3e2a61cc47 | ||
|
|
120d2b5333 | ||
|
|
d1d003c232 | ||
|
|
3cf72e5258 | ||
|
|
05fd0acf45 | ||
|
|
25707e9752 | ||
|
|
9774b1062d | ||
|
|
954341dd1f | ||
|
|
56d0e91e10 | ||
|
|
d7349d04d0 | ||
|
|
1226add976 | ||
|
|
234b05708c | ||
|
|
e368d01385 | ||
|
|
310c41a89a | ||
|
|
1102ea4c55 | ||
|
|
c487f5db5b | ||
|
|
501faacf8e | ||
|
|
adc8c20ac1 | ||
|
|
63e52afd5b | ||
|
|
6f60449e18 | ||
|
|
77052d3a1e | ||
|
|
898be61fc6 | ||
|
|
9ccb6864be | ||
|
|
2379ddff17 | ||
|
|
41a10699e6 | ||
|
|
b1c0121507 | ||
|
|
f6bea8d061 | ||
|
|
9bb7e68b86 | ||
|
|
20718ec52b | ||
|
|
a3557b81de | ||
|
|
485d78d768 | ||
|
|
7aa84318ae | ||
|
|
0e98f1214d | ||
|
|
6e7eae968a | ||
|
|
5bb9b570f4 | ||
|
|
571f547556 | ||
|
|
af3de262b6 | ||
|
|
bd4a0aa705 | ||
|
|
4bc6af6c17 | ||
|
|
27834cce2c | ||
|
|
a30d16c48a | ||
|
|
e4653b82bd | ||
|
|
b65dcb3a35 | ||
|
|
c1fb948397 | ||
|
|
be25b58380 | ||
|
|
66f51df9df | ||
|
|
3014e3c458 | ||
|
|
dd0d04ae8d | ||
|
|
112d4cc7e6 | ||
|
|
ee8664418a | ||
|
|
ae89b6c078 | ||
|
|
d403c01a30 | ||
|
|
14f1ce2e5b | ||
|
|
62b0f58d24 | ||
|
|
c3f963e71e | ||
|
|
fd09c4cb29 | ||
|
|
13f68fc2d5 | ||
|
|
7a523597ad | ||
|
|
c2d636270c | ||
|
|
21b0d29e38 | ||
|
|
6596d27e19 | ||
|
|
ed6294b4bb | ||
|
|
12da51ac5a | ||
|
|
b3ad6a015b | ||
|
|
be36586d74 | ||
|
|
0d7da3207f | ||
|
|
71ce6592e4 | ||
|
|
a5d6ccdc2c | ||
|
|
378fcccc0a | ||
|
|
3ed3833a38 | ||
|
|
5450b478f5 | ||
|
|
94d00009cc | ||
|
|
21bf499bb4 | ||
|
|
8ec46cbd42 | ||
|
|
0409a302bb | ||
|
|
84a85803b4 | ||
|
|
d46fe6a51c | ||
|
|
e83b4e8129 | ||
|
|
392e09e3de | ||
|
|
06b9901e64 | ||
|
|
677fa8ced2 | ||
|
|
3c333aa9b4 | ||
|
|
73d8c919b7 | ||
|
|
747e7d05db | ||
|
|
1f3a9105ff | ||
|
|
b0f22fde62 | ||
|
|
11f43df873 | ||
|
|
1254ed1833 | ||
|
|
f55b10e4ed | ||
|
|
d8be35de7f | ||
|
|
bdfe6870f6 | ||
|
|
9775f78ab2 | ||
|
|
6da4e21065 | ||
|
|
7bfe8d2f03 | ||
|
|
3b0b1c3ee3 | ||
|
|
82a80b205b | ||
|
|
5b586fdfec | ||
|
|
2f193b5cbb | ||
|
|
e6f93c887b | ||
|
|
36d9b62f1f | ||
|
|
da4bebbe1e | ||
|
|
d54a1ab798 | ||
|
|
e1081796af | ||
|
|
672c3be9ed | ||
|
|
dc9c4d22ab | ||
|
|
71d86be42e | ||
|
|
267fe02088 | ||
|
|
52b5258ed4 | ||
|
|
2bf6e66ffe | ||
|
|
728c2fbd01 | ||
|
|
613b71b385 | ||
|
|
70cc11618a | ||
|
|
387fd2cf53 | ||
|
|
0423057424 | ||
|
|
cc25d747d4 | ||
|
|
7637351065 | ||
|
|
7aeba71a92 | ||
|
|
e020dd8d59 | ||
|
|
a65af1b3b8 | ||
|
|
5478de1a64 | ||
|
|
fa9fbb1d67 | ||
|
|
ef751a26d0 | ||
|
|
30a7229fc5 | ||
|
|
1d69e073af | ||
|
|
c480a29052 | ||
|
|
4aef82237d | ||
|
|
8a4a22d7b7 |
4
.arcconfig
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"phabricator.uri" : "https://bugs.libssh.org/",
|
||||||
|
"history.immutable": true
|
||||||
|
}
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
-DWITH_SERVER=1
|
|
||||||
-DWITH_GSSAPI=1
|
|
||||||
-DWITH_ZLIB=1
|
|
||||||
-DWITH_SFTP=1
|
|
||||||
-DWITH_SSH1=1
|
|
||||||
-DWITH_PCAP=1
|
|
||||||
-DHAVE_ECDH=1
|
|
||||||
-DHAVE_ECC=1
|
|
||||||
-Iinclude/libssh
|
|
||||||
-Iinclude
|
|
||||||
-Ibuild
|
|
||||||
-Itests
|
|
||||||
-Isrc
|
|
||||||
4
.gitignore
vendored
@@ -3,7 +3,7 @@
|
|||||||
.*
|
.*
|
||||||
*.swp
|
*.swp
|
||||||
*~$
|
*~$
|
||||||
obj
|
|
||||||
cscope.*
|
cscope.*
|
||||||
tags
|
tags
|
||||||
build
|
/build
|
||||||
|
/obj*
|
||||||
|
|||||||
334
.gitlab-ci.yml
Normal file
@@ -0,0 +1,334 @@
|
|||||||
|
variables:
|
||||||
|
BUILD_IMAGES_PROJECT: libssh/build-images
|
||||||
|
FEDORA_BUILD: buildenv-fedora
|
||||||
|
CENTOS7_BUILD: buildenv-centos7
|
||||||
|
TUMBLEWEED_BUILD: buildenv-tumbleweed
|
||||||
|
MINGW_BUILD: buildenv-mingw
|
||||||
|
|
||||||
|
# torture_auth fails on centos7 docker images, so we don't use -DCLIENT_TESTING=ON
|
||||||
|
centos7/openssl_1.0.x/x86-64:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$CENTOS7_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake3 -DUNIT_TESTING=ON -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON
|
||||||
|
-DWITH_PCAP=ON .. && make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
fedora/openssl_1.1.x/x86-64:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON .. &&
|
||||||
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
fedora/openssl_1.1.x/x86-64/release:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Release
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON .. &&
|
||||||
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
# Address sanitizer doesn't mix well with LD_PRELOAD used in the testsuite
|
||||||
|
# so, this is only enabled for unit tests right now.
|
||||||
|
# TODO: add -DCLIENT_TESTING=ON -DSERVER_TESTING=ON
|
||||||
|
fedora/address-sanitizer:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake
|
||||||
|
-DCMAKE_BUILD_TYPE=AddressSanitizer
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DUNIT_TESTING=ON .. &&
|
||||||
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
fedora/undefined-sanitizer:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake
|
||||||
|
-DCMAKE_C_FLAGS="-fsanitize=undefined -fsanitize=null -fsanitize=alignment -fno-sanitize-recover"
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON ..
|
||||||
|
&& make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
fedora/static-analysis:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
|
||||||
|
script:
|
||||||
|
- export CCC_CC=clang
|
||||||
|
- export CCC_CXX=clang++
|
||||||
|
- mkdir -p obj && cd obj && scan-build cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON
|
||||||
|
-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang .. &&
|
||||||
|
scan-build --status-bugs -o scan make -j$(nproc)
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/scan
|
||||||
|
|
||||||
|
# That is a specific runner that we cannot enable universally.
|
||||||
|
# We restrict it to builds under the $BUILD_IMAGES_PROJECT project.
|
||||||
|
freebsd/x86-64:
|
||||||
|
image:
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
|
-DUNIT_TESTING=ON .. &&
|
||||||
|
make && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- freebsd
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
only:
|
||||||
|
- branches@libssh/libssh-mirror
|
||||||
|
- branches@cryptomilk/libssh-mirror
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
fedora/libgcrypt/x86-64:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON
|
||||||
|
-DWITH_GCRYPT=ON .. &&
|
||||||
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
fedora/mbedtls/x86-64:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
|
-DWITH_MBEDTLS=ON .. &&
|
||||||
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
tumbleweed/openssl_1.1.x/x86-64:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DKRB5_CONFIG=/usr/lib/mit/bin/krb5-config
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON .. &&
|
||||||
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
tumbleweed/openssl_1.1.x/x86-64/release:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake -DCMAKE_BUILD_TYPE=Release
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DKRB5_CONFIG=/usr/lib/mit/bin/krb5-config
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON .. &&
|
||||||
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
tumbleweed/docs:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake .. && make docs
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
tumbleweed/openssl_1.1.x/x86:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-cross-m32.cmake
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
|
-DUNIT_TESTING=ON .. &&
|
||||||
|
make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
tumbleweed/undefined-sanitizer:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
|
||||||
|
script:
|
||||||
|
- mkdir -p obj && cd obj && cmake
|
||||||
|
-DCMAKE_C_FLAGS="-fsanitize=undefined -fsanitize=null -fsanitize=alignment -fno-sanitize-recover"
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON ..
|
||||||
|
&& make -j$(nproc) && ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
tumbleweed/static-analysis:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD
|
||||||
|
script:
|
||||||
|
- export CCC_CC=clang
|
||||||
|
- export CCC_CXX=clang++
|
||||||
|
- mkdir -p obj && cd obj && scan-build cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON
|
||||||
|
-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang .. &&
|
||||||
|
scan-build --status-bugs -o scan make -j$(nproc)
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/scan
|
||||||
|
|
||||||
|
# Unit testing only, no client and pkd testing, because cwrap is not available
|
||||||
|
# for MinGW
|
||||||
|
mingw64:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$MINGW_BUILD
|
||||||
|
script:
|
||||||
|
- Xvfb :1 -screen 0 1024x768x16 -ac +extension GLX +render -noreset -nolisten tcp &
|
||||||
|
- export DISPLAY=:1
|
||||||
|
- mkdir -p obj && cd obj && mingw64-cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
|
-DUNIT_TESTING=ON .. &&
|
||||||
|
make -j$(nproc)
|
||||||
|
- export WINEPATH=/usr/x86_64-w64-mingw32/sys-root/mingw/bin
|
||||||
|
- ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
|
|
||||||
|
# Unit testing only, no client and pkd testing, because cwrap is not available
|
||||||
|
# for MinGW
|
||||||
|
mingw32:
|
||||||
|
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$MINGW_BUILD
|
||||||
|
script:
|
||||||
|
- Xvfb :1 -screen 0 1024x768x16 -ac +extension GLX +render -noreset -nolisten tcp &
|
||||||
|
- export DISPLAY=:1
|
||||||
|
- mkdir -p obj && cd obj && mingw32-cmake -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
-DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON --DWITH_PCAP=ON
|
||||||
|
-DPICKY_DEVELOPER=ON
|
||||||
|
-DUNIT_TESTING=ON .. &&
|
||||||
|
make -j$(nproc)
|
||||||
|
- export WINEPATH=/usr/i686-w64-mingw32/sys-root/mingw/bin
|
||||||
|
- ctest --output-on-failure
|
||||||
|
tags:
|
||||||
|
- shared
|
||||||
|
except:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- obj/
|
||||||
155
CMakeLists.txt
@@ -1,17 +1,20 @@
|
|||||||
project(libssh C)
|
cmake_minimum_required(VERSION 3.3.0)
|
||||||
|
cmake_policy(SET CMP0048 NEW)
|
||||||
|
|
||||||
# Required cmake version
|
# Specify search path for CMake modules to be loaded by include()
|
||||||
cmake_minimum_required(VERSION 2.8.5)
|
# and find_package()
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules")
|
||||||
|
|
||||||
# global needed variables
|
# Add defaults for cmake
|
||||||
|
# Those need to be set before the project() call.
|
||||||
|
include(DefineCMakeDefaults)
|
||||||
|
include(DefineCompilerFlags)
|
||||||
|
|
||||||
|
project(libssh VERSION 0.8.8 LANGUAGES C)
|
||||||
|
|
||||||
|
# global needed variable
|
||||||
set(APPLICATION_NAME ${PROJECT_NAME})
|
set(APPLICATION_NAME ${PROJECT_NAME})
|
||||||
|
|
||||||
set(APPLICATION_VERSION_MAJOR "0")
|
|
||||||
set(APPLICATION_VERSION_MINOR "7")
|
|
||||||
set(APPLICATION_VERSION_PATCH "0")
|
|
||||||
|
|
||||||
set(APPLICATION_VERSION "${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINOR}.${APPLICATION_VERSION_PATCH}")
|
|
||||||
|
|
||||||
# SOVERSION scheme: CURRENT.AGE.REVISION
|
# SOVERSION scheme: CURRENT.AGE.REVISION
|
||||||
# If there was an incompatible interface change:
|
# If there was an incompatible interface change:
|
||||||
# Increment CURRENT. Set AGE and REVISION to 0
|
# Increment CURRENT. Set AGE and REVISION to 0
|
||||||
@@ -19,26 +22,26 @@ set(APPLICATION_VERSION "${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINO
|
|||||||
# Increment AGE. Set REVISION to 0
|
# Increment AGE. Set REVISION to 0
|
||||||
# If the source code was changed, but there were no interface changes:
|
# If the source code was changed, but there were no interface changes:
|
||||||
# Increment REVISION.
|
# Increment REVISION.
|
||||||
set(LIBRARY_VERSION "4.4.0")
|
set(LIBRARY_VERSION "4.7.5")
|
||||||
set(LIBRARY_SOVERSION "4")
|
set(LIBRARY_SOVERSION "4")
|
||||||
|
|
||||||
# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
|
# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
|
||||||
set(CMAKE_MODULE_PATH
|
|
||||||
${CMAKE_SOURCE_DIR}/cmake/Modules
|
|
||||||
)
|
|
||||||
|
|
||||||
# add definitions
|
# add definitions
|
||||||
include(DefineCMakeDefaults)
|
|
||||||
include(DefinePlatformDefaults)
|
include(DefinePlatformDefaults)
|
||||||
include(DefineCompilerFlags)
|
|
||||||
include(DefineInstallationPaths)
|
include(DefineInstallationPaths)
|
||||||
include(DefineOptions.cmake)
|
include(DefineOptions.cmake)
|
||||||
include(CPackConfig.cmake)
|
include(CPackConfig.cmake)
|
||||||
|
|
||||||
|
include(CompilerChecks.cmake)
|
||||||
|
|
||||||
# disallow in-source build
|
# disallow in-source build
|
||||||
include(MacroEnsureOutOfSourceBuild)
|
include(MacroEnsureOutOfSourceBuild)
|
||||||
macro_ensure_out_of_source_build("${PROJECT_NAME} requires an out of source build. Please create a separate build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there.")
|
macro_ensure_out_of_source_build("${PROJECT_NAME} requires an out of source build. Please create a separate build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there.")
|
||||||
|
|
||||||
|
# Copy library files to a lib sub-directory
|
||||||
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
|
||||||
|
|
||||||
# search for libraries
|
# search for libraries
|
||||||
if (WITH_ZLIB)
|
if (WITH_ZLIB)
|
||||||
find_package(ZLIB REQUIRED)
|
find_package(ZLIB REQUIRED)
|
||||||
@@ -49,18 +52,27 @@ if (WITH_GCRYPT)
|
|||||||
if (NOT GCRYPT_FOUND)
|
if (NOT GCRYPT_FOUND)
|
||||||
message(FATAL_ERROR "Could not find GCrypt")
|
message(FATAL_ERROR "Could not find GCrypt")
|
||||||
endif (NOT GCRYPT_FOUND)
|
endif (NOT GCRYPT_FOUND)
|
||||||
|
elseif(WITH_MBEDTLS)
|
||||||
|
find_package(MbedTLS REQUIRED)
|
||||||
|
if (NOT MBEDTLS_FOUND)
|
||||||
|
message(FATAL_ERROR "Could not find mbedTLS")
|
||||||
|
endif (NOT MBEDTLS_FOUND)
|
||||||
else (WITH_GCRYPT)
|
else (WITH_GCRYPT)
|
||||||
find_package(OpenSSL)
|
find_package(OpenSSL)
|
||||||
if (NOT OPENSSL_FOUND)
|
if (NOT OPENSSL_FOUND)
|
||||||
find_package(GCrypt)
|
find_package(GCrypt)
|
||||||
if (NOT GCRYPT_FOUND)
|
if (NOT GCRYPT_FOUND)
|
||||||
message(FATAL_ERROR "Could not find OpenSSL or GCrypt")
|
find_package(MbedTLS)
|
||||||
|
if (NOT MBEDTLS_FOUND)
|
||||||
|
message(FATAL_ERROR "Could not find OpenSSL, GCrypt or mbedTLS")
|
||||||
|
endif (NOT MBEDTLS_FOUND)
|
||||||
endif (NOT GCRYPT_FOUND)
|
endif (NOT GCRYPT_FOUND)
|
||||||
endif (NOT OPENSSL_FOUND)
|
endif (NOT OPENSSL_FOUND)
|
||||||
endif(WITH_GCRYPT)
|
endif(WITH_GCRYPT)
|
||||||
|
|
||||||
# Find out if we have threading available
|
# Find out if we have threading available
|
||||||
set(CMAKE_THREAD_PREFER_PTHREADS ON)
|
set(CMAKE_THREAD_PREFER_PTHREADS ON)
|
||||||
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||||
find_package(Threads)
|
find_package(Threads)
|
||||||
|
|
||||||
if (WITH_GSSAPI)
|
if (WITH_GSSAPI)
|
||||||
@@ -74,6 +86,17 @@ if (WITH_NACL)
|
|||||||
endif (NOT NACL_FOUND)
|
endif (NOT NACL_FOUND)
|
||||||
endif (WITH_NACL)
|
endif (WITH_NACL)
|
||||||
|
|
||||||
|
if (BSD OR SOLARIS OR OSX)
|
||||||
|
find_package(Argp)
|
||||||
|
endif (BSD OR SOLARIS OR OSX)
|
||||||
|
|
||||||
|
# Disable symbol versioning in non UNIX platforms
|
||||||
|
if (UNIX)
|
||||||
|
find_package(ABIMap 0.3.1)
|
||||||
|
else (UNIX)
|
||||||
|
set(WITH_SYMBOL_VERSIONING OFF)
|
||||||
|
endif (UNIX)
|
||||||
|
|
||||||
# config.h checks
|
# config.h checks
|
||||||
include(ConfigureChecks.cmake)
|
include(ConfigureChecks.cmake)
|
||||||
configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
||||||
@@ -84,24 +107,34 @@ add_subdirectory(include)
|
|||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
# pkg-config file
|
# pkg-config file
|
||||||
|
if (UNIX)
|
||||||
configure_file(libssh.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libssh.pc)
|
configure_file(libssh.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libssh.pc)
|
||||||
configure_file(libssh_threads.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libssh_threads.pc)
|
|
||||||
install(
|
install(
|
||||||
FILES
|
FILES
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/libssh.pc
|
${CMAKE_CURRENT_BINARY_DIR}/libssh.pc
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/libssh_threads.pc
|
|
||||||
DESTINATION
|
DESTINATION
|
||||||
${LIB_INSTALL_DIR}/pkgconfig
|
${LIB_INSTALL_DIR}/pkgconfig
|
||||||
COMPONENT
|
COMPONENT
|
||||||
pkgconfig
|
pkgconfig
|
||||||
)
|
)
|
||||||
|
endif (UNIX)
|
||||||
|
|
||||||
|
# CMake config files
|
||||||
|
include(CMakePackageConfigHelpers)
|
||||||
|
|
||||||
# cmake config files
|
|
||||||
set(LIBSSH_LIBRARY_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}ssh${CMAKE_SHARED_LIBRARY_SUFFIX})
|
set(LIBSSH_LIBRARY_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}ssh${CMAKE_SHARED_LIBRARY_SUFFIX})
|
||||||
set(LIBSSH_THREADS_LIBRARY_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}ssh${CMAKE_SHARED_LIBRARY_SUFFIX})
|
|
||||||
|
|
||||||
configure_file(${PROJECT_NAME}-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake @ONLY)
|
# libssh-config-version.cmake
|
||||||
configure_file(${PROJECT_NAME}-config-version.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake @ONLY)
|
write_basic_package_version_file(libssh-config-version.cmake
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
COMPATIBILITY SameMajorVersion)
|
||||||
|
|
||||||
|
# libssh-config.cmake
|
||||||
|
configure_package_config_file(${PROJECT_NAME}-config.cmake.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
|
||||||
|
INSTALL_DESTINATION ${CMAKE_INSTALL_DIR}/${PROJECT_NAME}
|
||||||
|
PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR)
|
||||||
|
|
||||||
install(
|
install(
|
||||||
FILES
|
FILES
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
|
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
|
||||||
@@ -112,40 +145,98 @@ install(
|
|||||||
devel
|
devel
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# in tree build settings
|
|
||||||
configure_file(libssh-build-tree-settings.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/libssh-build-tree-settings.cmake @ONLY)
|
|
||||||
|
|
||||||
if (WITH_EXAMPLES)
|
if (WITH_EXAMPLES)
|
||||||
add_subdirectory(examples)
|
add_subdirectory(examples)
|
||||||
endif (WITH_EXAMPLES)
|
endif (WITH_EXAMPLES)
|
||||||
|
|
||||||
if (WITH_TESTING)
|
if (UNIT_TESTING)
|
||||||
find_package(CMocka REQUIRED)
|
find_package(CMocka REQUIRED)
|
||||||
include(AddCMockaTest)
|
include(AddCMockaTest)
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
endif (WITH_TESTING)
|
endif (UNIT_TESTING)
|
||||||
|
|
||||||
|
### SOURCE PACKAGE
|
||||||
|
if (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)
|
||||||
|
# Get the current ABI version from source
|
||||||
|
get_filename_component(current_abi_path
|
||||||
|
"${CMAKE_SOURCE_DIR}/src/ABI/current"
|
||||||
|
ABSOLUTE)
|
||||||
|
|
||||||
|
# Check if the ABI version should be updated
|
||||||
|
file(READ ${current_abi_path} CURRENT_ABI_CONTENT)
|
||||||
|
string(STRIP "${CURRENT_ABI_CONTENT}" CURRENT_ABI_VERSION)
|
||||||
|
|
||||||
|
if (LIBRARY_VERSION VERSION_GREATER CURRENT_ABI_VERSION)
|
||||||
|
set(UPDATE_ABI TRUE)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (UPDATE_ABI)
|
||||||
|
message(STATUS "Library version bumped to ${LIBRARY_VERSION}: Updating ABI")
|
||||||
|
|
||||||
|
# Get the list of header files
|
||||||
|
get_file_list(${PROJECT_NAME}_header_list
|
||||||
|
DIRECTORIES "${CMAKE_SOURCE_DIR}/include/libssh"
|
||||||
|
FILES_PATTERNS "*.h")
|
||||||
|
|
||||||
|
# Extract the symbols marked as "LIBSSH_API" from the header files
|
||||||
|
extract_symbols(${PROJECT_NAME}.symbols
|
||||||
|
HEADERS_LIST ${PROJECT_NAME}_header_list
|
||||||
|
FILTER_PATTERN "LIBSSH_API"
|
||||||
|
COPY_TO "${CMAKE_SOURCE_DIR}/src/ABI/${PROJECT_NAME}-${LIBRARY_VERSION}.symbols")
|
||||||
|
|
||||||
|
if (WITH_ABI_BREAK)
|
||||||
|
set(ALLOW_ABI_BREAK "BREAK_ABI")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Target we can depend on in 'make dist'
|
||||||
|
set(_SYMBOL_TARGET "${PROJECT_NAME}.map")
|
||||||
|
|
||||||
|
# Set the path to the current map file
|
||||||
|
set(MAP_PATH "${CMAKE_SOURCE_DIR}/src/${_SYMBOL_TARGET}")
|
||||||
|
|
||||||
|
# Generate the symbol version map file
|
||||||
|
generate_map_file(${_SYMBOL_TARGET}
|
||||||
|
SYMBOLS ${PROJECT_NAME}.symbols
|
||||||
|
RELEASE_NAME_VERSION ${PROJECT_NAME}_${LIBRARY_VERSION}
|
||||||
|
CURRENT_MAP ${MAP_PATH}
|
||||||
|
COPY_TO ${MAP_PATH}
|
||||||
|
FINAL
|
||||||
|
${ALLOW_ABI_BREAK})
|
||||||
|
|
||||||
|
# Write the current version to the source
|
||||||
|
file(WRITE ${current_abi_path} ${LIBRARY_VERSION})
|
||||||
|
endif(UPDATE_ABI)
|
||||||
|
endif (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)
|
||||||
|
|
||||||
|
add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source DEPENDS ${_SYMBOL_TARGET})
|
||||||
|
|
||||||
message(STATUS "********************************************")
|
message(STATUS "********************************************")
|
||||||
message(STATUS "********** ${PROJECT_NAME} build options : **********")
|
message(STATUS "********** ${PROJECT_NAME} build options : **********")
|
||||||
|
|
||||||
message(STATUS "zlib support: ${WITH_ZLIB}")
|
message(STATUS "zlib support: ${WITH_ZLIB}")
|
||||||
message(STATUS "libgcrypt support: ${WITH_GCRYPT}")
|
message(STATUS "libgcrypt support: ${WITH_GCRYPT}")
|
||||||
|
message(STATUS "libmbedTLS support: ${WITH_MBEDTLS}")
|
||||||
message(STATUS "libnacl support: ${WITH_NACL}")
|
message(STATUS "libnacl support: ${WITH_NACL}")
|
||||||
message(STATUS "SSH-1 support: ${WITH_SSH1}")
|
|
||||||
message(STATUS "SFTP support: ${WITH_SFTP}")
|
message(STATUS "SFTP support: ${WITH_SFTP}")
|
||||||
message(STATUS "Server support : ${WITH_SERVER}")
|
message(STATUS "Server support : ${WITH_SERVER}")
|
||||||
message(STATUS "GSSAPI support : ${WITH_GSSAPI}")
|
message(STATUS "GSSAPI support : ${WITH_GSSAPI}")
|
||||||
message(STATUS "Pcap debugging support : ${WITH_PCAP}")
|
message(STATUS "Pcap debugging support : ${WITH_PCAP}")
|
||||||
message(STATUS "With static library: ${WITH_STATIC_LIB}")
|
message(STATUS "With static library: ${WITH_STATIC_LIB}")
|
||||||
message(STATUS "Unit testing: ${WITH_TESTING}")
|
message(STATUS "Unit testing: ${UNIT_TESTING}")
|
||||||
message(STATUS "Client code Unit testing: ${WITH_CLIENT_TESTING}")
|
message(STATUS "Client code testing: ${CLIENT_TESTING}")
|
||||||
|
set(_SERVER_TESTING OFF)
|
||||||
|
if (WITH_SERVER)
|
||||||
|
set(_SERVER_TESTING ${SERVER_TESTING})
|
||||||
|
endif()
|
||||||
|
message(STATUS "Server code testing: ${_SERVER_TESTING}")
|
||||||
if (WITH_INTERNAL_DOC)
|
if (WITH_INTERNAL_DOC)
|
||||||
message(STATUS "Internal documentation generation")
|
message(STATUS "Internal documentation generation")
|
||||||
else (WITH_INTERNAL_DOC)
|
else (WITH_INTERNAL_DOC)
|
||||||
message(STATUS "Public API documentation generation")
|
message(STATUS "Public API documentation generation")
|
||||||
endif (WITH_INTERNAL_DOC)
|
endif (WITH_INTERNAL_DOC)
|
||||||
message(STATUS "Benchmarks: ${WITH_BENCHMARKS}")
|
message(STATUS "Benchmarks: ${WITH_BENCHMARKS}")
|
||||||
|
message(STATUS "Symbol versioning: ${WITH_SYMBOL_VERSIONING}")
|
||||||
|
message(STATUS "Allow ABI break: ${WITH_ABI_BREAK}")
|
||||||
|
message(STATUS "Release is final: ${WITH_FINAL}")
|
||||||
message(STATUS "********************************************")
|
message(STATUS "********************************************")
|
||||||
|
|
||||||
|
|||||||
13
COPYING
@@ -455,6 +455,15 @@ FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
|||||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
DAMAGES.
|
DAMAGES.
|
||||||
|
|
||||||
Linking with OpenSSL
|
Linking with OpenSSL
|
||||||
17. In addition, as a special exception, we give permission to link the code of its release of libssh with the OpenSSL project's "OpenSSL" library (or with modified versions of it that use the same license as the "OpenSSL" library), and distribute the linked executables. You must obey the GNU Lesser General Public License in all respects for all of the code used other than "OpenSSL". If you modify this file, you may extend this exception to your version of the file, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.
|
|
||||||
|
17. In addition, as a special exception, we give permission to link the code
|
||||||
|
of its release of libssh with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
and distribute the linked executables. You must obey the GNU Lesser General
|
||||||
|
Public License in all respects for all of the code used other than "OpenSSL".
|
||||||
|
If you modify this file, you may extend this exception to your version of the
|
||||||
|
file, but you are not obligated to do so. If you do not wish to do so, delete
|
||||||
|
this exception statement from your version.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|||||||
@@ -1,27 +1,19 @@
|
|||||||
# For help take a look at:
|
### GENERAL SETTINGS
|
||||||
# http://www.cmake.org/Wiki/CMake:CPackConfiguration
|
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
|
||||||
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The SSH Library")
|
||||||
### general settings
|
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README")
|
||||||
set(CPACK_PACKAGE_NAME ${APPLICATION_NAME})
|
|
||||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The SSH library")
|
|
||||||
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README")
|
|
||||||
set(CPACK_PACKAGE_VENDOR "The SSH Library Development Team")
|
set(CPACK_PACKAGE_VENDOR "The SSH Library Development Team")
|
||||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
|
||||||
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
|
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING")
|
||||||
|
|
||||||
|
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
|
||||||
|
|
||||||
### versions
|
# SOURCE GENERATOR
|
||||||
set(CPACK_PACKAGE_VERSION_MAJOR ${APPLICATION_VERSION_MAJOR})
|
set(CPACK_SOURCE_GENERATOR "TXZ")
|
||||||
set(CPACK_PACKAGE_VERSION_MINOR ${APPLICATION_VERSION_MINOR})
|
set(CPACK_SOURCE_IGNORE_FILES "~$;[.]swp$;/[.]git/;/[.]clangd/;.gitignore;/build*;/obj*;tags;cscope.*;compile_commands.json;.*\.patch")
|
||||||
set(CPACK_PACKAGE_VERSION_PATCH ${APPLICATION_VERSION_PATCH})
|
|
||||||
set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
|
|
||||||
|
|
||||||
|
|
||||||
### source generator
|
|
||||||
set(CPACK_SOURCE_GENERATOR "TGZ")
|
|
||||||
set(CPACK_SOURCE_IGNORE_FILES "~$;[.]swp$;/[.]svn/;/[.]git/;.gitignore;/build/;/obj/;tags;cscope.*")
|
|
||||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
|
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
|
||||||
|
|
||||||
|
### NSIS INSTALLER
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(CPACK_GENERATOR "ZIP")
|
set(CPACK_GENERATOR "ZIP")
|
||||||
|
|
||||||
@@ -46,7 +38,6 @@ set(CPACK_COMPONENT_LIBRARIES_DESCRIPTION
|
|||||||
set(CPACK_COMPONENT_HEADERS_DESCRIPTION
|
set(CPACK_COMPONENT_HEADERS_DESCRIPTION
|
||||||
"C/C++ header files for use with libssh")
|
"C/C++ header files for use with libssh")
|
||||||
set(CPACK_COMPONENT_HEADERS_DEPENDS libraries)
|
set(CPACK_COMPONENT_HEADERS_DEPENDS libraries)
|
||||||
#set(CPACK_COMPONENT_APPLICATIONS_GROUP "Runtime")
|
|
||||||
set(CPACK_COMPONENT_LIBRARIES_GROUP "Development")
|
set(CPACK_COMPONENT_LIBRARIES_GROUP "Development")
|
||||||
set(CPACK_COMPONENT_HEADERS_GROUP "Development")
|
set(CPACK_COMPONENT_HEADERS_GROUP "Development")
|
||||||
|
|
||||||
|
|||||||
117
ChangeLog
@@ -1,7 +1,122 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
==========
|
==========
|
||||||
|
|
||||||
version 0.7.0 (released 2015-05-xx)
|
version 0.8.8 (released 2019-12-10)
|
||||||
|
* Fixed CVE-2019-14889 - SCP: Unsanitized location leads to command execution
|
||||||
|
|
||||||
|
version 0.8.7 (released 2019-02-25)
|
||||||
|
* Fixed handling extension flags in the server implementation
|
||||||
|
* Fixed exporting ed25519 private keys
|
||||||
|
* Fixed corner cases for rsa-sha2 signatures
|
||||||
|
* Fixed some issues with connector
|
||||||
|
|
||||||
|
version 0.8.6 (released 2018-12-24)
|
||||||
|
* Fixed compilation issues with different OpenSSL versions
|
||||||
|
* Fixed StrictHostKeyChecking in new knownhosts API
|
||||||
|
* Fixed ssh_send_keepalive() with packet filter
|
||||||
|
* Fixed possible crash with knownhosts options
|
||||||
|
* Fixed issus with rekeying
|
||||||
|
* Fixed strong ECDSA keys
|
||||||
|
* Fixed some issues with rsa-sha2 extentions
|
||||||
|
* Fixed access violation in ssh_init() (static linking)
|
||||||
|
* Fixed ssh_channel_close() handling
|
||||||
|
|
||||||
|
version 0.8.5 (released 2018-10-29)
|
||||||
|
* Added support to get known_hosts locations with ssh_options_get()
|
||||||
|
* Fixed preferred algorithm for known hosts negotiations
|
||||||
|
* Fixed KEX with some server implementations (e.g. Cisco)
|
||||||
|
* Fixed issues with MSVC
|
||||||
|
* Fixed keyboard-interactive auth in server mode
|
||||||
|
(regression from CVE-2018-10933)
|
||||||
|
* Fixed gssapi auth in server mode (regression from CVE-2018-10933)
|
||||||
|
* Fixed socket fd handling with proxy command
|
||||||
|
* Fixed a memory leak with OpenSSL
|
||||||
|
|
||||||
|
version 0.8.4 (released 2018-10-16)
|
||||||
|
* Fixed CVE-2018-10933
|
||||||
|
* Fixed building without globbing support
|
||||||
|
* Fixed possible memory leaks
|
||||||
|
* Avoid SIGPIPE on sockets
|
||||||
|
|
||||||
|
version 0.8.3 (released 2018-09-21)
|
||||||
|
* Added support for rsa-sha2
|
||||||
|
* Added support to parse private keys in openssh container format
|
||||||
|
(other than ed25519)
|
||||||
|
* Added support for diffie-hellman-group18-sha512 and
|
||||||
|
diffie-hellman-group16-sha512
|
||||||
|
* Added ssh_get_fingerprint_hash()
|
||||||
|
* Added ssh_pki_export_privkey_base64()
|
||||||
|
* Added support for Match keyword in config file
|
||||||
|
* Improved performance and reduced memory footprint for sftp
|
||||||
|
* Fixed ecdsa publickey auth
|
||||||
|
* Fixed reading a closed channel
|
||||||
|
* Added support to announce posix-rename@openssh.com and
|
||||||
|
hardlink@openssh.com in the sftp server
|
||||||
|
|
||||||
|
version 0.8.2 (released 2018-08-30)
|
||||||
|
* Added sha256 fingerprints for pubkeys
|
||||||
|
* Improved compiler flag detection
|
||||||
|
* Fixed race condition in reading sftp messages
|
||||||
|
* Fixed doxygen generation and added modern style
|
||||||
|
* Fixed library initialization on Windows
|
||||||
|
* Fixed __bounded__ attribute detection
|
||||||
|
* Fixed a bug in the options parser
|
||||||
|
* Fixed documentation for new knwon_hosts API
|
||||||
|
|
||||||
|
version 0.8.1 (released 2018-08-13)
|
||||||
|
* Fixed version number in the header
|
||||||
|
* Fixed version number in pkg-config and cmake config
|
||||||
|
* Fixed library initialization
|
||||||
|
* Fixed attribute detection
|
||||||
|
|
||||||
|
version 0.8.0 (released 2018-08-10)
|
||||||
|
* Removed support for deprecated SSHv1 protocol
|
||||||
|
* Added new connector API for clients
|
||||||
|
* Added new known_hosts parsing API
|
||||||
|
* Added support for OpenSSL 1.1
|
||||||
|
* Added support for chacha20-poly1305 cipher
|
||||||
|
* Added crypto backend for mbedtls crypto library
|
||||||
|
* Added ECDSA support with gcrypt backend
|
||||||
|
* Added advanced client and server testing using cwrap.org
|
||||||
|
* Added support for curve25519-sha256 alias
|
||||||
|
* Added support for global known_hosts file
|
||||||
|
* Added support for symbol versioning
|
||||||
|
* Improved ssh_config parsing
|
||||||
|
* Improved threading support
|
||||||
|
|
||||||
|
version 0.7.5 (released 2017-04-13)
|
||||||
|
* Fixed a memory allocation issue with buffers
|
||||||
|
* Fixed PKI on Windows
|
||||||
|
* Fixed some SSHv1 functions
|
||||||
|
* Fixed config hostname expansion
|
||||||
|
|
||||||
|
version 0.7.4 (released 2017-02-03)
|
||||||
|
* Added id_ed25519 to the default identity list
|
||||||
|
* Fixed sftp EOF packet handling
|
||||||
|
* Fixed ssh_send_banner() to confirm with RFC 4253
|
||||||
|
* Fixed some memory leaks
|
||||||
|
|
||||||
|
version 0.7.3 (released 2016-01-23)
|
||||||
|
* Fixed CVE-2016-0739
|
||||||
|
* Fixed ssh-agent on big endian
|
||||||
|
* Fixed some documentation issues
|
||||||
|
|
||||||
|
version 0.7.2 (released 2015-09-15)
|
||||||
|
* Fixed OpenSSL detection on Windows
|
||||||
|
* Fixed return status for ssh_userauth_agent()
|
||||||
|
* Fixed KEX to prefer hmac-sha2-256
|
||||||
|
* Fixed sftp packet handling
|
||||||
|
* Fixed return values of ssh_key_is_(public|private)
|
||||||
|
* Fixed bug in global success reply
|
||||||
|
|
||||||
|
version 0.7.1 (released 2015-06-30)
|
||||||
|
* Fixed SSH_AUTH_PARTIAL auth with auto public key
|
||||||
|
* Fixed memory leak in session options
|
||||||
|
* Fixed allocation of ed25519 public keys
|
||||||
|
* Fixed channel exit-status and exit-signal
|
||||||
|
* Reintroduce ssh_forward_listen()
|
||||||
|
|
||||||
|
version 0.7.0 (released 2015-05-11)
|
||||||
* Added support for ed25519 keys
|
* Added support for ed25519 keys
|
||||||
* Added SHA2 algorithms for HMAC
|
* Added SHA2 algorithms for HMAC
|
||||||
* Added improved and more secure buffer handling code
|
* Added improved and more secure buffer handling code
|
||||||
|
|||||||
102
CompilerChecks.cmake
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
include(AddCCompilerFlag)
|
||||||
|
include(CheckCCompilerFlagSSP)
|
||||||
|
|
||||||
|
if (UNIX)
|
||||||
|
#
|
||||||
|
# Check for -Werror turned on if possible
|
||||||
|
#
|
||||||
|
# This will prevent that compiler flags are detected incorrectly.
|
||||||
|
#
|
||||||
|
check_c_compiler_flag("-Werror" REQUIRED_FLAGS_WERROR)
|
||||||
|
if (REQUIRED_FLAGS_WERROR)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Werror")
|
||||||
|
|
||||||
|
if (PICKY_DEVELOPER)
|
||||||
|
list(APPEND SUPPORTED_COMPILER_FLAGS "-Werror")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_c_compiler_flag("-std=gnu99" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wpedantic" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wall" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wshadow" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wmissing-prototypes" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wcast-align" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
#add_c_compiler_flag("-Wcast-qual" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=address" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wstrict-prototypes" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=strict-prototypes" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wwrite-strings" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=write-strings" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror-implicit-function-declaration" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wpointer-arith" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=pointer-arith" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wdeclaration-after-statement" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=declaration-after-statement" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wreturn-type" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=return-type" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wuninitialized" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=uninitialized" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wimplicit-fallthrough" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=strict-overflow" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wstrict-overflow=2" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wno-format-zero-length" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
|
||||||
|
check_c_compiler_flag("-Wformat" REQUIRED_FLAGS_WFORMAT)
|
||||||
|
if (REQUIRED_FLAGS_WFORMAT)
|
||||||
|
list(APPEND SUPPORTED_COMPILER_FLAGS "-Wformat")
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Wformat")
|
||||||
|
endif()
|
||||||
|
add_c_compiler_flag("-Wformat-security" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Werror=format-security" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
|
||||||
|
# Allow zero for a variadic macro argument
|
||||||
|
add_c_compiler_flag("-Wno-gnu-zero-variadic-macro-arguments" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
|
||||||
|
add_c_compiler_flag("-fno-common" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
|
||||||
|
if (CMAKE_BUILD_TYPE)
|
||||||
|
string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
|
||||||
|
if (CMAKE_BUILD_TYPE_LOWER MATCHES (release|relwithdebinfo|minsizerel))
|
||||||
|
add_c_compiler_flag("-Wp,-D_FORTIFY_SOURCE=2" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
check_c_compiler_flag_ssp("-fstack-protector-strong" WITH_STACK_PROTECTOR_STRONG)
|
||||||
|
if (WITH_STACK_PROTECTOR_STRONG)
|
||||||
|
list(APPEND SUPPORTED_COMPILER_FLAGS "-fstack-protector-strong")
|
||||||
|
else (WITH_STACK_PROTECTOR_STRONG)
|
||||||
|
check_c_compiler_flag_ssp("-fstack-protector" WITH_STACK_PROTECTOR)
|
||||||
|
if (WITH_STACK_PROTECTOR)
|
||||||
|
list(APPEND SUPPORTED_COMPILER_FLAGS "-fstack-protector")
|
||||||
|
endif()
|
||||||
|
endif (WITH_STACK_PROTECTOR_STRONG)
|
||||||
|
|
||||||
|
check_c_compiler_flag_ssp("-fstack-clash-protection" WITH_STACK_CLASH_PROTECTION)
|
||||||
|
if (WITH_STACK_CLASH_PROTECTION)
|
||||||
|
list(APPEND SUPPORTED_COMPILER_FLAGS "-fstack-clash-protection")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (PICKY_DEVELOPER)
|
||||||
|
add_c_compiler_flag("-Wno-error=deprecated-declarations" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("-Wno-error=tautological-compare" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Unset CMAKE_REQUIRED_FLAGS
|
||||||
|
unset(CMAKE_REQUIRED_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (MSVC)
|
||||||
|
add_c_compiler_flag("/D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("/D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("/D _CRT_NONSTDC_NO_WARNINGS=1" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
add_c_compiler_flag("/D _CRT_SECURE_NO_WARNINGS=1" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# This removes this annoying warning
|
||||||
|
# "warning: 'BN_CTX_free' is deprecated: first deprecated in OS X 10.7 [-Wdeprecated-declarations]"
|
||||||
|
if (OSX)
|
||||||
|
add_c_compiler_flag("-Wno-deprecated-declarations" SUPPORTED_COMPILER_FLAGS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(DEFAULT_C_COMPILE_FLAGS ${SUPPORTED_COMPILER_FLAGS} CACHE INTERNAL "Default C Compiler Flags" FORCE)
|
||||||
@@ -1,13 +1,14 @@
|
|||||||
include(CheckIncludeFile)
|
include(CheckIncludeFile)
|
||||||
|
include(CheckIncludeFiles)
|
||||||
include(CheckSymbolExists)
|
include(CheckSymbolExists)
|
||||||
include(CheckFunctionExists)
|
include(CheckFunctionExists)
|
||||||
include(CheckLibraryExists)
|
include(CheckLibraryExists)
|
||||||
include(CheckTypeSize)
|
include(CheckTypeSize)
|
||||||
include(CheckCXXSourceCompiles)
|
include(CheckStructHasMember)
|
||||||
include(TestBigEndian)
|
include(TestBigEndian)
|
||||||
|
|
||||||
set(PACKAGE ${APPLICATION_NAME})
|
set(PACKAGE ${PROJECT_NAME})
|
||||||
set(VERSION ${APPLICATION_VERSION})
|
set(VERSION ${PROJECT_VERSION})
|
||||||
set(DATADIR ${DATA_INSTALL_DIR})
|
set(DATADIR ${DATA_INSTALL_DIR})
|
||||||
set(LIBDIR ${LIB_INSTALL_DIR})
|
set(LIBDIR ${LIB_INSTALL_DIR})
|
||||||
set(PLUGINDIR "${PLUGIN_INSTALL_DIR}-${LIBRARY_SOVERSION}")
|
set(PLUGINDIR "${PLUGIN_INSTALL_DIR}-${LIBRARY_SOVERSION}")
|
||||||
@@ -41,23 +42,32 @@ if(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2)
|
|||||||
"void __attribute__((visibility(\"default\"))) test() {}
|
"void __attribute__((visibility(\"default\"))) test() {}
|
||||||
int main(void){ return 0; }
|
int main(void){ return 0; }
|
||||||
" WITH_VISIBILITY_HIDDEN)
|
" WITH_VISIBILITY_HIDDEN)
|
||||||
set(CMAKE_REQUIRED_FLAGS "")
|
unset(CMAKE_REQUIRED_FLAGS)
|
||||||
endif (NOT GNUCC_VERSION EQUAL 34)
|
endif (NOT GNUCC_VERSION EQUAL 34)
|
||||||
endif(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2)
|
endif(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2)
|
||||||
|
|
||||||
# HEADER FILES
|
# HEADER FILES
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${ARGP_INCLUDE_DIR})
|
||||||
check_include_file(argp.h HAVE_ARGP_H)
|
check_include_file(argp.h HAVE_ARGP_H)
|
||||||
|
unset(CMAKE_REQUIRED_INCLUDES)
|
||||||
|
|
||||||
check_include_file(pty.h HAVE_PTY_H)
|
check_include_file(pty.h HAVE_PTY_H)
|
||||||
check_include_file(utmp.h HAVE_UTMP_H)
|
check_include_file(utmp.h HAVE_UTMP_H)
|
||||||
check_include_file(termios.h HAVE_TERMIOS_H)
|
check_include_file(termios.h HAVE_TERMIOS_H)
|
||||||
check_include_file(unistd.h HAVE_UNISTD_H)
|
check_include_file(unistd.h HAVE_UNISTD_H)
|
||||||
|
check_include_file(stdint.h HAVE_STDINT_H)
|
||||||
check_include_file(util.h HAVE_UTIL_H)
|
check_include_file(util.h HAVE_UTIL_H)
|
||||||
check_include_file(libutil.h HAVE_LIBUTIL_H)
|
check_include_file(libutil.h HAVE_LIBUTIL_H)
|
||||||
check_include_file(sys/time.h HAVE_SYS_TIME_H)
|
check_include_file(sys/time.h HAVE_SYS_TIME_H)
|
||||||
|
check_include_file(sys/utime.h HAVE_SYS_UTIME_H)
|
||||||
check_include_file(sys/param.h HAVE_SYS_PARAM_H)
|
check_include_file(sys/param.h HAVE_SYS_PARAM_H)
|
||||||
check_include_file(arpa/inet.h HAVE_ARPA_INET_H)
|
check_include_file(arpa/inet.h HAVE_ARPA_INET_H)
|
||||||
|
check_include_file(byteswap.h HAVE_BYTESWAP_H)
|
||||||
|
check_include_file(glob.h HAVE_GLOB_H)
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
|
check_include_file(io.h HAVE_IO_H)
|
||||||
|
|
||||||
check_include_files("winsock2.h;ws2tcpip.h;wspiapi.h" HAVE_WSPIAPI_H)
|
check_include_files("winsock2.h;ws2tcpip.h;wspiapi.h" HAVE_WSPIAPI_H)
|
||||||
if (NOT HAVE_WSPIAPI_H)
|
if (NOT HAVE_WSPIAPI_H)
|
||||||
message(STATUS "WARNING: Without wspiapi.h, this build will only work on Windows XP and newer versions")
|
message(STATUS "WARNING: Without wspiapi.h, this build will only work on Windows XP and newer versions")
|
||||||
@@ -65,29 +75,64 @@ if (WIN32)
|
|||||||
check_include_files("winsock2.h;ws2tcpip.h" HAVE_WS2TCPIP_H)
|
check_include_files("winsock2.h;ws2tcpip.h" HAVE_WS2TCPIP_H)
|
||||||
endif (WIN32)
|
endif (WIN32)
|
||||||
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIRS})
|
if (OPENSSL_FOUND)
|
||||||
check_include_file(openssl/aes.h HAVE_OPENSSL_AES_H)
|
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
|
check_include_file(openssl/des.h HAVE_OPENSSL_DES_H)
|
||||||
|
if (NOT HAVE_OPENSSL_DES_H)
|
||||||
|
message(FATAL_ERROR "Could not detect openssl/des.h")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIRS})
|
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
check_include_file(openssl/blowfish.h HAVE_OPENSSL_BLOWFISH_H)
|
check_include_file(openssl/aes.h HAVE_OPENSSL_AES_H)
|
||||||
|
if (NOT HAVE_OPENSSL_AES_H)
|
||||||
|
message(FATAL_ERROR "Could not detect openssl/aes.h")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIRS})
|
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
check_include_file(openssl/des.h HAVE_OPENSSL_DES_H)
|
check_include_file(openssl/blowfish.h HAVE_OPENSSL_BLOWFISH_H)
|
||||||
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIRS})
|
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
check_include_file(openssl/ecdh.h HAVE_OPENSSL_ECDH_H)
|
check_include_file(openssl/ecdh.h HAVE_OPENSSL_ECDH_H)
|
||||||
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIRS})
|
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
check_include_file(openssl/ec.h HAVE_OPENSSL_EC_H)
|
check_include_file(openssl/ec.h HAVE_OPENSSL_EC_H)
|
||||||
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIRS})
|
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
check_include_file(openssl/ecdsa.h HAVE_OPENSSL_ECDSA_H)
|
check_include_file(openssl/ecdsa.h HAVE_OPENSSL_ECDSA_H)
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
|
||||||
|
check_function_exists(EVP_aes_128_ctr HAVE_OPENSSL_EVP_AES_CTR)
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
|
||||||
|
check_function_exists(EVP_aes_128_cbc HAVE_OPENSSL_EVP_AES_CBC)
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
|
||||||
|
check_function_exists(CRYPTO_THREADID_set_callback HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK)
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
|
||||||
|
check_function_exists(CRYPTO_ctr128_encrypt HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT)
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
|
||||||
|
check_function_exists(EVP_CIPHER_CTX_new HAVE_OPENSSL_EVP_CIPHER_CTX_NEW)
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
|
||||||
|
check_function_exists(RAND_priv_bytes HAVE_OPENSSL_RAND_PRIV_BYTES)
|
||||||
|
|
||||||
|
unset(CMAKE_REQUIRED_INCLUDES)
|
||||||
|
unset(CMAKE_REQUIRED_LIBRARIES)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (CMAKE_HAVE_PTHREAD_H)
|
if (CMAKE_HAVE_PTHREAD_H)
|
||||||
set(HAVE_PTHREAD_H 1)
|
set(HAVE_PTHREAD_H 1)
|
||||||
endif (CMAKE_HAVE_PTHREAD_H)
|
endif (CMAKE_HAVE_PTHREAD_H)
|
||||||
|
|
||||||
if (NOT WITH_GCRYPT)
|
if (NOT WITH_GCRYPT AND NOT WITH_MBEDTLS)
|
||||||
if (HAVE_OPENSSL_EC_H AND HAVE_OPENSSL_ECDSA_H)
|
if (HAVE_OPENSSL_EC_H AND HAVE_OPENSSL_ECDSA_H)
|
||||||
set(HAVE_OPENSSL_ECC 1)
|
set(HAVE_OPENSSL_ECC 1)
|
||||||
endif (HAVE_OPENSSL_EC_H AND HAVE_OPENSSL_ECDSA_H)
|
endif (HAVE_OPENSSL_EC_H AND HAVE_OPENSSL_ECDSA_H)
|
||||||
@@ -95,22 +140,39 @@ if (NOT WITH_GCRYPT)
|
|||||||
if (HAVE_OPENSSL_ECC)
|
if (HAVE_OPENSSL_ECC)
|
||||||
set(HAVE_ECC 1)
|
set(HAVE_ECC 1)
|
||||||
endif (HAVE_OPENSSL_ECC)
|
endif (HAVE_OPENSSL_ECC)
|
||||||
endif (NOT WITH_GCRYPT)
|
endif ()
|
||||||
|
|
||||||
|
if (NOT WITH_MBEDTLS)
|
||||||
|
set(HAVE_DSA 1)
|
||||||
|
endif (NOT WITH_MBEDTLS)
|
||||||
|
|
||||||
# FUNCTIONS
|
# FUNCTIONS
|
||||||
|
|
||||||
check_function_exists(isblank HAVE_ISBLANK)
|
check_function_exists(isblank HAVE_ISBLANK)
|
||||||
check_function_exists(strncpy HAVE_STRNCPY)
|
check_function_exists(strncpy HAVE_STRNCPY)
|
||||||
check_function_exists(vsnprintf HAVE_VSNPRINTF)
|
check_function_exists(strndup HAVE_STRNDUP)
|
||||||
check_function_exists(snprintf HAVE_SNPRINTF)
|
check_function_exists(strtoull HAVE_STRTOULL)
|
||||||
|
check_function_exists(explicit_bzero HAVE_EXPLICIT_BZERO)
|
||||||
|
check_function_exists(memset_s HAVE_MEMSET_S)
|
||||||
|
|
||||||
|
if (HAVE_GLOB_H)
|
||||||
|
check_struct_has_member(glob_t gl_flags glob.h HAVE_GLOB_GL_FLAGS_MEMBER)
|
||||||
|
check_function_exists(glob HAVE_GLOB)
|
||||||
|
endif (HAVE_GLOB_H)
|
||||||
|
|
||||||
|
if (NOT WIN32)
|
||||||
|
check_function_exists(vsnprintf HAVE_VSNPRINTF)
|
||||||
|
check_function_exists(snprintf HAVE_SNPRINTF)
|
||||||
|
endif (NOT WIN32)
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
check_function_exists(_strtoui64 HAVE__STRTOUI64)
|
check_symbol_exists(vsnprintf "stdio.h" HAVE_VSNPRINTF)
|
||||||
|
check_symbol_exists(snprintf "stdio.h" HAVE_SNPRINTF)
|
||||||
|
|
||||||
check_function_exists(_vsnprintf_s HAVE__VSNPRINTF_S)
|
check_symbol_exists(_vsnprintf_s "stdio.h" HAVE__VSNPRINTF_S)
|
||||||
check_function_exists(_vsnprintf HAVE__VSNPRINTF)
|
check_symbol_exists(_vsnprintf "stdio.h" HAVE__VSNPRINTF)
|
||||||
check_function_exists(_snprintf HAVE__SNPRINTF)
|
check_symbol_exists(_snprintf "stdio.h" HAVE__SNPRINTF)
|
||||||
check_function_exists(_snprintf_s HAVE__SNPRINTF_S)
|
check_symbol_exists(_snprintf_s "stdio.h" HAVE__SNPRINTF_S)
|
||||||
|
|
||||||
if (HAVE_WSPIAPI_H OR HAVE_WS2TCPIP_H)
|
if (HAVE_WSPIAPI_H OR HAVE_WS2TCPIP_H)
|
||||||
check_symbol_exists(ntohll winsock2.h HAVE_NTOHLL)
|
check_symbol_exists(ntohll winsock2.h HAVE_NTOHLL)
|
||||||
@@ -121,10 +183,14 @@ if (WIN32)
|
|||||||
check_symbol_exists(poll "winsock2.h;ws2tcpip.h" HAVE_SELECT)
|
check_symbol_exists(poll "winsock2.h;ws2tcpip.h" HAVE_SELECT)
|
||||||
# The getaddrinfo function is defined to the WspiapiGetAddrInfo inline function
|
# The getaddrinfo function is defined to the WspiapiGetAddrInfo inline function
|
||||||
check_symbol_exists(getaddrinfo "winsock2.h;ws2tcpip.h" HAVE_GETADDRINFO)
|
check_symbol_exists(getaddrinfo "winsock2.h;ws2tcpip.h" HAVE_GETADDRINFO)
|
||||||
set(CMAKE_REQUIRED_LIBRARIES)
|
unset(CMAKE_REQUIRED_LIBRARIES)
|
||||||
endif (HAVE_WSPIAPI_H OR HAVE_WS2TCPIP_H)
|
endif (HAVE_WSPIAPI_H OR HAVE_WS2TCPIP_H)
|
||||||
|
|
||||||
|
check_function_exists(_strtoui64 HAVE__STRTOUI64)
|
||||||
|
|
||||||
set(HAVE_SELECT TRUE)
|
set(HAVE_SELECT TRUE)
|
||||||
|
|
||||||
|
check_symbol_exists(SecureZeroMemory "windows.h" HAVE_SECURE_ZERO_MEMORY)
|
||||||
else (WIN32)
|
else (WIN32)
|
||||||
check_function_exists(poll HAVE_POLL)
|
check_function_exists(poll HAVE_POLL)
|
||||||
check_function_exists(select HAVE_SELECT)
|
check_function_exists(select HAVE_SELECT)
|
||||||
@@ -141,13 +207,13 @@ if (UNIX)
|
|||||||
check_library_exists(socket getaddrinfo "" HAVE_LIBSOCKET)
|
check_library_exists(socket getaddrinfo "" HAVE_LIBSOCKET)
|
||||||
if (HAVE_LIBSOCKET)
|
if (HAVE_LIBSOCKET)
|
||||||
set(HAVE_GETADDRINFO TRUE)
|
set(HAVE_GETADDRINFO TRUE)
|
||||||
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} socket)
|
set(_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} socket)
|
||||||
endif (HAVE_LIBSOCKET)
|
endif (HAVE_LIBSOCKET)
|
||||||
|
|
||||||
# libnsl/inet_pton (Solaris)
|
# libnsl/inet_pton (Solaris)
|
||||||
check_library_exists(nsl inet_pton "" HAVE_LIBNSL)
|
check_library_exists(nsl inet_pton "" HAVE_LIBNSL)
|
||||||
if (HAVE_LIBNSL)
|
if (HAVE_LIBNSL)
|
||||||
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} nsl)
|
set(_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} nsl)
|
||||||
endif (HAVE_LIBNSL)
|
endif (HAVE_LIBNSL)
|
||||||
|
|
||||||
# librt
|
# librt
|
||||||
@@ -156,16 +222,15 @@ if (UNIX)
|
|||||||
|
|
||||||
check_library_exists(rt clock_gettime "" HAVE_CLOCK_GETTIME)
|
check_library_exists(rt clock_gettime "" HAVE_CLOCK_GETTIME)
|
||||||
if (HAVE_LIBRT OR HAVE_CLOCK_GETTIME)
|
if (HAVE_LIBRT OR HAVE_CLOCK_GETTIME)
|
||||||
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} rt)
|
set(_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} rt)
|
||||||
endif (HAVE_LIBRT OR HAVE_CLOCK_GETTIME)
|
endif (HAVE_LIBRT OR HAVE_CLOCK_GETTIME)
|
||||||
|
|
||||||
check_library_exists(util forkpty "" HAVE_LIBUTIL)
|
check_library_exists(util forkpty "" HAVE_LIBUTIL)
|
||||||
check_function_exists(cfmakeraw HAVE_CFMAKERAW)
|
check_function_exists(cfmakeraw HAVE_CFMAKERAW)
|
||||||
check_function_exists(strtoull HAVE_STRTOULL)
|
|
||||||
check_function_exists(__strtoull HAVE___STRTOULL)
|
check_function_exists(__strtoull HAVE___STRTOULL)
|
||||||
endif (UNIX)
|
endif (UNIX)
|
||||||
|
|
||||||
set(LIBSSH_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} CACHE INTERNAL "libssh required system libraries")
|
set(LIBSSH_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} CACHE INTERNAL "libssh required system libraries")
|
||||||
|
|
||||||
# LIBRARIES
|
# LIBRARIES
|
||||||
if (OPENSSL_FOUND)
|
if (OPENSSL_FOUND)
|
||||||
@@ -175,11 +240,16 @@ endif (OPENSSL_FOUND)
|
|||||||
if (GCRYPT_FOUND)
|
if (GCRYPT_FOUND)
|
||||||
set(HAVE_LIBGCRYPT 1)
|
set(HAVE_LIBGCRYPT 1)
|
||||||
if (GCRYPT_VERSION VERSION_GREATER "1.4.6")
|
if (GCRYPT_VERSION VERSION_GREATER "1.4.6")
|
||||||
#set(HAVE_GCRYPT_ECC 1)
|
set(HAVE_GCRYPT_ECC 1)
|
||||||
#set(HAVE_ECC 1)
|
set(HAVE_ECC 1)
|
||||||
endif (GCRYPT_VERSION VERSION_GREATER "1.4.6")
|
endif (GCRYPT_VERSION VERSION_GREATER "1.4.6")
|
||||||
endif (GCRYPT_FOUND)
|
endif (GCRYPT_FOUND)
|
||||||
|
|
||||||
|
if (MBEDTLS_FOUND)
|
||||||
|
set(HAVE_LIBMBEDCRYPTO 1)
|
||||||
|
set(HAVE_ECC 1)
|
||||||
|
endif (MBEDTLS_FOUND)
|
||||||
|
|
||||||
if (CMAKE_USE_PTHREADS_INIT)
|
if (CMAKE_USE_PTHREADS_INIT)
|
||||||
set(HAVE_PTHREAD 1)
|
set(HAVE_PTHREAD 1)
|
||||||
endif (CMAKE_USE_PTHREADS_INIT)
|
endif (CMAKE_USE_PTHREADS_INIT)
|
||||||
@@ -199,6 +269,65 @@ int main(void) {
|
|||||||
return 0;
|
return 0;
|
||||||
}" HAVE_MSC_THREAD_LOCAL_STORAGE)
|
}" HAVE_MSC_THREAD_LOCAL_STORAGE)
|
||||||
|
|
||||||
|
###########################################################
|
||||||
|
# For detecting attributes we need to treat warnings as
|
||||||
|
# errors
|
||||||
|
if (UNIX)
|
||||||
|
# Get warnings for attributs
|
||||||
|
check_c_compiler_flag("-Wattributs" REQUIRED_FLAGS_WERROR)
|
||||||
|
if (REQUIRED_FLAGS_WERROR)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Wattributes")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Turn warnings into errors
|
||||||
|
check_c_compiler_flag("-Werror" REQUIRED_FLAGS_WERROR)
|
||||||
|
if (REQUIRED_FLAGS_WERROR)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Werror")
|
||||||
|
endif()
|
||||||
|
endif (UNIX)
|
||||||
|
|
||||||
|
check_c_source_compiles("
|
||||||
|
void test_constructor_attribute(void) __attribute__ ((constructor));
|
||||||
|
|
||||||
|
void test_constructor_attribute(void)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
return 0;
|
||||||
|
}" HAVE_CONSTRUCTOR_ATTRIBUTE)
|
||||||
|
|
||||||
|
check_c_source_compiles("
|
||||||
|
void test_destructor_attribute(void) __attribute__ ((destructor));
|
||||||
|
|
||||||
|
void test_destructor_attribute(void)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
return 0;
|
||||||
|
}" HAVE_DESTRUCTOR_ATTRIBUTE)
|
||||||
|
|
||||||
|
check_c_source_compiles("
|
||||||
|
#define FALL_THROUGH __attribute__((fallthrough))
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
int i = 2;
|
||||||
|
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
FALL_THROUGH;
|
||||||
|
case 1:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}" HAVE_FALLTHROUGH_ATTRIBUTE)
|
||||||
|
|
||||||
check_c_source_compiles("
|
check_c_source_compiles("
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@@ -206,7 +335,7 @@ int main(void)
|
|||||||
{
|
{
|
||||||
char buf[] = \"This is some content\";
|
char buf[] = \"This is some content\";
|
||||||
|
|
||||||
memset(buf, '\\\\0', sizeof(buf)); __asm__ volatile(\"\" : : \"r\"(&buf) : \"memory\");
|
memset(buf, '\\\\0', sizeof(buf)); __asm__ volatile(\"\" : : \"g\"(&buf) : \"memory\");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}" HAVE_GCC_VOLATILE_MEMORY_PROTECTION)
|
}" HAVE_GCC_VOLATILE_MEMORY_PROTECTION)
|
||||||
@@ -237,11 +366,40 @@ int main(void) {
|
|||||||
return 0;
|
return 0;
|
||||||
}" HAVE_COMPILER__FUNCTION__)
|
}" HAVE_COMPILER__FUNCTION__)
|
||||||
|
|
||||||
|
check_c_source_compiles("
|
||||||
|
#define ARRAY_LEN 16
|
||||||
|
void test_attr(const unsigned char *k)
|
||||||
|
__attribute__((__bounded__(__minbytes__, 2, 16)));
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
return 0;
|
||||||
|
}" HAVE_GCC_BOUNDED_ATTRIBUTE)
|
||||||
|
|
||||||
|
# Stop treating warnings as errors
|
||||||
|
unset(CMAKE_REQUIRED_FLAGS)
|
||||||
|
|
||||||
|
# Check for version script support
|
||||||
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map" "VERS_1 {
|
||||||
|
global: sym;
|
||||||
|
};
|
||||||
|
VERS_2 {
|
||||||
|
global: sym;
|
||||||
|
} VERS_1;
|
||||||
|
")
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--version-script=\"${CMAKE_CURRENT_BINARY_DIR}/conftest.map\"")
|
||||||
|
check_c_source_compiles("int main(void) { return 0; }" HAVE_LD_VERSION_SCRIPT)
|
||||||
|
unset(CMAKE_REQUIRED_FLAGS)
|
||||||
|
file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
|
||||||
|
|
||||||
if (WITH_DEBUG_CRYPTO)
|
if (WITH_DEBUG_CRYPTO)
|
||||||
set(DEBUG_CRYPTO 1)
|
set(DEBUG_CRYPTO 1)
|
||||||
endif (WITH_DEBUG_CRYPTO)
|
endif (WITH_DEBUG_CRYPTO)
|
||||||
|
|
||||||
|
if (WITH_DEBUG_PACKET)
|
||||||
|
set(DEBUG_PACKET 1)
|
||||||
|
endif (WITH_DEBUG_PACKET)
|
||||||
|
|
||||||
if (WITH_DEBUG_CALLTRACE)
|
if (WITH_DEBUG_CALLTRACE)
|
||||||
set(DEBUG_CALLTRACE 1)
|
set(DEBUG_CALLTRACE 1)
|
||||||
endif (WITH_DEBUG_CALLTRACE)
|
endif (WITH_DEBUG_CALLTRACE)
|
||||||
|
|||||||
@@ -1,33 +1,49 @@
|
|||||||
option(WITH_GSSAPI "Build with GSSAPI support" ON)
|
option(WITH_GSSAPI "Build with GSSAPI support" ON)
|
||||||
option(WITH_ZLIB "Build with ZLIB support" ON)
|
option(WITH_ZLIB "Build with ZLIB support" ON)
|
||||||
option(WITH_SSH1 "Build with SSH1 support" OFF)
|
|
||||||
option(WITH_SFTP "Build with SFTP support" ON)
|
option(WITH_SFTP "Build with SFTP support" ON)
|
||||||
option(WITH_SERVER "Build with SSH server support" ON)
|
option(WITH_SERVER "Build with SSH server support" ON)
|
||||||
option(WITH_STATIC_LIB "Build with a static library" OFF)
|
option(WITH_STATIC_LIB "Build with a static library" OFF)
|
||||||
option(WITH_DEBUG_CRYPTO "Build with cryto debug output" OFF)
|
option(WITH_DEBUG_CRYPTO "Build with cryto debug output" OFF)
|
||||||
|
option(WITH_DEBUG_PACKET "Build with packet debug output" OFF)
|
||||||
option(WITH_DEBUG_CALLTRACE "Build with calltrace debug output" ON)
|
option(WITH_DEBUG_CALLTRACE "Build with calltrace debug output" ON)
|
||||||
option(WITH_GCRYPT "Compile against libgcrypt" OFF)
|
option(WITH_GCRYPT "Compile against libgcrypt" OFF)
|
||||||
|
option(WITH_MBEDTLS "Compile against libmbedtls" OFF)
|
||||||
option(WITH_PCAP "Compile with Pcap generation support" ON)
|
option(WITH_PCAP "Compile with Pcap generation support" ON)
|
||||||
option(WITH_INTERNAL_DOC "Compile doxygen internal documentation" OFF)
|
option(WITH_INTERNAL_DOC "Compile doxygen internal documentation" OFF)
|
||||||
option(WITH_TESTING "Build with unit tests" OFF)
|
option(UNIT_TESTING "Build with unit tests" OFF)
|
||||||
option(WITH_CLIENT_TESTING "Build with client tests; requires a running sshd" OFF)
|
option(CLIENT_TESTING "Build with client tests; requires openssh" OFF)
|
||||||
|
option(SERVER_TESTING "Build with server tests; requires openssh and dropbear" OFF)
|
||||||
option(WITH_BENCHMARKS "Build benchmarks tools" OFF)
|
option(WITH_BENCHMARKS "Build benchmarks tools" OFF)
|
||||||
option(WITH_EXAMPLES "Build examples" ON)
|
option(WITH_EXAMPLES "Build examples" ON)
|
||||||
option(WITH_NACL "Build with libnacl (curve25519" ON)
|
option(WITH_NACL "Build with libnacl (curve25519)" ON)
|
||||||
|
option(WITH_SYMBOL_VERSIONING "Build with symbol versioning" ON)
|
||||||
|
option(WITH_ABI_BREAK "Allow ABI break" OFF)
|
||||||
|
option(FUZZ_TESTING "Build with fuzzer for the server" OFF)
|
||||||
|
option(PICKY_DEVELOPER "Build with picky developer flags" OFF)
|
||||||
|
|
||||||
if (WITH_ZLIB)
|
if (WITH_ZLIB)
|
||||||
set(WITH_LIBZ ON)
|
set(WITH_LIBZ ON)
|
||||||
else (WITH_ZLIB)
|
else (WITH_ZLIB)
|
||||||
set(WITH_LIBZ OFF)
|
set(WITH_LIBZ OFF)
|
||||||
endif (WITH_ZLIB)
|
endif (WITH_ZLIB)
|
||||||
|
|
||||||
if(WITH_BENCHMARKS)
|
if (WITH_BENCHMARKS)
|
||||||
set(WITH_TESTING ON)
|
set(UNIT_TESTING ON)
|
||||||
endif(WITH_BENCHMARKS)
|
set(CLIENT_TESTING ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (WITH_TESTING)
|
if (WITH_STATIC_LIB)
|
||||||
set(WITH_STATIC_LIB ON)
|
set(BUILD_STATIC_LIB ON)
|
||||||
endif (WITH_TESTING)
|
endif (WITH_STATIC_LIB)
|
||||||
|
|
||||||
|
if (UNIT_TESTING)
|
||||||
|
set(BUILD_STATIC_LIB ON)
|
||||||
|
endif (UNIT_TESTING)
|
||||||
|
|
||||||
if (WITH_NACL)
|
if (WITH_NACL)
|
||||||
set(WITH_NACL ON)
|
set(WITH_NACL ON)
|
||||||
endif (WITH_NACL)
|
endif (WITH_NACL)
|
||||||
|
|
||||||
|
if (WITH_ABI_BREAK)
|
||||||
|
set(WITH_SYMBOL_VERSIONING ON)
|
||||||
|
endif (WITH_ABI_BREAK)
|
||||||
|
|||||||
20
INSTALL
@@ -14,6 +14,10 @@ or
|
|||||||
|
|
||||||
optional:
|
optional:
|
||||||
- [libz](http://www.zlib.net) >= 1.2
|
- [libz](http://www.zlib.net) >= 1.2
|
||||||
|
- [socket_wrapper](https://cwrap.org/) >= 1.1.5
|
||||||
|
- [nss_wrapper](https://cwrap.org/) >= 1.1.2
|
||||||
|
- [uid_wrapper](https://cwrap.org/) >= 1.2.0
|
||||||
|
- [pam_wrapper](https://cwrap.org/) >= 1.0.1
|
||||||
|
|
||||||
Note that these version numbers are version we know works correctly. If you
|
Note that these version numbers are version we know works correctly. If you
|
||||||
build and run libssh successfully with an older version, please let us know.
|
build and run libssh successfully with an older version, please let us know.
|
||||||
@@ -31,13 +35,27 @@ First, you need to configure the compilation, using CMake. Go inside the
|
|||||||
|
|
||||||
GNU/Linux, MacOS X, MSYS/MinGW:
|
GNU/Linux, MacOS X, MSYS/MinGW:
|
||||||
|
|
||||||
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
|
cmake -DUNIT_TESTING=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
|
||||||
make
|
make
|
||||||
|
|
||||||
On Windows you should choose a makefile gernerator with -G or use
|
On Windows you should choose a makefile gernerator with -G or use
|
||||||
|
|
||||||
cmake-gui.exe ..
|
cmake-gui.exe ..
|
||||||
|
|
||||||
|
To enable additional client tests against a local OpenSSH server, add the
|
||||||
|
compile option -DCLIENT_TESTING=ON. These tests require an OpenSSH
|
||||||
|
server package and some wrapper libraries (see optional requirements) to
|
||||||
|
be installed.
|
||||||
|
|
||||||
|
If you're interested in server testing, then a OpenSSH client should be
|
||||||
|
installed on the system and if possible also dropbear. Once that is done
|
||||||
|
enable server support with -DWITH_SERVER=ON and enable testing of it with
|
||||||
|
-DSERVER_TESTING=ON.
|
||||||
|
|
||||||
|
## Testing build
|
||||||
|
|
||||||
|
make test
|
||||||
|
|
||||||
### CMake standard options
|
### CMake standard options
|
||||||
Here is a list of the most interesting options provided out of the box by
|
Here is a list of the most interesting options provided out of the box by
|
||||||
CMake.
|
CMake.
|
||||||
|
|||||||
125
README
@@ -33,130 +33,11 @@ If you ask yourself how to compile libssh, please read INSTALL before anything.
|
|||||||
|
|
||||||
http://www.libssh.org
|
http://www.libssh.org
|
||||||
|
|
||||||
4* API Changes !
|
4* Contributing
|
||||||
-_-_-_-_-_-_-_-_-_
|
-_-_-_-_-_-_-_-_-_
|
||||||
|
|
||||||
Changes between 0.4 and 0.5
|
Please read the file 'SubmittingPatches' next to this README file. It explains
|
||||||
---------------------------
|
our copyright policy and how you should send patches for upstream inclusion.
|
||||||
|
|
||||||
We use the ssh_ prefix as namespace for every function now. There is a legacy.h
|
|
||||||
which could be used to get the old function names.
|
|
||||||
|
|
||||||
Changes between 0.3 and 0.4
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
We changed libssh to be typesafe now:
|
|
||||||
|
|
||||||
SSH_SESSION *session -> ssh_session session
|
|
||||||
SFTP_SESSION *sftp -> sftp_session sftp
|
|
||||||
CHANNEL *channel -> ssh_channel channel
|
|
||||||
STRING *string -> ssh_string string
|
|
||||||
...
|
|
||||||
|
|
||||||
The options structure has been removed and there is a new function. This
|
|
||||||
function can set all available options now. You can find the enum in the
|
|
||||||
header file and it is documented. Example:
|
|
||||||
|
|
||||||
ssh_options_set(session, SSH_OPTIONS_HOST, "localhost");
|
|
||||||
|
|
||||||
5* Copyright policy
|
|
||||||
-_-_-_-_-_-_-_-_-_-_
|
|
||||||
|
|
||||||
libssh is a project with distributed copyright ownership, which means we prefer
|
|
||||||
the copyright on parts of libssh to be held by individuals rather than
|
|
||||||
corporations if possible. There are historical legal reasons for this, but one
|
|
||||||
of the best ways to explain it is that it’s much easier to work with
|
|
||||||
individuals who have ownership than corporate legal departments if we ever need
|
|
||||||
to make reasonable compromises with people using and working with libssh.
|
|
||||||
|
|
||||||
We track the ownership of every part of libssh via git, our source code control
|
|
||||||
system, so we know the provenance of every piece of code that is committed to
|
|
||||||
libssh.
|
|
||||||
|
|
||||||
So if possible, if you’re doing libssh changes on behalf of a company who
|
|
||||||
normally owns all the work you do please get them to assign personal copyright
|
|
||||||
ownership of your changes to you as an individual, that makes things very easy
|
|
||||||
for us to work with and avoids bringing corporate legal departments into the
|
|
||||||
picture.
|
|
||||||
|
|
||||||
If you can’t do this we can still accept patches from you owned by your
|
|
||||||
employer under a standard employment contract with corporate copyright
|
|
||||||
ownership. It just requires a simple set-up process first.
|
|
||||||
|
|
||||||
We use a process very similar to the way things are done in the Linux Kernel
|
|
||||||
community, so it should be very easy to get a sign off from your corporate
|
|
||||||
legal department. The only changes we’ve made are to accommodate the license we
|
|
||||||
use, which is LGPLv2 (or later) whereas the Linux kernel uses GPLv2.
|
|
||||||
|
|
||||||
The process is called signing.
|
|
||||||
|
|
||||||
How to sign your work
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
Once you have permission to contribute to libssh from your employer, simply
|
|
||||||
email a copy of the following text from your corporate email address to:
|
|
||||||
|
|
||||||
contributing@libssh.org
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------
|
|
||||||
libssh Developer's Certificate of Origin. Version 1.0
|
|
||||||
|
|
||||||
By making a contribution to this project, I certify that:
|
|
||||||
|
|
||||||
(a) The contribution was created in whole or in part by me and I
|
|
||||||
have the right to submit it under the appropriate
|
|
||||||
version of the GNU General Public License; or
|
|
||||||
|
|
||||||
(b) The contribution is based upon previous work that, to the best of
|
|
||||||
my knowledge, is covered under an appropriate open source license
|
|
||||||
and I have the right under that license to submit that work with
|
|
||||||
modifications, whether created in whole or in part by me, under
|
|
||||||
the GNU General Public License, in the appropriate version; or
|
|
||||||
|
|
||||||
(c) The contribution was provided directly to me by some other
|
|
||||||
person who certified (a) or (b) and I have not modified it.
|
|
||||||
|
|
||||||
(d) I understand and agree that this project and the contribution are
|
|
||||||
public and that a record of the contribution (including all
|
|
||||||
metadata and personal information I submit with it, including my
|
|
||||||
sign-off) is maintained indefinitely and may be redistributed
|
|
||||||
consistent with the libssh Team's policies and the requirements of
|
|
||||||
the GNU GPL where they are relevant.
|
|
||||||
|
|
||||||
(e) I am granting this work to this project under the terms of the
|
|
||||||
GNU Lesser General Public License as published by the
|
|
||||||
Free Software Foundation; either version 2.1 of
|
|
||||||
the License, or (at the option of the project) any later version.
|
|
||||||
|
|
||||||
http://www.gnu.org/licenses/lgpl-2.1.html
|
|
||||||
--------------------------------------------------------------------------
|
|
||||||
|
|
||||||
We will maintain a copy of that email as a record that you have the rights to
|
|
||||||
contribute code to libssh under the required licenses whilst working for the
|
|
||||||
company where the email came from.
|
|
||||||
|
|
||||||
Then when sending in a patch via the normal mechanisms described above, add a
|
|
||||||
line that states:
|
|
||||||
|
|
||||||
|
|
||||||
Signed-off-by: Random J Developer <random@developer.example.org>
|
|
||||||
|
|
||||||
|
|
||||||
using your real name and the email address you sent the original email you used
|
|
||||||
to send the libssh Developer’s Certificate of Origin to us (sorry, no
|
|
||||||
pseudonyms or anonymous contributions.)
|
|
||||||
|
|
||||||
That’s it! Such code can then quite happily contain changes that have copyright
|
|
||||||
messages such as:
|
|
||||||
|
|
||||||
|
|
||||||
(c) Example Corporation.
|
|
||||||
|
|
||||||
|
|
||||||
and can be merged into the libssh codebase in the same way as patches from any
|
|
||||||
other individual. You don’t need to send in a copy of the libssh Developer’s
|
|
||||||
Certificate of Origin for each patch, or inside each patch. Just the sign-off
|
|
||||||
message is all that is required once we’ve received the initial email.
|
|
||||||
|
|
||||||
Have fun and happy libssh hacking!
|
Have fun and happy libssh hacking!
|
||||||
|
|
||||||
|
|||||||
@@ -287,6 +287,27 @@ Good Examples:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Initialize pointers
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
All pointer variables MUST be initialized to NULL. History has
|
||||||
|
demonstrated that uninitialized pointer variables have lead to various
|
||||||
|
bugs and security issues.
|
||||||
|
|
||||||
|
Pointers MUST be initialized even if the assignment directly follows
|
||||||
|
the declaration, like pointer2 in the example below, because the
|
||||||
|
instructions sequence may change over time.
|
||||||
|
|
||||||
|
Good Example:
|
||||||
|
|
||||||
|
char *pointer1 = NULL;
|
||||||
|
char *pointer2 = NULL;
|
||||||
|
|
||||||
|
pointer2 = some_func2();
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
pointer1 = some_func1();
|
||||||
|
|
||||||
Typedefs
|
Typedefs
|
||||||
---------
|
---------
|
||||||
|
|||||||
11
README.mbedtls
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
mbedTLS and libssh in multithreaded applications
|
||||||
|
==================================================
|
||||||
|
|
||||||
|
To use libssh with mbedTLS in a multithreaded application, mbedTLS has to be
|
||||||
|
built with threading support enabled.
|
||||||
|
|
||||||
|
If threading support is not available and multi threading is used, ssh_init
|
||||||
|
will fail.
|
||||||
|
|
||||||
|
More information about building mbedTLS with threading support can be found
|
||||||
|
in the mbedTLS documentation.
|
||||||
44
README.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
[](https://gitlab.com/libssh/libssh-mirror/commits/master)
|
||||||
|
|
||||||
|
```
|
||||||
|
_ _ _ _
|
||||||
|
(_) (_) (_) (_)
|
||||||
|
(_) _ (_) _ _ _ _ _ (_) _
|
||||||
|
(_) (_) (_)(_) _ (_)(_) (_)(_) (_)(_) _
|
||||||
|
(_) (_) (_) (_) _ (_) _ (_) (_) (_)
|
||||||
|
(_) (_) (_)(_)(_) (_)(_) (_)(_) (_) (_).org
|
||||||
|
|
||||||
|
The SSH library
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
# Why?
|
||||||
|
|
||||||
|
Why not ? :) I've began to work on my own implementation of the ssh protocol
|
||||||
|
because i didn't like the currently public ones.
|
||||||
|
Not any allowed you to import and use the functions as a powerful library,
|
||||||
|
and so i worked on a library-based SSH implementation which was non-existing
|
||||||
|
in the free and open source software world.
|
||||||
|
|
||||||
|
|
||||||
|
# How/Who?
|
||||||
|
|
||||||
|
If you downloaded this file, you must know what it is : a library for
|
||||||
|
accessing ssh client services through C libraries calls in a simple manner.
|
||||||
|
Everybody can use this software under the terms of the LGPL - see the COPYING
|
||||||
|
file
|
||||||
|
|
||||||
|
If you ask yourself how to compile libssh, please read INSTALL before anything.
|
||||||
|
|
||||||
|
# Where ?
|
||||||
|
|
||||||
|
https://www.libssh.org
|
||||||
|
|
||||||
|
# Contributing
|
||||||
|
|
||||||
|
Please read the file 'SubmittingPatches' next to this README file. It explains
|
||||||
|
our copyright policy and how you should send patches for upstream inclusion.
|
||||||
|
|
||||||
|
Have fun and happy libssh hacking!
|
||||||
|
|
||||||
|
The libssh Team
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
How to contribute a patch to libssh
|
How to contribute a patch to libssh
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
Simple, just make the code change, and email it as either a "diff -u"
|
Please checkout the libssh source code using git. Change the code and then
|
||||||
change, or as a "git format-patch" change against the original source
|
use "git format-patch" to create a patch. The patch should be signed (see
|
||||||
code to libssh@libssh.org, or attach it to a bug report at
|
below) and send it to libssh@libssh.org, or attach it to a bug report at
|
||||||
https://red.libssh.org/
|
https://red.libssh.org/
|
||||||
|
|
||||||
For larger code changes, breaking the changes up into a set of simple
|
For larger code changes, breaking the changes up into a set of simple
|
||||||
|
|||||||
21
cmake/Modules/AddCCompilerFlag.cmake
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#
|
||||||
|
# add_c_compiler_flag("-Werror" SUPPORTED_CFLAGS)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2018 Andreas Schneider <asn@cryptomilk.org>
|
||||||
|
#
|
||||||
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
|
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
|
||||||
|
macro(add_c_compiler_flag _COMPILER_FLAG _OUTPUT_VARIABLE)
|
||||||
|
string(TOUPPER ${_COMPILER_FLAG} _COMPILER_FLAG_NAME)
|
||||||
|
string(REGEX REPLACE "^-" "" _COMPILER_FLAG_NAME "${_COMPILER_FLAG_NAME}")
|
||||||
|
string(REGEX REPLACE "(-|=|\ )" "_" _COMPILER_FLAG_NAME "${_COMPILER_FLAG_NAME}")
|
||||||
|
|
||||||
|
check_c_compiler_flag("${_COMPILER_FLAG}" WITH_${_COMPILER_FLAG_NAME}_FLAG)
|
||||||
|
if (WITH_${_COMPILER_FLAG_NAME}_FLAG)
|
||||||
|
#string(APPEND ${_OUTPUT_VARIABLE} "${_COMPILER_FLAG} ")
|
||||||
|
list(APPEND ${_OUTPUT_VARIABLE} ${_COMPILER_FLAG})
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# - ADD_CHECK_TEST(test_name test_source linklib1 ... linklibN)
|
# - add_cmocka_test(test_name test_source linklib1 ... linklibN)
|
||||||
|
|
||||||
# Copyright (c) 2007 Daniel Gollub <dgollub@suse.de>
|
# Copyright (c) 2007 Daniel Gollub <dgollub@suse.de>
|
||||||
# Copyright (c) 2007-2010 Andreas Schneider <asn@cryptomilk.org>
|
# Copyright (c) 2007-2018 Andreas Schneider <asn@cryptomilk.org>
|
||||||
#
|
#
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
@@ -9,22 +9,18 @@
|
|||||||
enable_testing()
|
enable_testing()
|
||||||
include(CTest)
|
include(CTest)
|
||||||
|
|
||||||
if(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW)
|
if (CMAKE_CROSSCOMPILING)
|
||||||
# Profiling
|
if (WIN32)
|
||||||
set(CMAKE_C_FLAGS_PROFILING "-g -O0 -Wall -W -Wshadow -Wunused-variable -Wunused-parameter -Wunused-function -Wunused -Wno-system-headers -Wwrite-strings -fprofile-arcs -ftest-coverage" CACHE STRING "Profiling Compiler Flags")
|
find_program(WINE_EXECUTABLE
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS_PROFILING " -fprofile-arcs -ftest-coverage" CACHE STRING "Profiling Linker Flags")
|
NAMES wine)
|
||||||
set(CMAKE_MODULE_LINKER_FLAGS_PROFILING " -fprofile-arcs -ftest-coverage" CACHE STRING "Profiling Linker Flags")
|
set(TARGET_SYSTEM_EMULATOR ${WINE_EXECUTABLE})
|
||||||
set(CMAKE_EXEC_LINKER_FLAGS_PROFILING " -fprofile-arcs -ftest-coverage" CACHE STRING "Profiling Linker Flags")
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
# Address Sanitizer
|
function(ADD_CMOCKA_TEST _testName _testSource)
|
||||||
set(CMAKE_C_FLAGS_ADDRESSSANITIZER "-g -O1 -fsanitize=address -fno-omit-frame-pointer" CACHE STRING "Address sanitizer compiler flags")
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS_ADDRESSSANITIZER "-fsanitize=address" CACHE STRING "Address sanitizer shared linker flags")
|
|
||||||
set(CMAKE_MODULE_LINKER_FLAGS_ADDRESSSANITIZER "-fsanitize=address" CACHE STRING "Address sanitizer module linker flags")
|
|
||||||
set(CMAKE_EXEC_LINKER_FLAGS_ADDRESSSANITIZER "-fsanitize=address" CACHE STRING "Address sanitizer executable linker flags")
|
|
||||||
endif(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW)
|
|
||||||
|
|
||||||
function (ADD_CMOCKA_TEST _testName _testSource)
|
|
||||||
add_executable(${_testName} ${_testSource})
|
add_executable(${_testName} ${_testSource})
|
||||||
|
|
||||||
target_link_libraries(${_testName} ${ARGN})
|
target_link_libraries(${_testName} ${ARGN})
|
||||||
add_test(${_testName} ${CMAKE_CURRENT_BINARY_DIR}/${_testName})
|
|
||||||
|
add_test(${_testName} ${TARGET_SYSTEM_EMULATOR} ${CMAKE_CURRENT_BINARY_DIR}/${_testName}${CMAKE_EXECUTABLE_SUFFIX})
|
||||||
endfunction (ADD_CMOCKA_TEST)
|
endfunction (ADD_CMOCKA_TEST)
|
||||||
|
|||||||
@@ -15,12 +15,15 @@
|
|||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
|
|
||||||
|
# Requires cmake 3.10
|
||||||
|
#include_guard(GLOBAL)
|
||||||
include(CheckCSourceCompiles)
|
include(CheckCSourceCompiles)
|
||||||
|
|
||||||
function(CHECK_C_COMPILER_FLAG_SSP _FLAG _RESULT)
|
macro(CHECK_C_COMPILER_FLAG_SSP _FLAG _RESULT)
|
||||||
set(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
|
set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
|
||||||
set(CMAKE_REQUIRED_DEFINITIONS "${_FLAG}")
|
set(CMAKE_REQUIRED_FLAGS "${_FLAG}")
|
||||||
|
|
||||||
check_c_source_compiles("int main(int argc, char **argv) { char buffer[256]; return buffer[argc]=0;}" ${_RESULT})
|
check_c_source_compiles("int main(int argc, char **argv) { char buffer[256]; return buffer[argc]=0;}" ${_RESULT})
|
||||||
set(CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
|
|
||||||
endfunction(CHECK_C_COMPILER_FLAG_SSP)
|
set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
|
||||||
|
endmacro(CHECK_C_COMPILER_FLAG_SSP)
|
||||||
|
|||||||
@@ -14,17 +14,8 @@ set(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON)
|
|||||||
# since cmake 2.4.0
|
# since cmake 2.4.0
|
||||||
set(CMAKE_COLOR_MAKEFILE ON)
|
set(CMAKE_COLOR_MAKEFILE ON)
|
||||||
|
|
||||||
# Define the generic version of the libraries here
|
|
||||||
set(GENERIC_LIB_VERSION "0.1.0")
|
|
||||||
set(GENERIC_LIB_SOVERSION "0")
|
|
||||||
|
|
||||||
# Set the default build type to release with debug info
|
|
||||||
if (NOT CMAKE_BUILD_TYPE)
|
|
||||||
set(CMAKE_BUILD_TYPE RelWithDebInfo
|
|
||||||
CACHE STRING
|
|
||||||
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
|
|
||||||
)
|
|
||||||
endif (NOT CMAKE_BUILD_TYPE)
|
|
||||||
|
|
||||||
# Create the compile command database for clang by default
|
# Create the compile command database for clang by default
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
|
# Always build with -fPIC
|
||||||
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||||
|
|||||||
@@ -1,84 +1,25 @@
|
|||||||
# define system dependent compiler flags
|
|
||||||
|
|
||||||
include(CheckCCompilerFlag)
|
|
||||||
include(CheckCCompilerFlagSSP)
|
|
||||||
|
|
||||||
if (UNIX AND NOT WIN32)
|
if (UNIX AND NOT WIN32)
|
||||||
#
|
# Activate with: -DCMAKE_BUILD_TYPE=Profiling
|
||||||
# Define GNUCC compiler flags
|
set(CMAKE_C_FLAGS_PROFILING "-g -O0 -fprofile-arcs -ftest-coverage"
|
||||||
#
|
CACHE STRING "Flags used by the C compiler during PROFILING builds.")
|
||||||
if (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)")
|
set(CMAKE_CXX_FLAGS_PROFILING "-g -O0 -fprofile-arcs -ftest-coverage"
|
||||||
|
CACHE STRING "Flags used by the CXX compiler during PROFILING builds.")
|
||||||
# add -Wconversion ?
|
set(CMAKE_SHARED_LINKER_FLAGS_PROFILING "-fprofile-arcs -ftest-coverage"
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -pedantic -pedantic-errors")
|
CACHE STRING "Flags used by the linker during the creation of shared libraries during PROFILING builds.")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wshadow -Wmissing-prototypes -Wdeclaration-after-statement")
|
set(CMAKE_MODULE_LINKER_FLAGS_PROFILING "-fprofile-arcs -ftest-coverage"
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused -Wfloat-equal -Wpointer-arith -Wwrite-strings -Wformat-security")
|
CACHE STRING "Flags used by the linker during the creation of shared libraries during PROFILING builds.")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
|
set(CMAKE_EXEC_LINKER_FLAGS_PROFILING "-fprofile-arcs -ftest-coverage"
|
||||||
|
CACHE STRING "Flags used by the linker during PROFILING builds.")
|
||||||
# with -fPIC
|
|
||||||
check_c_compiler_flag("-fPIC" WITH_FPIC)
|
|
||||||
if (WITH_FPIC)
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
|
||||||
endif (WITH_FPIC)
|
|
||||||
|
|
||||||
check_c_compiler_flag_ssp("-fstack-protector" WITH_STACK_PROTECTOR)
|
|
||||||
if (WITH_STACK_PROTECTOR)
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector")
|
|
||||||
endif (WITH_STACK_PROTECTOR)
|
|
||||||
|
|
||||||
if (CMAKE_BUILD_TYPE)
|
|
||||||
string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
|
|
||||||
if (CMAKE_BUILD_TYPE_LOWER MATCHES (release|relwithdebinfo|minsizerel))
|
|
||||||
check_c_compiler_flag("-Wp,-D_FORTIFY_SOURCE=2" WITH_FORTIFY_SOURCE)
|
|
||||||
if (WITH_FORTIFY_SOURCE)
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wp,-D_FORTIFY_SOURCE=2")
|
|
||||||
endif (WITH_FORTIFY_SOURCE)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)")
|
|
||||||
|
|
||||||
#
|
|
||||||
# Check for large filesystem support
|
|
||||||
#
|
|
||||||
if (CMAKE_SIZEOF_VOID_P MATCHES "8")
|
|
||||||
# with large file support
|
|
||||||
execute_process(
|
|
||||||
COMMAND
|
|
||||||
getconf LFS64_CFLAGS
|
|
||||||
OUTPUT_VARIABLE
|
|
||||||
_lfs_CFLAGS
|
|
||||||
ERROR_QUIET
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
else (CMAKE_SIZEOF_VOID_P MATCHES "8")
|
|
||||||
# with large file support
|
|
||||||
execute_process(
|
|
||||||
COMMAND
|
|
||||||
getconf LFS_CFLAGS
|
|
||||||
OUTPUT_VARIABLE
|
|
||||||
_lfs_CFLAGS
|
|
||||||
ERROR_QUIET
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
endif (CMAKE_SIZEOF_VOID_P MATCHES "8")
|
|
||||||
if (_lfs_CFLAGS)
|
|
||||||
string(REGEX REPLACE "[\r\n]" " " "${_lfs_CFLAGS}" "${${_lfs_CFLAGS}}")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_lfs_CFLAGS}")
|
|
||||||
endif (_lfs_CFLAGS)
|
|
||||||
|
|
||||||
endif (UNIX AND NOT WIN32)
|
|
||||||
|
|
||||||
if (MSVC)
|
|
||||||
# Use secure functions by defaualt and suppress warnings about
|
|
||||||
#"deprecated" functions
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_NONSTDC_NO_WARNINGS=1 /D _CRT_SECURE_NO_WARNINGS=1")
|
|
||||||
endif (MSVC)
|
|
||||||
|
|
||||||
# This removes this annoying warning
|
|
||||||
# "warning: 'BN_CTX_free' is deprecated: first deprecated in OS X 10.7 [-Wdeprecated-declarations]"
|
|
||||||
if (OSX)
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
|
|
||||||
endif (OSX)
|
|
||||||
|
|
||||||
|
# Activate with: -DCMAKE_BUILD_TYPE=AddressSanitizer
|
||||||
|
set(CMAKE_C_FLAGS_ADDRESSSANITIZER "-g -O1 -fsanitize=address -fno-omit-frame-pointer"
|
||||||
|
CACHE STRING "Flags used by the C compiler during ADDRESSSANITIZER builds.")
|
||||||
|
set(CMAKE_CXX_FLAGS_ADDRESSSANITIZER "-g -O1 -fsanitize=address -fno-omit-frame-pointer"
|
||||||
|
CACHE STRING "Flags used by the CXX compiler during ADDRESSSANITIZER builds.")
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS_ADDRESSSANITIZER "-fsanitize=address"
|
||||||
|
CACHE STRING "Flags used by the linker during the creation of shared libraries during ADDRESSSANITIZER builds.")
|
||||||
|
set(CMAKE_MODULE_LINKER_FLAGS_ADDRESSSANITIZER "-fsanitize=address"
|
||||||
|
CACHE STRING "Flags used by the linker during the creation of shared libraries during ADDRESSSANITIZER builds.")
|
||||||
|
set(CMAKE_EXEC_LINKER_FLAGS_ADDRESSSANITIZER "-fsanitize=address"
|
||||||
|
CACHE STRING "Flags used by the linker during ADDRESSSANITIZER builds.")
|
||||||
|
endif()
|
||||||
|
|||||||
92
cmake/Modules/ExtractSymbols.cmake
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2018 Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
|
||||||
|
#
|
||||||
|
# Redistribution and use is allowed according to the terms of the New
|
||||||
|
# BSD license.
|
||||||
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
|
#
|
||||||
|
|
||||||
|
#.rst:
|
||||||
|
# ExtractSymbols
|
||||||
|
# --------------
|
||||||
|
#
|
||||||
|
# This is a helper script for FindABImap.cmake.
|
||||||
|
#
|
||||||
|
# Extract symbols from header files and output a list to a file.
|
||||||
|
# This script is run in build time to extract symbols from the provided header
|
||||||
|
# files. This way, symbols added or removed can be checked and used to update
|
||||||
|
# the symbol version script.
|
||||||
|
#
|
||||||
|
# All symbols followed by the character ``'('`` are extracted. If a
|
||||||
|
# ``FILTER_PATTERN`` is provided, only the lines containing the given string are
|
||||||
|
# considered.
|
||||||
|
#
|
||||||
|
# Expected defined variables
|
||||||
|
# --------------------------
|
||||||
|
#
|
||||||
|
# ``HEADERS_LIST_FILE``:
|
||||||
|
# Required, expects a file containing the list of header files to be parsed.
|
||||||
|
#
|
||||||
|
# ``OUTPUT_PATH``:
|
||||||
|
# Required, expects the output file path.
|
||||||
|
#
|
||||||
|
# Optionally defined variables
|
||||||
|
# ----------------------------
|
||||||
|
#
|
||||||
|
# ``FILTER_PATTERN``:
|
||||||
|
# Expects a string. Only lines containing the given string will be considered
|
||||||
|
# when extracting symbols.
|
||||||
|
#
|
||||||
|
|
||||||
|
if (NOT DEFINED OUTPUT_PATH)
|
||||||
|
message(SEND_ERROR "OUTPUT_PATH not defined")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT DEFINED HEADERS_LIST_FILE)
|
||||||
|
message(SEND_ERROR "HEADERS not defined")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(READ ${HEADERS_LIST_FILE} HEADERS_LIST)
|
||||||
|
|
||||||
|
set(symbols)
|
||||||
|
foreach(header ${HEADERS_LIST})
|
||||||
|
|
||||||
|
# Filter only lines containing the FILTER_PATTERN
|
||||||
|
file(STRINGS ${header} contain_filter
|
||||||
|
REGEX "^.*${FILTER_PATTERN}.*[(]"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Remove function-like macros
|
||||||
|
foreach(line ${contain_filter})
|
||||||
|
if (NOT ${line} MATCHES ".*#[ ]*define")
|
||||||
|
list(APPEND not_macro ${line})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set(functions)
|
||||||
|
|
||||||
|
# Get only the function names followed by '('
|
||||||
|
foreach(line ${not_macro})
|
||||||
|
string(REGEX MATCHALL "[a-zA-Z0-9_]+[ ]*[(]" func ${line})
|
||||||
|
list(APPEND functions ${func})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set(extracted_symbols)
|
||||||
|
|
||||||
|
# Remove '('
|
||||||
|
foreach(line ${functions})
|
||||||
|
string(REGEX REPLACE "[(]" "" symbol ${line})
|
||||||
|
string(STRIP "${symbol}" symbol)
|
||||||
|
list(APPEND extracted_symbols ${symbol})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
list(APPEND symbols ${extracted_symbols})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
list(REMOVE_DUPLICATES symbols)
|
||||||
|
|
||||||
|
list(SORT symbols)
|
||||||
|
|
||||||
|
string(REPLACE ";" "\n" symbols_list "${symbols}")
|
||||||
|
|
||||||
|
file(WRITE ${OUTPUT_PATH} "${symbols_list}")
|
||||||
486
cmake/Modules/FindABIMap.cmake
Normal file
@@ -0,0 +1,486 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2018 Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
|
||||||
|
#
|
||||||
|
# Redistribution and use is allowed according to the terms of the New
|
||||||
|
# BSD license.
|
||||||
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
|
#
|
||||||
|
|
||||||
|
#.rst:
|
||||||
|
# FindABIMap
|
||||||
|
# ----------
|
||||||
|
#
|
||||||
|
# This file provides functions to generate the symbol version script. It uses
|
||||||
|
# the ``abimap`` tool to generate and update the linker script file. It can be
|
||||||
|
# installed by calling::
|
||||||
|
#
|
||||||
|
# $ pip install abimap
|
||||||
|
#
|
||||||
|
# The ``function generate_map_file`` generates a symbol version script
|
||||||
|
# containing the provided symbols. It defines a custom command which sets
|
||||||
|
# ``target_name`` as its ``OUTPUT``.
|
||||||
|
#
|
||||||
|
# The experimental function ``extract_symbols()`` is provided as a simple
|
||||||
|
# parser to extract the symbols from C header files. It simply extracts symbols
|
||||||
|
# followed by an opening '``(``'. It is recommended to use a filter pattern to
|
||||||
|
# select the lines to be considered. It defines a custom command which sets
|
||||||
|
# ``target_name`` as its output.
|
||||||
|
#
|
||||||
|
# The helper function ``get_files_list()`` is provided to find files given a
|
||||||
|
# name pattern. It defines a custom command which sets ``target_name`` as its
|
||||||
|
# output.
|
||||||
|
#
|
||||||
|
# Functions provided
|
||||||
|
# ------------------
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# generate_map_file(target_name
|
||||||
|
# RELEASE_NAME_VERSION release_name
|
||||||
|
# SYMBOLS symbols_target
|
||||||
|
# [CURRENT_MAP cur_map]
|
||||||
|
# [FINAL]
|
||||||
|
# [BREAK_ABI]
|
||||||
|
# [COPY_TO output]
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# ``target_name``:
|
||||||
|
# Required, expects the name of the file to receive the generated symbol
|
||||||
|
# version script. It should be added as a dependency for the library. Use the
|
||||||
|
# linker option ``--version-script filename`` to add the version information
|
||||||
|
# to the symbols when building the library.
|
||||||
|
#
|
||||||
|
# ``RELEASE_NAME_VERSION``:
|
||||||
|
# Required, expects a string containing the name and version information to be
|
||||||
|
# added to the symbols in the format ``lib_name_1_2_3``.
|
||||||
|
#
|
||||||
|
# ``SYMBOLS``:
|
||||||
|
# Required, expects a target with the property ``LIST_FILE`` containing a path
|
||||||
|
# to a file containing the list of symbols to be added to the symbol version
|
||||||
|
# script.
|
||||||
|
#
|
||||||
|
# ``CURRENT_MAP``:
|
||||||
|
# Optional. If given, the new set of symbols will be checked against the
|
||||||
|
# ones contained in the ``cur_map`` file and updated properly. If an
|
||||||
|
# incompatible change is detected and ``BREAK_ABI`` is not defined, the build
|
||||||
|
# will fail.
|
||||||
|
#
|
||||||
|
# ``FINAL``:
|
||||||
|
# Optional. If given, will provide the ``--final`` option to ``abimap`` tool,
|
||||||
|
# which will mark the modified release in the symbol version script with a
|
||||||
|
# special comment, preventing later changes. This option should be set when
|
||||||
|
# creating a library release and the resulting map file should be stored with
|
||||||
|
# the source code.
|
||||||
|
#
|
||||||
|
# ``BREAK_ABI``:
|
||||||
|
# Optional. If provided, will use ``abimap`` ``--allow-abi-break`` option, which
|
||||||
|
# accepts incompatible changes to the set of symbols. This is necessary if any
|
||||||
|
# previously existing symbol were removed.
|
||||||
|
#
|
||||||
|
# ``COPY_TO``:
|
||||||
|
# Optional, expects a string containing the path to where the generated
|
||||||
|
# map file will be copied.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# .. code-block:: cmake
|
||||||
|
#
|
||||||
|
# find_package(ABIMap)
|
||||||
|
# generate_map_file("lib.map"
|
||||||
|
# RELEASE_NAME_VERSION "lib_1_0_0"
|
||||||
|
# SYMBOLS symbols
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# Where the target ``symbols`` has its property ``LIST_FILE`` set to the path to
|
||||||
|
# a file containing::
|
||||||
|
#
|
||||||
|
# ``symbol1``
|
||||||
|
# ``symbol2``
|
||||||
|
#
|
||||||
|
# This example would result in the symbol version script to be created in
|
||||||
|
# ``${CMAKE_CURRENT_BINARY_DIR}/lib.map`` containing the provided symbols.
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# get_files_list(target_name
|
||||||
|
# DIRECTORIES dir1 [dir2 ...]
|
||||||
|
# FILES_PATTERNS exp1 [exp2 ...]
|
||||||
|
# [COPY_TO output]
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# ``target_name``:
|
||||||
|
# Required, expects the name of the target to be created. A file named as
|
||||||
|
# ``${target_name}.list`` will be created in
|
||||||
|
# ``${CMAKE_CURRENT_BINARY_DIR}`` to receive the list of files found.
|
||||||
|
#
|
||||||
|
# ``DIRECTORIES``:
|
||||||
|
# Required, expects a list of directories paths. Only absolute paths are
|
||||||
|
# supported.
|
||||||
|
#
|
||||||
|
# ``FILES_PATTERN``:
|
||||||
|
# Required, expects a list of matching expressions to find the files to be
|
||||||
|
# considered in the directories.
|
||||||
|
#
|
||||||
|
# ``COPY_TO``:
|
||||||
|
# Optional, expects a string containing the path to where the file containing
|
||||||
|
# the list of files will be copied.
|
||||||
|
#
|
||||||
|
# This command searches the directories provided in ``DIRECTORIES`` for files
|
||||||
|
# matching any of the patterns provided in ``FILES_PATTERNS``. The obtained list
|
||||||
|
# is written to the path specified by ``output``. A target named ``target_name``
|
||||||
|
# will be created and its property ``LIST_FILE`` will be set to contain
|
||||||
|
# ``${CMAKE_CURRENT_BINARY_DIR}/${target_name}.list``
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# .. code-block:: cmake
|
||||||
|
#
|
||||||
|
# find_package(ABIMap)
|
||||||
|
# get_files_list(target
|
||||||
|
# DIRECTORIES "/include/mylib"
|
||||||
|
# FILES_PATTERNS "*.h"
|
||||||
|
# COPY_TO "my_list.txt"
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# Consider that ``/include/mylib`` contains 3 files, ``h1.h``, ``h2.h``, and
|
||||||
|
# ``h3.hpp``
|
||||||
|
#
|
||||||
|
# Will result in a file ``my_list.txt`` containing::
|
||||||
|
#
|
||||||
|
# ``h1.h;h2.h``
|
||||||
|
#
|
||||||
|
# And the target ``target`` will have its property ``LIST_FILE`` set to contain
|
||||||
|
# ``${CMAKE_CURRENT_BINARY_DIR}/target.list``
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# extract_symbols(target_name
|
||||||
|
# HEADERS_LIST headers_list_target
|
||||||
|
# [FILTER_PATTERN pattern]
|
||||||
|
# [COPY_TO output]
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# ``target_name``:
|
||||||
|
# Required, expects the name of the target to be created. A file named after
|
||||||
|
# the string given in ``target_name`` will be created in
|
||||||
|
# ``${CMAKE_CURRENT_BINARY_DIR}`` to receive the list of symbols.
|
||||||
|
#
|
||||||
|
# ``HEADERS_LIST``:
|
||||||
|
# Required, expects a target with the property ``LIST_FILE`` set, containing a
|
||||||
|
# file path. Such file must contain a list of files paths.
|
||||||
|
#
|
||||||
|
# ``FILTER_PATTERN``:
|
||||||
|
# Optional, expects a string. Only the lines containing the filter pattern
|
||||||
|
# will be considered.
|
||||||
|
#
|
||||||
|
# ``COPY_TO``:
|
||||||
|
# Optional, expects a string containing the path to where the file containing
|
||||||
|
# the found symbols will be copied.
|
||||||
|
#
|
||||||
|
# This command extracts the symbols from the files listed in
|
||||||
|
# ``headers_list`` and write them on the ``output`` file. If ``pattern``
|
||||||
|
# is provided, then only the lines containing the string given in ``pattern``
|
||||||
|
# will be considered. It is recommended to provide a ``FILTER_PATTERN`` to mark
|
||||||
|
# the lines containing exported function declaration, since this function is
|
||||||
|
# experimental and can return wrong symbols when parsing the header files. A
|
||||||
|
# target named ``target_name`` will be created with the property ``LIST_FILE``
|
||||||
|
# set to contain ``${CMAKE_CURRENT_BINARY_DIR}/${target_name}.list``.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# .. code-block:: cmake
|
||||||
|
#
|
||||||
|
# find_package(ABIMap)
|
||||||
|
# extract_symbols("lib.symbols"
|
||||||
|
# HEADERS_LIST "headers_target"
|
||||||
|
# FILTER_PATTERN "API_FUNCTION"
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# Where ``LIST_FILE`` property in ``headers_target`` points to a file
|
||||||
|
# containing::
|
||||||
|
#
|
||||||
|
# header1.h;header2.h
|
||||||
|
#
|
||||||
|
# Where ``header1.h`` contains::
|
||||||
|
#
|
||||||
|
# API_FUNCTION int exported_func1(int a, int b);
|
||||||
|
#
|
||||||
|
# ``header2.h`` contains::
|
||||||
|
#
|
||||||
|
# API_FUNCTION int exported_func2(int a);
|
||||||
|
#
|
||||||
|
# int private_func2(int b);
|
||||||
|
#
|
||||||
|
# Will result in a file ``lib.symbols.list`` in ``${CMAKE_CURRENT_BINARY_DIR}``
|
||||||
|
# containing::
|
||||||
|
#
|
||||||
|
# ``exported_func1``
|
||||||
|
# ``exported_func2``
|
||||||
|
#
|
||||||
|
|
||||||
|
# Search for python which is required
|
||||||
|
if (ABIMap_FIND_REQURIED)
|
||||||
|
find_package(PythonInterp REQUIRED)
|
||||||
|
else()
|
||||||
|
find_package(PythonInterp)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if (PYTHONINTERP_FOUND)
|
||||||
|
# Search for abimap tool used to generate the map files
|
||||||
|
find_program(ABIMAP_EXECUTABLE NAMES abimap DOC "path to the abimap executable")
|
||||||
|
mark_as_advanced(ABIMAP_EXECUTABLE)
|
||||||
|
|
||||||
|
if (NOT ABIMAP_EXECUTABLE AND UNIX)
|
||||||
|
message(STATUS "Could not find `abimap` in PATH."
|
||||||
|
" It can be found in PyPI as `abimap`"
|
||||||
|
" (try `pip install abimap`)")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (ABIMAP_EXECUTABLE)
|
||||||
|
# Get the abimap version
|
||||||
|
execute_process(COMMAND ${ABIMAP_EXECUTABLE} version
|
||||||
|
OUTPUT_VARIABLE ABIMAP_VERSION_STRING
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
|
||||||
|
# If the version string starts with abimap-, strip it
|
||||||
|
if ("abimap" STRLESS_EQUAL ${ABIMAP_VERSION_STRING})
|
||||||
|
string(REGEX REPLACE "abimap-" "" ABIMAP_VERSION_STRING "${ABIMAP_VERSION_STRING}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(ABIMap
|
||||||
|
REQUIRED_VARS ABIMAP_EXECUTABLE
|
||||||
|
VERSION_VAR ABIMAP_VERSION_STRING)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if (ABIMAP_FOUND)
|
||||||
|
|
||||||
|
# Define helper scripts
|
||||||
|
set(_EXTRACT_SYMBOLS_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/ExtractSymbols.cmake)
|
||||||
|
set(_GENERATE_MAP_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/GenerateMap.cmake)
|
||||||
|
set(_GET_FILES_LIST_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/GetFilesList.cmake)
|
||||||
|
|
||||||
|
function(get_file_list _TARGET_NAME)
|
||||||
|
|
||||||
|
set(one_value_arguments
|
||||||
|
COPY_TO
|
||||||
|
)
|
||||||
|
|
||||||
|
set(multi_value_arguments
|
||||||
|
DIRECTORIES
|
||||||
|
FILES_PATTERNS
|
||||||
|
)
|
||||||
|
|
||||||
|
cmake_parse_arguments(_get_files_list
|
||||||
|
""
|
||||||
|
"${one_value_arguments}"
|
||||||
|
"${multi_value_arguments}"
|
||||||
|
${ARGN}
|
||||||
|
)
|
||||||
|
|
||||||
|
# The DIRS argument is required
|
||||||
|
if (NOT DEFINED _get_files_list_DIRECTORIES)
|
||||||
|
message(FATAL_ERROR "No directories paths provided. Provide a list of"
|
||||||
|
" directories paths containing header files.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# The FILES_PATTERNS argument is required
|
||||||
|
if (NOT DEFINED _get_files_list_FILES_PATTERNS)
|
||||||
|
message(FATAL_ERROR "No matching expressions provided. Provide a list"
|
||||||
|
" of matching patterns for the header files.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_FILES_LIST_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}.list)
|
||||||
|
|
||||||
|
get_filename_component(_get_files_list_OUTPUT_PATH
|
||||||
|
"${_FILES_LIST_OUTPUT_PATH}"
|
||||||
|
ABSOLUTE)
|
||||||
|
|
||||||
|
add_custom_target(
|
||||||
|
${_TARGET_NAME}_int ALL
|
||||||
|
COMMAND ${CMAKE_COMMAND}
|
||||||
|
-DOUTPUT_PATH="${_get_files_list_OUTPUT_PATH}"
|
||||||
|
-DDIRECTORIES="${_get_files_list_DIRECTORIES}"
|
||||||
|
-DFILES_PATTERNS="${_get_files_list_FILES_PATTERNS}"
|
||||||
|
-P ${_GET_FILES_LIST_SCRIPT}
|
||||||
|
COMMENT
|
||||||
|
"Searching for files"
|
||||||
|
)
|
||||||
|
|
||||||
|
if (DEFINED _get_files_list_COPY_TO)
|
||||||
|
# Copy the generated file back to the COPY_TO
|
||||||
|
add_custom_target(${_TARGET_NAME} ALL
|
||||||
|
COMMAND
|
||||||
|
${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
${_FILES_LIST_OUTPUT_PATH} ${_get_files_list_COPY_TO}
|
||||||
|
DEPENDS ${_TARGET_NAME}_int
|
||||||
|
COMMENT "Copying ${_TARGET_NAME} to ${_get_files_list_COPY_TO}"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
add_custom_target(${_TARGET_NAME} ALL
|
||||||
|
DEPENDS ${_TARGET_NAME}_int
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_target_properties(${_TARGET_NAME}
|
||||||
|
PROPERTIES LIST_FILE ${_FILES_LIST_OUTPUT_PATH}
|
||||||
|
)
|
||||||
|
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(extract_symbols _TARGET_NAME)
|
||||||
|
|
||||||
|
set(one_value_arguments
|
||||||
|
FILTER_PATTERN
|
||||||
|
HEADERS_LIST
|
||||||
|
COPY_TO
|
||||||
|
)
|
||||||
|
|
||||||
|
set(multi_value_arguments
|
||||||
|
)
|
||||||
|
|
||||||
|
cmake_parse_arguments(_extract_symbols
|
||||||
|
""
|
||||||
|
"${one_value_arguments}"
|
||||||
|
"${multi_value_arguments}"
|
||||||
|
${ARGN}
|
||||||
|
)
|
||||||
|
|
||||||
|
# The HEADERS_LIST_FILE argument is required
|
||||||
|
if (NOT DEFINED _extract_symbols_HEADERS_LIST)
|
||||||
|
message(FATAL_ERROR "No target provided in HEADERS_LIST. Provide a"
|
||||||
|
" target with the property LIST_FILE set as the"
|
||||||
|
" path to the file containing the list of headers.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_filename_component(_SYMBOLS_OUTPUT_PATH
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}.list"
|
||||||
|
ABSOLUTE
|
||||||
|
)
|
||||||
|
|
||||||
|
get_target_property(_HEADERS_LIST_FILE
|
||||||
|
${_extract_symbols_HEADERS_LIST}
|
||||||
|
LIST_FILE
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(
|
||||||
|
${_TARGET_NAME}_int ALL
|
||||||
|
COMMAND ${CMAKE_COMMAND}
|
||||||
|
-DOUTPUT_PATH="${_SYMBOLS_OUTPUT_PATH}"
|
||||||
|
-DHEADERS_LIST_FILE="${_HEADERS_LIST_FILE}"
|
||||||
|
-DFILTER_PATTERN=${_extract_symbols_FILTER_PATTERN}
|
||||||
|
-P ${_EXTRACT_SYMBOLS_SCRIPT}
|
||||||
|
DEPENDS ${_extract_symbols_HEADERS_LIST}
|
||||||
|
COMMENT "Extracting symbols from headers"
|
||||||
|
)
|
||||||
|
|
||||||
|
if (DEFINED _extract_symbols_COPY_TO)
|
||||||
|
# Copy the generated file back to the COPY_TO
|
||||||
|
add_custom_target(${_TARGET_NAME} ALL
|
||||||
|
COMMAND
|
||||||
|
${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
${_SYMBOLS_OUTPUT_PATH} ${_extract_symbols_COPY_TO}
|
||||||
|
DEPENDS ${_TARGET_NAME}_int
|
||||||
|
COMMENT "Copying ${_TARGET_NAME} to ${_extract_symbols_COPY_TO}"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
add_custom_target(${_TARGET_NAME} ALL
|
||||||
|
DEPENDS ${_TARGET_NAME}_int
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_target_properties(${_TARGET_NAME}
|
||||||
|
PROPERTIES LIST_FILE ${_SYMBOLS_OUTPUT_PATH}
|
||||||
|
)
|
||||||
|
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(generate_map_file _TARGET_NAME)
|
||||||
|
|
||||||
|
set(options
|
||||||
|
FINAL
|
||||||
|
BREAK_ABI
|
||||||
|
)
|
||||||
|
|
||||||
|
set(one_value_arguments
|
||||||
|
RELEASE_NAME_VERSION
|
||||||
|
SYMBOLS
|
||||||
|
CURRENT_MAP
|
||||||
|
COPY_TO
|
||||||
|
)
|
||||||
|
|
||||||
|
set(multi_value_arguments
|
||||||
|
)
|
||||||
|
|
||||||
|
cmake_parse_arguments(_generate_map_file
|
||||||
|
"${options}"
|
||||||
|
"${one_value_arguments}"
|
||||||
|
"${multi_value_arguments}"
|
||||||
|
${ARGN}
|
||||||
|
)
|
||||||
|
|
||||||
|
if (NOT DEFINED _generate_map_file_SYMBOLS)
|
||||||
|
message(FATAL_ERROR "No target provided in SYMBOLS. Provide a target"
|
||||||
|
" with the property LIST_FILE set as the path to"
|
||||||
|
" the file containing the list of symbols.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT DEFINED _generate_map_file_RELEASE_NAME_VERSION)
|
||||||
|
message(FATAL_ERROR "Release name and version not provided."
|
||||||
|
" (e.g. libname_1_0_0)")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
get_target_property(_SYMBOLS_FILE
|
||||||
|
${_generate_map_file_SYMBOLS}
|
||||||
|
LIST_FILE
|
||||||
|
)
|
||||||
|
|
||||||
|
# Set generated map file path
|
||||||
|
get_filename_component(_MAP_OUTPUT_PATH
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}"
|
||||||
|
ABSOLUTE
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(
|
||||||
|
${_TARGET_NAME}_int ALL
|
||||||
|
COMMAND ${CMAKE_COMMAND}
|
||||||
|
-DABIMAP_EXECUTABLE=${ABIMAP_EXECUTABLE}
|
||||||
|
-DSYMBOLS="${_SYMBOLS_FILE}"
|
||||||
|
-DCURRENT_MAP=${_generate_map_file_CURRENT_MAP}
|
||||||
|
-DOUTPUT_PATH="${_MAP_OUTPUT_PATH}"
|
||||||
|
-DFINAL=${_generate_map_file_FINAL}
|
||||||
|
-DBREAK_ABI=${_generate_map_file_BREAK_ABI}
|
||||||
|
-DRELEASE_NAME_VERSION=${_generate_map_file_RELEASE_NAME_VERSION}
|
||||||
|
-P ${_GENERATE_MAP_SCRIPT}
|
||||||
|
DEPENDS ${_generate_map_file_SYMBOLS}
|
||||||
|
COMMENT "Generating the map ${_TARGET_NAME}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add a custom command setting the map as OUTPUT to allow it to be added as
|
||||||
|
# a generated source
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${_MAP_OUTPUT_PATH}
|
||||||
|
DEPENDS ${_TARGET_NAME}
|
||||||
|
)
|
||||||
|
|
||||||
|
if (DEFINED _generate_map_file_COPY_TO)
|
||||||
|
# Copy the generated map back to the COPY_TO
|
||||||
|
add_custom_target(${_TARGET_NAME} ALL
|
||||||
|
COMMAND
|
||||||
|
${CMAKE_COMMAND} -E copy_if_different ${_MAP_OUTPUT_PATH}
|
||||||
|
${_generate_map_file_COPY_TO}
|
||||||
|
DEPENDS ${_TARGET_NAME}_int
|
||||||
|
COMMENT "Copying ${_MAP_OUTPUT_PATH} to ${_generate_map_file_COPY_TO}"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
add_custom_target(${_TARGET_NAME} ALL
|
||||||
|
DEPENDS ${_TARGET_NAME}_int
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
endif (ABIMAP_FOUND)
|
||||||
@@ -1,60 +1,66 @@
|
|||||||
# - Try to find Argp
|
# - Try to find ARGP
|
||||||
# Once done this will define
|
# Once done this will define
|
||||||
#
|
#
|
||||||
# ARGP_FOUND - system has Argp
|
# ARGP_ROOT_DIR - Set this variable to the root installation of ARGP
|
||||||
# ARGP_INCLUDE_DIRS - the Argp include directory
|
|
||||||
# ARGP_LIBRARIES - Link these to use Argp
|
|
||||||
# ARGP_DEFINITIONS - Compiler switches required for using Argp
|
|
||||||
#
|
#
|
||||||
# Copyright (c) 2010 Andreas Schneider <asn@cryptomilk.org>
|
# Read-Only variables:
|
||||||
|
# ARGP_FOUND - system has ARGP
|
||||||
|
# ARGP_INCLUDE_DIR - the ARGP include directory
|
||||||
|
# ARGP_LIBRARIES - Link these to use ARGP
|
||||||
|
# ARGP_DEFINITIONS - Compiler switches required for using ARGP
|
||||||
#
|
#
|
||||||
# Redistribution and use is allowed according to the terms of the New
|
#=============================================================================
|
||||||
# BSD license.
|
# Copyright (c) 2011-2016 Andreas Schneider <asn@cryptomilk.org>
|
||||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
#
|
||||||
|
# Distributed under the OSI-approved BSD License (the "License");
|
||||||
|
# see accompanying file Copyright.txt for details.
|
||||||
|
#
|
||||||
|
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||||
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
# See the License for more information.
|
||||||
|
#=============================================================================
|
||||||
#
|
#
|
||||||
|
|
||||||
|
set(_ARGP_ROOT_HINTS
|
||||||
|
)
|
||||||
|
|
||||||
if (ARGP_LIBRARIES AND ARGP_INCLUDE_DIRS)
|
set(_ARGP_ROOT_PATHS
|
||||||
# in cache already
|
"$ENV{PROGRAMFILES}/argp"
|
||||||
set(ARGP_FOUND TRUE)
|
)
|
||||||
else (ARGP_LIBRARIES AND ARGP_INCLUDE_DIRS)
|
|
||||||
|
|
||||||
find_path(ARGP_INCLUDE_DIR
|
find_path(ARGP_ROOT_DIR
|
||||||
NAMES
|
NAMES
|
||||||
argp.h
|
include/argp.h
|
||||||
|
HINTS
|
||||||
|
${_ARGP_ROOT_HINTS}
|
||||||
PATHS
|
PATHS
|
||||||
/usr/include
|
${_ARGP_ROOT_PATHS}
|
||||||
/usr/local/include
|
)
|
||||||
/opt/local/include
|
mark_as_advanced(ARGP_ROOT_DIR)
|
||||||
/sw/include
|
|
||||||
)
|
|
||||||
|
|
||||||
find_library(ARGP_LIBRARY
|
find_path(ARGP_INCLUDE_DIR
|
||||||
NAMES
|
NAMES
|
||||||
argp
|
argp.h
|
||||||
PATHS
|
PATHS
|
||||||
/usr/lib
|
${ARGP_ROOT_DIR}/include
|
||||||
/usr/local/lib
|
)
|
||||||
/opt/local/lib
|
|
||||||
/sw/lib
|
find_library(ARGP_LIBRARY
|
||||||
|
NAMES
|
||||||
|
argp
|
||||||
|
PATHS
|
||||||
|
${ARGP_ROOT_DIR}/lib
|
||||||
|
)
|
||||||
|
|
||||||
|
if (ARGP_LIBRARY)
|
||||||
|
set(ARGP_LIBRARIES
|
||||||
|
${ARGP_LIBRARIES}
|
||||||
|
${ARGP_LIBRARY}
|
||||||
)
|
)
|
||||||
|
endif (ARGP_LIBRARY)
|
||||||
|
|
||||||
set(ARGP_INCLUDE_DIRS
|
include(FindPackageHandleStandardArgs)
|
||||||
${ARGP_INCLUDE_DIR}
|
find_package_handle_standard_args(ARGP DEFAULT_MSG ARGP_LIBRARIES ARGP_INCLUDE_DIR)
|
||||||
)
|
|
||||||
|
|
||||||
if (ARGP_LIBRARY)
|
|
||||||
set(ARGP_LIBRARIES
|
|
||||||
${ARGP_LIBRARIES}
|
|
||||||
${ARGP_LIBRARY}
|
|
||||||
)
|
|
||||||
endif (ARGP_LIBRARY)
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
find_package_handle_standard_args(Argp DEFAULT_MSG ARGP_LIBRARIES ARGP_INCLUDE_DIRS)
|
|
||||||
|
|
||||||
# show the ARGP_INCLUDE_DIRS and ARGP_LIBRARIES variables only in the advanced view
|
|
||||||
mark_as_advanced(ARGP_INCLUDE_DIRS ARGP_LIBRARIES)
|
|
||||||
|
|
||||||
endif (ARGP_LIBRARIES AND ARGP_INCLUDE_DIRS)
|
|
||||||
|
|
||||||
|
# show the ARGP_INCLUDE_DIR and ARGP_LIBRARIES variables only in the advanced view
|
||||||
|
mark_as_advanced(ARGP_INCLUDE_DIR ARGP_LIBRARIES)
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ find_path(GCRYPT_INCLUDE_DIR
|
|||||||
gcrypt.h
|
gcrypt.h
|
||||||
HINTS
|
HINTS
|
||||||
${_GCRYPT_ROOT_HINTS_AND_PATHS}
|
${_GCRYPT_ROOT_HINTS_AND_PATHS}
|
||||||
|
PATH_SUFFIXES
|
||||||
|
include
|
||||||
)
|
)
|
||||||
|
|
||||||
find_library(GCRYPT_LIBRARY
|
find_library(GCRYPT_LIBRARY
|
||||||
@@ -44,13 +46,15 @@ find_library(GCRYPT_LIBRARY
|
|||||||
libgcrypt-11
|
libgcrypt-11
|
||||||
HINTS
|
HINTS
|
||||||
${_GCRYPT_ROOT_HINTS_AND_PATHS}
|
${_GCRYPT_ROOT_HINTS_AND_PATHS}
|
||||||
|
PATH_SUFFIXES
|
||||||
|
lib
|
||||||
)
|
)
|
||||||
set(GCRYPT_LIBRARIES ${GCRYPT_LIBRARY})
|
set(GCRYPT_LIBRARIES ${GCRYPT_LIBRARY})
|
||||||
|
|
||||||
if (GCRYPT_INCLUDE_DIR)
|
if (GCRYPT_INCLUDE_DIR)
|
||||||
file(STRINGS "${GCRYPT_INCLUDE_DIR}/gcrypt.h" _gcrypt_version_str REGEX "^#define GCRYPT_VERSION \"[0-9]+.[0-9]+.[0-9]+\"")
|
file(STRINGS "${GCRYPT_INCLUDE_DIR}/gcrypt.h" _gcrypt_version_str REGEX "^#define GCRYPT_VERSION \"[0-9]+\\.[0-9]+\\.[0-9]")
|
||||||
|
|
||||||
string(REGEX REPLACE "^.*GCRYPT_VERSION.*([0-9]+.[0-9]+.[0-9]+).*" "\\1" GCRYPT_VERSION "${_gcrypt_version_str}")
|
string(REGEX REPLACE "^.*GCRYPT_VERSION.*([0-9]+\\.[0-9]+\\.[0-9]+).*" "\\1" GCRYPT_VERSION "${_gcrypt_version_str}")
|
||||||
endif (GCRYPT_INCLUDE_DIR)
|
endif (GCRYPT_INCLUDE_DIR)
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|||||||
@@ -54,7 +54,8 @@ if (UNIX)
|
|||||||
OUTPUT_VARIABLE
|
OUTPUT_VARIABLE
|
||||||
_GSSAPI_VENDOR_STRING)
|
_GSSAPI_VENDOR_STRING)
|
||||||
|
|
||||||
if (_GSSAPI_VENDOR_STRING MATCHES ".*Massachusetts.*")
|
if ((_GSSAPI_VENDOR_STRING MATCHES ".*Massachusetts.*") OR (_GSSAPI_VENDOR_STRING
|
||||||
|
MATCHES ".*MITKerberosShim.*"))
|
||||||
set(GSSAPI_FLAVOR_MIT TRUE)
|
set(GSSAPI_FLAVOR_MIT TRUE)
|
||||||
else()
|
else()
|
||||||
execute_process(
|
execute_process(
|
||||||
|
|||||||
104
cmake/Modules/FindMbedTLS.cmake
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
# - Try to find mbedTLS
|
||||||
|
# Once done this will define
|
||||||
|
#
|
||||||
|
# MBEDTLS_FOUND - system has mbedTLS
|
||||||
|
# MBEDTLS_INCLUDE_DIRS - the mbedTLS include directory
|
||||||
|
# MBEDTLS_LIBRARIES - Link these to use mbedTLS
|
||||||
|
# MBEDTLS_DEFINITIONS - Compiler switches required for using mbedTLS
|
||||||
|
#=============================================================================
|
||||||
|
# Copyright (c) 2017 Sartura d.o.o.
|
||||||
|
#
|
||||||
|
# Author: Juraj Vijtiuk <juraj.vijtiuk@sartura.hr>
|
||||||
|
#
|
||||||
|
# Distributed under the OSI-approved BSD License (the "License");
|
||||||
|
# see accompanying file Copyright.txt for details.
|
||||||
|
#
|
||||||
|
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||||
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
# See the License for more information.
|
||||||
|
#=============================================================================
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
set(_MBEDTLS_ROOT_HINTS
|
||||||
|
$ENV{MBEDTLS_ROOT_DIR}
|
||||||
|
${MBEDTLS_ROOT_DIR})
|
||||||
|
|
||||||
|
set(_MBEDTLS_ROOT_PATHS
|
||||||
|
"$ENV{PROGRAMFILES}/libmbedtls")
|
||||||
|
|
||||||
|
set(_MBEDTLS_ROOT_HINTS_AND_PATHS
|
||||||
|
HINTS ${_MBEDTLS_ROOT_HINTS}
|
||||||
|
PATHS ${_MBEDTLS_ROOT_PATHS})
|
||||||
|
|
||||||
|
|
||||||
|
find_path(MBEDTLS_INCLUDE_DIR
|
||||||
|
NAMES
|
||||||
|
mbedtls/config.h
|
||||||
|
HINTS
|
||||||
|
${_MBEDTLS_ROOT_HINTS_AND_PATHS}
|
||||||
|
PATH_SUFFIXES
|
||||||
|
include
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(MBEDTLS_SSL_LIBRARY
|
||||||
|
NAMES
|
||||||
|
mbedtls
|
||||||
|
HINTS
|
||||||
|
${_MBEDTLS_ROOT_HINTS_AND_PATHS}
|
||||||
|
PATH_SUFFIXES
|
||||||
|
lib
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(MBEDTLS_CRYPTO_LIBRARY
|
||||||
|
NAMES
|
||||||
|
mbedcrypto
|
||||||
|
HINTS
|
||||||
|
${_MBEDTLS_ROOT_HINTS_AND_PATHS}
|
||||||
|
PATH_SUFFIXES
|
||||||
|
lib
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(MBEDTLS_X509_LIBRARY
|
||||||
|
NAMES
|
||||||
|
mbedx509
|
||||||
|
HINTS
|
||||||
|
${_MBEDTLS_ROOT_HINTS_AND_PATHS}
|
||||||
|
PATH_SUFFIXES
|
||||||
|
lib
|
||||||
|
)
|
||||||
|
|
||||||
|
set(MBEDTLS_LIBRARIES ${MBEDTLS_SSL_LIBRARY} ${MBEDTLS_CRYPTO_LIBRARY}
|
||||||
|
${MBEDTLS_X509_LIBRARY})
|
||||||
|
|
||||||
|
if (MBEDTLS_INCLUDE_DIR AND EXISTS "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h")
|
||||||
|
file(STRINGS "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h" _mbedtls_version_str REGEX
|
||||||
|
"^#[\t ]*define[\t ]+MBEDTLS_VERSION_STRING[\t ]+\"[0-9]+.[0-9]+.[0-9]+\"")
|
||||||
|
|
||||||
|
string(REGEX REPLACE "^.*MBEDTLS_VERSION_STRING.*([0-9]+.[0-9]+.[0-9]+).*"
|
||||||
|
"\\1" MBEDTLS_VERSION "${_mbedtls_version_str}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
if (MBEDTLS_VERSION)
|
||||||
|
find_package_handle_standard_args(MbedTLS
|
||||||
|
REQUIRED_VARS
|
||||||
|
MBEDTLS_INCLUDE_DIR
|
||||||
|
MBEDTLS_LIBRARIES
|
||||||
|
VERSION_VAR
|
||||||
|
MBEDTLS_VERSION
|
||||||
|
FAIL_MESSAGE
|
||||||
|
"Could NOT find mbedTLS, try to set the path to mbedTLS root folder
|
||||||
|
in the system variable MBEDTLS_ROOT_DIR"
|
||||||
|
)
|
||||||
|
else (MBEDTLS_VERSION)
|
||||||
|
find_package_handle_standard_args(MBedTLS
|
||||||
|
"Could NOT find mbedTLS, try to set the path to mbedLS root folder in
|
||||||
|
the system variable MBEDTLS_ROOT_DIR"
|
||||||
|
MBEDTLS_INCLUDE_DIR
|
||||||
|
MBEDTLS_LIBRARIES)
|
||||||
|
endif (MBEDTLS_VERSION)
|
||||||
|
|
||||||
|
# show the MBEDTLS_INCLUDE_DIRS and MBEDTLS_LIBRARIES variables only in the advanced view
|
||||||
|
mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARIES)
|
||||||
@@ -21,17 +21,16 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(_NSIS_ROOT_HINTS
|
set(_x86 "(x86)")
|
||||||
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\NSIS;Default]")
|
|
||||||
|
|
||||||
set(_NSIS_ROOT_PATHS
|
set(_NSIS_ROOT_PATHS
|
||||||
$ENV{PROGRAMFILES}/NSIS)
|
"$ENV{ProgramFiles}/NSIS"
|
||||||
|
"$ENV{ProgramFiles${_x86}}/NSIS"
|
||||||
|
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\NSIS;Default]")
|
||||||
|
|
||||||
find_path(NSIS_ROOT_PATH
|
find_path(NSIS_ROOT_PATH
|
||||||
NAMES
|
NAMES
|
||||||
Include/Library.nsh
|
Include/Library.nsh
|
||||||
HINTS
|
|
||||||
${_NSIS_ROOT_HINTS}
|
|
||||||
PATHS
|
PATHS
|
||||||
${_NSIS_ROOT_PATHS}
|
${_NSIS_ROOT_PATHS}
|
||||||
)
|
)
|
||||||
|
|||||||
118
cmake/Modules/GenerateMap.cmake
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2018 Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
|
||||||
|
#
|
||||||
|
# Redistribution and use is allowed according to the terms of the New
|
||||||
|
# BSD license.
|
||||||
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
|
#
|
||||||
|
|
||||||
|
#.rst:
|
||||||
|
# GenerateMap
|
||||||
|
# -----------
|
||||||
|
#
|
||||||
|
# This is a helper script for FindABImap.cmake.
|
||||||
|
#
|
||||||
|
# Generates a symbols version script using the abimap tool.
|
||||||
|
# This script is run in build time to use the correct command depending on the
|
||||||
|
# existence of the file provided ``CURRENT_MAP``.
|
||||||
|
#
|
||||||
|
# If the file exists, the ``abimap update`` subcommand is used to update the
|
||||||
|
# existing map. Otherwise, the ``abimap new`` subcommand is used to create a new
|
||||||
|
# map file.
|
||||||
|
#
|
||||||
|
# If the file provided in ``CURRENT_MAP`` exists, it is copied to the
|
||||||
|
# ``OUTPUT_PATH`` before updating.
|
||||||
|
# This is required because ``abimap`` do not generate output if no symbols were
|
||||||
|
# changed when updating an existing file.
|
||||||
|
#
|
||||||
|
# Expected defined variables
|
||||||
|
# --------------------------
|
||||||
|
#
|
||||||
|
# ``SYMBOLS``:
|
||||||
|
# Required file containing the symbols to be used as input. Usually this is
|
||||||
|
# the ``OUTPUT`` generated by ``extract_symbols()`` function provided in
|
||||||
|
# FindABImap.cmake
|
||||||
|
#
|
||||||
|
# ``RELEASE_NAME_VERSION``:
|
||||||
|
# Required, expects the library name and version information to be added to
|
||||||
|
# the symbols in the format ``library_name_1_2_3``
|
||||||
|
#
|
||||||
|
# ``CURRENT_MAP``:
|
||||||
|
# Required, expects the path to the current map file (or the path were it
|
||||||
|
# should be)
|
||||||
|
#
|
||||||
|
# ``OUTPUT_PATH``:
|
||||||
|
# Required, expects the output file path.
|
||||||
|
#
|
||||||
|
# ``ABIMAP_EXECUTABLE``:
|
||||||
|
# Required, expects the path to the ``abimap`` tool.
|
||||||
|
#
|
||||||
|
# Optionally defined variables
|
||||||
|
# ----------------------------
|
||||||
|
#
|
||||||
|
# ``FINAL``:
|
||||||
|
# If defined, will mark the modified set of symbols in the symbol version
|
||||||
|
# script as final, preventing later changes using ``abimap``.
|
||||||
|
#
|
||||||
|
# ``BREAK_ABI``:
|
||||||
|
# If defined, the build will not fail if symbols were removed.
|
||||||
|
# If defined and a symbol is removed, a new release is created containing
|
||||||
|
# all symbols from all released versions. This makes an incompatible release.
|
||||||
|
#
|
||||||
|
|
||||||
|
if (NOT DEFINED RELEASE_NAME_VERSION)
|
||||||
|
message(SEND_ERROR "RELEASE_NAME_VERSION not defined")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT DEFINED SYMBOLS)
|
||||||
|
message(SEND_ERROR "SYMBOLS not defined")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT DEFINED CURRENT_MAP)
|
||||||
|
message(SEND_ERROR "CURRENT_MAP not defined")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT DEFINED OUTPUT_PATH)
|
||||||
|
message(SEND_ERROR "OUTPUT_PATH not defined")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT ABIMAP_EXECUTABLE)
|
||||||
|
message(SEND_ERROR "ABIMAP_EXECUTABLE not defined")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(ARGS_LIST)
|
||||||
|
|
||||||
|
if (FINAL)
|
||||||
|
list(APPEND ARGS_LIST "--final")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (EXISTS ${CURRENT_MAP})
|
||||||
|
if (BREAK_ABI)
|
||||||
|
list(APPEND ARGS_LIST "--allow-abi-break")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND
|
||||||
|
${CMAKE_COMMAND} -E copy_if_different ${CURRENT_MAP} ${OUTPUT_PATH}
|
||||||
|
COMMAND
|
||||||
|
${ABIMAP_EXECUTABLE} update ${ARGS_LIST}
|
||||||
|
-r ${RELEASE_NAME_VERSION}
|
||||||
|
-i ${SYMBOLS}
|
||||||
|
-o ${OUTPUT_PATH}
|
||||||
|
${CURRENT_MAP}
|
||||||
|
RESULT_VARIABLE result
|
||||||
|
)
|
||||||
|
else ()
|
||||||
|
execute_process(
|
||||||
|
COMMAND
|
||||||
|
${ABIMAP_EXECUTABLE} new ${ARGS_LIST}
|
||||||
|
-r ${RELEASE_NAME_VERSION}
|
||||||
|
-i ${SYMBOLS}
|
||||||
|
-o ${OUTPUT_PATH}
|
||||||
|
RESULT_VARIABLE result
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT "${result}" STREQUAL "0")
|
||||||
|
message(SEND_ERROR "Map generation failed")
|
||||||
|
endif()
|
||||||
59
cmake/Modules/GetFilesList.cmake
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2018 Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
|
||||||
|
#
|
||||||
|
# Redistribution and use is allowed according to the terms of the New
|
||||||
|
# BSD license.
|
||||||
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
|
#
|
||||||
|
|
||||||
|
#.rst:
|
||||||
|
# GetFilesList
|
||||||
|
# ------------
|
||||||
|
#
|
||||||
|
# This is a helper script for FindABImap.cmake.
|
||||||
|
#
|
||||||
|
# Search in the provided directories for files matching the provided pattern.
|
||||||
|
# The list of files is then written to the output file.
|
||||||
|
#
|
||||||
|
# Expected defined variables
|
||||||
|
# --------------------------
|
||||||
|
#
|
||||||
|
# ``DIRECTORIES``:
|
||||||
|
# Required, expects a list of directories paths.
|
||||||
|
#
|
||||||
|
# ``FILES_PATTERNS``:
|
||||||
|
# Required, expects a list of patterns to be used to search files
|
||||||
|
#
|
||||||
|
# ``OUTPUT_PATH``:
|
||||||
|
# Required, expects the output file path.
|
||||||
|
|
||||||
|
if (NOT DEFINED DIRECTORIES)
|
||||||
|
message(SEND_ERROR "DIRECTORIES not defined")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT DEFINED FILES_PATTERNS)
|
||||||
|
message(SEND_ERROR "FILES_PATTERNS not defined")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT DEFINED OUTPUT_PATH)
|
||||||
|
message(SEND_ERROR "OUTPUT_PATH not defined")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(REPLACE " " ";" DIRECTORIES_LIST "${DIRECTORIES}")
|
||||||
|
string(REPLACE " " ";" FILES_PATTERNS_LIST "${FILES_PATTERNS}")
|
||||||
|
|
||||||
|
# Create the list of expressions for the files
|
||||||
|
set(glob_expressions)
|
||||||
|
foreach(dir ${DIRECTORIES_LIST})
|
||||||
|
foreach(exp ${FILES_PATTERNS_LIST})
|
||||||
|
list(APPEND glob_expressions
|
||||||
|
"${dir}/${exp}"
|
||||||
|
)
|
||||||
|
endforeach()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Create the list of files
|
||||||
|
file(GLOB files ${glob_expressions})
|
||||||
|
|
||||||
|
# Write to the output
|
||||||
|
file(WRITE ${OUTPUT_PATH} "${files}")
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
# - Run Doxygen
|
|
||||||
#
|
|
||||||
# Adds a doxygen target that runs doxygen to generate the html
|
|
||||||
# and optionally the LaTeX API documentation.
|
|
||||||
# The doxygen target is added to the doc target as a dependency.
|
|
||||||
# i.e.: the API documentation is built with:
|
|
||||||
# make doc
|
|
||||||
#
|
|
||||||
# USAGE: GLOBAL INSTALL
|
|
||||||
#
|
|
||||||
# Install it with:
|
|
||||||
# cmake ./ && sudo make install
|
|
||||||
# Add the following to the CMakeLists.txt of your project:
|
|
||||||
# include(UseDoxygen OPTIONAL)
|
|
||||||
# Optionally copy Doxyfile.in in the directory of CMakeLists.txt and edit it.
|
|
||||||
#
|
|
||||||
# USAGE: INCLUDE IN PROJECT
|
|
||||||
#
|
|
||||||
# set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
# include(UseDoxygen)
|
|
||||||
# Add the Doxyfile.in and UseDoxygen.cmake files to the projects source directory.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# CONFIGURATION
|
|
||||||
#
|
|
||||||
# To configure Doxygen you can edit Doxyfile.in and set some variables in cmake.
|
|
||||||
# Variables you may define are:
|
|
||||||
# DOXYFILE_SOURCE_DIR - Path where the Doxygen input files are.
|
|
||||||
# Defaults to the current source directory.
|
|
||||||
# DOXYFILE_EXTRA_SOURCES - Additional source diretories/files for Doxygen to scan.
|
|
||||||
# The Paths should be in double quotes and separated by space. e.g.:
|
|
||||||
# "${CMAKE_CURRENT_BINARY_DIR}/foo.c" "${CMAKE_CURRENT_BINARY_DIR}/bar/"
|
|
||||||
#
|
|
||||||
# DOXYFILE_OUTPUT_DIR - Path where the Doxygen output is stored.
|
|
||||||
# Defaults to "${CMAKE_CURRENT_BINARY_DIR}/doc".
|
|
||||||
#
|
|
||||||
# DOXYFILE_LATEX - ON/OFF; Set to "ON" if you want the LaTeX documentation
|
|
||||||
# to be built.
|
|
||||||
# DOXYFILE_LATEX_DIR - Directory relative to DOXYFILE_OUTPUT_DIR where
|
|
||||||
# the Doxygen LaTeX output is stored. Defaults to "latex".
|
|
||||||
#
|
|
||||||
# DOXYFILE_HTML_DIR - Directory relative to DOXYFILE_OUTPUT_DIR where
|
|
||||||
# the Doxygen html output is stored. Defaults to "html".
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Copyright (c) 2009, 2010, 2011 Tobias Rautenkranz <tobias@rautenkranz.ch>
|
|
||||||
#
|
|
||||||
# Redistribution and use is allowed according to the terms of the New
|
|
||||||
# BSD license.
|
|
||||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
|
||||||
#
|
|
||||||
|
|
||||||
macro(usedoxygen_set_default name value type docstring)
|
|
||||||
if(NOT DEFINED "${name}")
|
|
||||||
set("${name}" "${value}" CACHE "${type}" "${docstring}")
|
|
||||||
endif()
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
find_package(Doxygen)
|
|
||||||
|
|
||||||
if(DOXYGEN_FOUND)
|
|
||||||
find_file(DOXYFILE_IN "Doxyfile.in"
|
|
||||||
PATHS "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_ROOT}/Modules/"
|
|
||||||
NO_DEFAULT_PATH
|
|
||||||
DOC "Path to the doxygen configuration template file")
|
|
||||||
set(DOXYFILE "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile")
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
find_package_handle_standard_args(DOXYFILE_IN DEFAULT_MSG "DOXYFILE_IN")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(DOXYGEN_FOUND AND DOXYFILE_IN_FOUND)
|
|
||||||
usedoxygen_set_default(DOXYFILE_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/doc"
|
|
||||||
PATH "Doxygen output directory")
|
|
||||||
usedoxygen_set_default(DOXYFILE_HTML_DIR "html"
|
|
||||||
STRING "Doxygen HTML output directory")
|
|
||||||
usedoxygen_set_default(DOXYFILE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
||||||
PATH "Input files source directory")
|
|
||||||
usedoxygen_set_default(DOXYFILE_EXTRA_SOURCE_DIRS ""
|
|
||||||
STRING "Additional source files/directories separated by space")
|
|
||||||
set(DOXYFILE_SOURCE_DIRS "\"${DOXYFILE_SOURCE_DIR}\" ${DOXYFILE_EXTRA_SOURCES}")
|
|
||||||
|
|
||||||
usedoxygen_set_default(DOXYFILE_LATEX YES BOOL "Generate LaTeX API documentation" OFF)
|
|
||||||
usedoxygen_set_default(DOXYFILE_LATEX_DIR "latex" STRING "LaTex output directory")
|
|
||||||
|
|
||||||
mark_as_advanced(DOXYFILE_OUTPUT_DIR DOXYFILE_HTML_DIR DOXYFILE_LATEX_DIR
|
|
||||||
DOXYFILE_SOURCE_DIR DOXYFILE_EXTRA_SOURCE_DIRS DOXYFILE_IN)
|
|
||||||
|
|
||||||
|
|
||||||
set_property(DIRECTORY
|
|
||||||
APPEND PROPERTY
|
|
||||||
ADDITIONAL_MAKE_CLEAN_FILES
|
|
||||||
"${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_HTML_DIR}")
|
|
||||||
|
|
||||||
add_custom_target(doxygen
|
|
||||||
COMMAND "${DOXYGEN_EXECUTABLE}"
|
|
||||||
"${DOXYFILE}"
|
|
||||||
COMMENT "Writing documentation to ${DOXYFILE_OUTPUT_DIR}..."
|
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
||||||
|
|
||||||
set(DOXYFILE_DOT "NO")
|
|
||||||
if(DOXYGEN_DOT_EXECUTABLE)
|
|
||||||
set(DOXYFILE_DOT "YES")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
## LaTeX
|
|
||||||
set(DOXYFILE_PDFLATEX "NO")
|
|
||||||
|
|
||||||
set_property(DIRECTORY APPEND PROPERTY
|
|
||||||
ADDITIONAL_MAKE_CLEAN_FILES
|
|
||||||
"${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}")
|
|
||||||
|
|
||||||
if(DOXYFILE_LATEX STREQUAL "ON")
|
|
||||||
set(DOXYFILE_GENERATE_LATEX "YES")
|
|
||||||
find_package(LATEX)
|
|
||||||
find_program(DOXYFILE_MAKE make)
|
|
||||||
mark_as_advanced(DOXYFILE_MAKE)
|
|
||||||
if(LATEX_COMPILER AND MAKEINDEX_COMPILER AND DOXYFILE_MAKE)
|
|
||||||
if(PDFLATEX_COMPILER)
|
|
||||||
set(DOXYFILE_PDFLATEX "YES")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_custom_command(TARGET doxygen
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND "${DOXYFILE_MAKE}"
|
|
||||||
COMMENT "Running LaTeX for Doxygen documentation in ${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}..."
|
|
||||||
WORKING_DIRECTORY "${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}")
|
|
||||||
else()
|
|
||||||
set(DOXYGEN_LATEX "NO")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
set(DOXYFILE_GENERATE_LATEX "NO")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
configure_file("${DOXYFILE_IN}" "${DOXYFILE}" @ONLY)
|
|
||||||
|
|
||||||
add_custom_target(doc)
|
|
||||||
add_dependencies(doc doxygen)
|
|
||||||
endif()
|
|
||||||
23
cmake/Toolchain-cross-m32.cmake
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
set(CMAKE_C_FLAGS "-m32" CACHE STRING "C compiler flags" FORCE)
|
||||||
|
set(CMAKE_CXX_FLAGS "-m32" CACHE STRING "C++ compiler flags" FORCE)
|
||||||
|
|
||||||
|
set(LIB32 /usr/lib) # Fedora
|
||||||
|
|
||||||
|
if(EXISTS /usr/lib32)
|
||||||
|
set(LIB32 /usr/lib32) # Arch, Solus
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_SYSTEM_LIBRARY_PATH ${LIB32} CACHE STRING "system library search path" FORCE)
|
||||||
|
set(CMAKE_LIBRARY_PATH ${LIB32} CACHE STRING "library search path" FORCE)
|
||||||
|
|
||||||
|
# this is probably unlikely to be needed, but just in case
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "-m32 -L${LIB32}" CACHE STRING "executable linker flags" FORCE)
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS "-m32 -L${LIB32}" CACHE STRING "shared library linker flags" FORCE)
|
||||||
|
set(CMAKE_MODULE_LINKER_FLAGS "-m32 -L${LIB32}" CACHE STRING "module linker flags" FORCE)
|
||||||
|
|
||||||
|
# on Fedora and Arch and similar, point pkgconfig at 32 bit .pc files. We have
|
||||||
|
# to include the regular system .pc files as well (at the end), because some
|
||||||
|
# are not always present in the 32 bit directory
|
||||||
|
if(EXISTS ${LIB32}/pkgconfig)
|
||||||
|
set(ENV{PKG_CONFIG_LIBDIR} ${LIB32}/pkgconfig:/usr/share/pkgconfig:/usr/lib/pkgconfig:/usr/lib64/pkgconfig)
|
||||||
|
endiF()
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/* Name of package */
|
/* Name of package */
|
||||||
#cmakedefine PACKAGE "${APPLICATION_NAME}"
|
#cmakedefine PACKAGE "${PROJECT_NAME}"
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#cmakedefine VERSION "${APPLICATION_VERSION}"
|
#cmakedefine VERSION "${PROJECT_VERSION}"
|
||||||
|
|
||||||
#cmakedefine LOCALEDIR "${LOCALE_INSTALL_DIR}"
|
#cmakedefine LOCALEDIR "${LOCALE_INSTALL_DIR}"
|
||||||
#cmakedefine DATADIR "${DATADIR}"
|
#cmakedefine DATADIR "${DATADIR}"
|
||||||
@@ -20,6 +20,9 @@
|
|||||||
/* Define to 1 if you have the <aprpa/inet.h> header file. */
|
/* Define to 1 if you have the <aprpa/inet.h> header file. */
|
||||||
#cmakedefine HAVE_ARPA_INET_H 1
|
#cmakedefine HAVE_ARPA_INET_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <glob.h> header file. */
|
||||||
|
#cmakedefine HAVE_GLOB_H 1
|
||||||
|
|
||||||
/* Define to 1 if you have the <pty.h> header file. */
|
/* Define to 1 if you have the <pty.h> header file. */
|
||||||
#cmakedefine HAVE_PTY_H 1
|
#cmakedefine HAVE_PTY_H 1
|
||||||
|
|
||||||
@@ -35,12 +38,21 @@
|
|||||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||||
#cmakedefine HAVE_SYS_TIME_H 1
|
#cmakedefine HAVE_SYS_TIME_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/utime.h> header file. */
|
||||||
|
#cmakedefine HAVE_SYS_UTIME_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <io.h> header file. */
|
||||||
|
#cmakedefine HAVE_IO_H 1
|
||||||
|
|
||||||
/* Define to 1 if you have the <termios.h> header file. */
|
/* Define to 1 if you have the <termios.h> header file. */
|
||||||
#cmakedefine HAVE_TERMIOS_H 1
|
#cmakedefine HAVE_TERMIOS_H 1
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
#cmakedefine HAVE_UNISTD_H 1
|
#cmakedefine HAVE_UNISTD_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
|
#cmakedefine HAVE_STDINT_H 1
|
||||||
|
|
||||||
/* Define to 1 if you have the <openssl/aes.h> header file. */
|
/* Define to 1 if you have the <openssl/aes.h> header file. */
|
||||||
#cmakedefine HAVE_OPENSSL_AES_H 1
|
#cmakedefine HAVE_OPENSSL_AES_H 1
|
||||||
|
|
||||||
@@ -74,8 +86,29 @@
|
|||||||
/* Define to 1 if you have eliptic curve cryptography */
|
/* Define to 1 if you have eliptic curve cryptography */
|
||||||
#cmakedefine HAVE_ECC 1
|
#cmakedefine HAVE_ECC 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have DSA */
|
||||||
|
#cmakedefine HAVE_DSA 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have gl_flags as a glob_t sturct member */
|
||||||
|
#cmakedefine HAVE_GLOB_GL_FLAGS_MEMBER 1
|
||||||
|
|
||||||
/*************************** FUNCTIONS ***************************/
|
/*************************** FUNCTIONS ***************************/
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `EVP_aes128_ctr' function. */
|
||||||
|
#cmakedefine HAVE_OPENSSL_EVP_AES_CTR 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `EVP_aes128_cbc' function. */
|
||||||
|
#cmakedefine HAVE_OPENSSL_EVP_AES_CBC 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */
|
||||||
|
#cmakedefine HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `CRYPTO_ctr128_encrypt' function. */
|
||||||
|
#cmakedefine HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `EVP_CIPHER_CTX_new' function. */
|
||||||
|
#cmakedefine HAVE_OPENSSL_EVP_CIPHER_CTX_NEW 1
|
||||||
|
|
||||||
/* Define to 1 if you have the `snprintf' function. */
|
/* Define to 1 if you have the `snprintf' function. */
|
||||||
#cmakedefine HAVE_SNPRINTF 1
|
#cmakedefine HAVE_SNPRINTF 1
|
||||||
|
|
||||||
@@ -100,6 +133,9 @@
|
|||||||
/* Define to 1 if you have the `strncpy' function. */
|
/* Define to 1 if you have the `strncpy' function. */
|
||||||
#cmakedefine HAVE_STRNCPY 1
|
#cmakedefine HAVE_STRNCPY 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strndup' function. */
|
||||||
|
#cmakedefine HAVE_STRNDUP 1
|
||||||
|
|
||||||
/* Define to 1 if you have the `cfmakeraw' function. */
|
/* Define to 1 if you have the `cfmakeraw' function. */
|
||||||
#cmakedefine HAVE_CFMAKERAW 1
|
#cmakedefine HAVE_CFMAKERAW 1
|
||||||
|
|
||||||
@@ -130,6 +166,18 @@
|
|||||||
/* Define to 1 if you have the `_strtoui64' function. */
|
/* Define to 1 if you have the `_strtoui64' function. */
|
||||||
#cmakedefine HAVE__STRTOUI64 1
|
#cmakedefine HAVE__STRTOUI64 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `glob' function. */
|
||||||
|
#cmakedefine HAVE_GLOB 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `explicit_bzero' function. */
|
||||||
|
#cmakedefine HAVE_EXPLICIT_BZERO 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `memset_s' function. */
|
||||||
|
#cmakedefine HAVE_MEMSET_S 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `SecureZeroMemory' function. */
|
||||||
|
#cmakedefine HAVE_SECURE_ZERO_MEMORY 1
|
||||||
|
|
||||||
/*************************** LIBRARIES ***************************/
|
/*************************** LIBRARIES ***************************/
|
||||||
|
|
||||||
/* Define to 1 if you have the `crypto' library (-lcrypto). */
|
/* Define to 1 if you have the `crypto' library (-lcrypto). */
|
||||||
@@ -138,6 +186,9 @@
|
|||||||
/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */
|
/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */
|
||||||
#cmakedefine HAVE_LIBGCRYPT 1
|
#cmakedefine HAVE_LIBGCRYPT 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the 'mbedTLS' library (-lmbedtls). */
|
||||||
|
#cmakedefine HAVE_LIBMBEDCRYPTO 1
|
||||||
|
|
||||||
/* Define to 1 if you have the `pthread' library (-lpthread). */
|
/* Define to 1 if you have the `pthread' library (-lpthread). */
|
||||||
#cmakedefine HAVE_PTHREAD 1
|
#cmakedefine HAVE_PTHREAD 1
|
||||||
|
|
||||||
@@ -146,12 +197,19 @@
|
|||||||
#cmakedefine HAVE_GCC_THREAD_LOCAL_STORAGE 1
|
#cmakedefine HAVE_GCC_THREAD_LOCAL_STORAGE 1
|
||||||
#cmakedefine HAVE_MSC_THREAD_LOCAL_STORAGE 1
|
#cmakedefine HAVE_MSC_THREAD_LOCAL_STORAGE 1
|
||||||
|
|
||||||
|
#cmakedefine HAVE_FALLTHROUGH_ATTRIBUTE 1
|
||||||
|
|
||||||
|
#cmakedefine HAVE_CONSTRUCTOR_ATTRIBUTE 1
|
||||||
|
#cmakedefine HAVE_DESTRUCTOR_ATTRIBUTE 1
|
||||||
|
|
||||||
#cmakedefine HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
|
#cmakedefine HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1
|
||||||
#cmakedefine HAVE_GCC_NARG_MACRO 1
|
#cmakedefine HAVE_GCC_NARG_MACRO 1
|
||||||
|
|
||||||
#cmakedefine HAVE_COMPILER__FUNC__ 1
|
#cmakedefine HAVE_COMPILER__FUNC__ 1
|
||||||
#cmakedefine HAVE_COMPILER__FUNCTION__ 1
|
#cmakedefine HAVE_COMPILER__FUNCTION__ 1
|
||||||
|
|
||||||
|
#cmakedefine HAVE_GCC_BOUNDED_ATTRIBUTE 1
|
||||||
|
|
||||||
/* Define to 1 if you want to enable GSSAPI */
|
/* Define to 1 if you want to enable GSSAPI */
|
||||||
#cmakedefine WITH_GSSAPI 1
|
#cmakedefine WITH_GSSAPI 1
|
||||||
|
|
||||||
@@ -161,15 +219,15 @@
|
|||||||
/* Define to 1 if you want to enable SFTP */
|
/* Define to 1 if you want to enable SFTP */
|
||||||
#cmakedefine WITH_SFTP 1
|
#cmakedefine WITH_SFTP 1
|
||||||
|
|
||||||
/* Define to 1 if you want to enable SSH1 */
|
|
||||||
#cmakedefine WITH_SSH1 1
|
|
||||||
|
|
||||||
/* Define to 1 if you want to enable server support */
|
/* Define to 1 if you want to enable server support */
|
||||||
#cmakedefine WITH_SERVER 1
|
#cmakedefine WITH_SERVER 1
|
||||||
|
|
||||||
/* Define to 1 if you want to enable debug output for crypto functions */
|
/* Define to 1 if you want to enable debug output for crypto functions */
|
||||||
#cmakedefine DEBUG_CRYPTO 1
|
#cmakedefine DEBUG_CRYPTO 1
|
||||||
|
|
||||||
|
/* Define to 1 if you want to enable debug output for packet functions */
|
||||||
|
#cmakedefine DEBUG_PACKET 1
|
||||||
|
|
||||||
/* Define to 1 if you want to enable pcap output support (experimental) */
|
/* Define to 1 if you want to enable pcap output support (experimental) */
|
||||||
#cmakedefine WITH_PCAP 1
|
#cmakedefine WITH_PCAP 1
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,46 @@
|
|||||||
#
|
#
|
||||||
# Build the documentation
|
# Build the documentation
|
||||||
#
|
#
|
||||||
include(UseDoxygen OPTIONAL)
|
if (${CMAKE_VERSION} VERSION_GREATER "3.8.99")
|
||||||
|
|
||||||
|
find_package(Doxygen)
|
||||||
|
|
||||||
|
if (DOXYGEN_FOUND)
|
||||||
|
set(DOXYGEN_PROJECT_NAME ${PROJECT_NAME})
|
||||||
|
set(DOXYGEN_PROJECT_NUMBER ${PROJECT_VERSION})
|
||||||
|
set(DOXYGEN_PROJECT_BRIEF "The SSH library")
|
||||||
|
|
||||||
|
set(DOXYGEN_TAB_SIZE 4)
|
||||||
|
set(DOXYGEN_OPTIMIZE_OUTPUT_FOR_C YES)
|
||||||
|
set(DOXYGEN_MARKDOWN_SUPPORT YES)
|
||||||
|
|
||||||
|
set(DOXYGEN_PREDEFINED DOXYGEN
|
||||||
|
PRINTF_ATTRIBUTE(x,y))
|
||||||
|
|
||||||
|
set(DOXYGEN_EXCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/that_style)
|
||||||
|
set(DOXYGEN_HTML_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/that_style/header.html)
|
||||||
|
set(DOXYGEN_HTML_EXTRA_STYLESHEET ${CMAKE_CURRENT_SOURCE_DIR}/that_style/that_style.css)
|
||||||
|
set(DOXYGEN_HTML_EXTRA_FILES ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/nav_edge_left.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/nav_edge_right.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/nav_edge_inter.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/sync_off.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/sync_on.png
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/splitbar_handle.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/doc.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/mag_glass.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/folderclosed.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/folderopen.svg
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/that_style/js/striped_bg.js)
|
||||||
|
|
||||||
|
# This updates the Doxyfile if we do changes here
|
||||||
|
set(_doxyfile_template "${CMAKE_BINARY_DIR}/CMakeDoxyfile.in")
|
||||||
|
set(_target_doxyfile "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.docs")
|
||||||
|
configure_file("${_doxyfile_template}" "${_target_doxyfile}")
|
||||||
|
|
||||||
|
doxygen_add_docs(docs
|
||||||
|
${CMAKE_SOURCE_DIR}/include/libssh
|
||||||
|
${CMAKE_SOURCE_DIR}/src
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
endif() # DOXYGEN_FOUND
|
||||||
|
|
||||||
|
endif() # CMAKE_VERSION
|
||||||
|
|||||||
1917
doc/Doxyfile.in
@@ -46,7 +46,7 @@ The ssh_userauth_publickey_auto() function also tries to authenticate using the
|
|||||||
SSH agent, if you have one running, or the "none" method otherwise.
|
SSH agent, if you have one running, or the "none" method otherwise.
|
||||||
|
|
||||||
If you wish to authenticate with public key by your own, follow these steps:
|
If you wish to authenticate with public key by your own, follow these steps:
|
||||||
- Retrieve the public key with ssh_import_pubkey_file().
|
- Retrieve the public key with ssh_pki_import_pubkey_file().
|
||||||
- Offer the public key to the SSH server using ssh_userauth_try_publickey().
|
- Offer the public key to the SSH server using ssh_userauth_try_publickey().
|
||||||
If the return value is SSH_AUTH_SUCCESS, the SSH server accepts to
|
If the return value is SSH_AUTH_SUCCESS, the SSH server accepts to
|
||||||
authenticate using the public key and you can go to the next step.
|
authenticate using the public key and you can go to the next step.
|
||||||
@@ -127,7 +127,7 @@ The keyboard-interactive method is, as its name tells, interactive. The
|
|||||||
server will issue one or more challenges that the user has to answer,
|
server will issue one or more challenges that the user has to answer,
|
||||||
until the server takes an authentication decision.
|
until the server takes an authentication decision.
|
||||||
|
|
||||||
ssh_userauth_kbdint() is the the main keyboard-interactive function.
|
ssh_userauth_kbdint() is the the main keyboard-interactive function.
|
||||||
It will return SSH_AUTH_SUCCESS,SSH_AUTH_DENIED, SSH_AUTH_PARTIAL,
|
It will return SSH_AUTH_SUCCESS,SSH_AUTH_DENIED, SSH_AUTH_PARTIAL,
|
||||||
SSH_AUTH_ERROR, or SSH_AUTH_INFO, depending on the result of the request.
|
SSH_AUTH_ERROR, or SSH_AUTH_INFO, depending on the result of the request.
|
||||||
|
|
||||||
@@ -154,9 +154,9 @@ Here are a few remarks:
|
|||||||
- Even the first call can return SSH_AUTH_DENIED or SSH_AUTH_SUCCESS.
|
- Even the first call can return SSH_AUTH_DENIED or SSH_AUTH_SUCCESS.
|
||||||
- The server can send an empty question set (this is the default behavior
|
- The server can send an empty question set (this is the default behavior
|
||||||
on my system) after you have sent the answers to the first questions.
|
on my system) after you have sent the answers to the first questions.
|
||||||
You must still parse the answer, it might contain some
|
You must still parse the answer, it might contain some
|
||||||
message from the server saying hello or such things. Just call
|
message from the server saying hello or such things. Just call
|
||||||
ssh_userauth_kbdint() until needed.
|
ssh_userauth_kbdint() until needed.
|
||||||
- The meaning of "name", "prompt", "instruction" may be a little
|
- The meaning of "name", "prompt", "instruction" may be a little
|
||||||
confusing. An explanation is given in the RFC section that follows.
|
confusing. An explanation is given in the RFC section that follows.
|
||||||
|
|
||||||
@@ -187,7 +187,7 @@ keyboard-interactive authentication, coming from the RFC itself (rfc4256):
|
|||||||
the name and prompts. If the server presents names or prompts longer than 30
|
the name and prompts. If the server presents names or prompts longer than 30
|
||||||
characters, the client MAY truncate these fields to the length it can
|
characters, the client MAY truncate these fields to the length it can
|
||||||
display. If the client does truncate any fields, there MUST be an obvious
|
display. If the client does truncate any fields, there MUST be an obvious
|
||||||
indication that such truncation has occured.
|
indication that such truncation has occurred.
|
||||||
|
|
||||||
The instruction field SHOULD NOT be truncated. Clients SHOULD use control
|
The instruction field SHOULD NOT be truncated. Clients SHOULD use control
|
||||||
character filtering as discussed in [SSH-ARCH] to avoid attacks by
|
character filtering as discussed in [SSH-ARCH] to avoid attacks by
|
||||||
@@ -305,7 +305,7 @@ int test_several_auth_methods(ssh_session session)
|
|||||||
int method, rc;
|
int method, rc;
|
||||||
|
|
||||||
rc = ssh_userauth_none(session, NULL);
|
rc = ssh_userauth_none(session, NULL);
|
||||||
if (rc != SSH_AUTH_SUCCESS) {
|
if (rc == SSH_AUTH_SUCCESS || rc == SSH_AUTH_ERROR) {
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ If an error has been encountered, it returns a negative value:
|
|||||||
|
|
||||||
@code
|
@code
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
unsigned int nbytes;
|
int nbytes;
|
||||||
|
|
||||||
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
|
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
|
||||||
while (nbytes > 0)
|
while (nbytes > 0)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
Port forwarding comes in SSH protocol in two different flavours:
|
Port forwarding comes in SSH protocol in two different flavours:
|
||||||
direct or reverse port forwarding. Direct port forwarding is also
|
direct or reverse port forwarding. Direct port forwarding is also
|
||||||
named local port forwardind, and reverse port forwarding is also called
|
named local port forwarding, and reverse port forwarding is also called
|
||||||
remote port forwarding. SSH also allows X11 tunnels.
|
remote port forwarding. SSH also allows X11 tunnels.
|
||||||
|
|
||||||
|
|
||||||
@@ -23,15 +23,15 @@ Mail client application Google Mail
|
|||||||
5555 (arbitrary) |
|
5555 (arbitrary) |
|
||||||
| 143 (IMAP2)
|
| 143 (IMAP2)
|
||||||
V |
|
V |
|
||||||
SSH client =====> SSH server
|
SSH client =====> SSH server
|
||||||
|
|
||||||
Legend:
|
Legend:
|
||||||
--P-->: port connexion through port P
|
--P-->: port connections through port P
|
||||||
=====>: SSH tunnel
|
=====>: SSH tunnel
|
||||||
@endverbatim
|
@endverbatim
|
||||||
A mail client connects to port 5555 of a client. An encrypted tunnel is
|
A mail client connects to port 5555 of a client. An encrypted tunnel is
|
||||||
established to the server. The server connects to port 143 of Google Mail (the
|
established to the server. The server connects to port 143 of Google Mail (the
|
||||||
end point). Now the local mail client can retreive mail.
|
end point). Now the local mail client can retrieve mail.
|
||||||
|
|
||||||
|
|
||||||
@subsection forwarding_reverse Reverse port forwarding
|
@subsection forwarding_reverse Reverse port forwarding
|
||||||
@@ -51,7 +51,7 @@ Example of use of reverse port forwarding:
|
|||||||
SSH client <===== SSH server
|
SSH client <===== SSH server
|
||||||
|
|
||||||
Legend:
|
Legend:
|
||||||
--P-->: port connexion through port P
|
--P-->: port connections through port P
|
||||||
=====>: SSH tunnel
|
=====>: SSH tunnel
|
||||||
@endverbatim
|
@endverbatim
|
||||||
In this example, the SSH client establishes the tunnel,
|
In this example, the SSH client establishes the tunnel,
|
||||||
@@ -148,9 +148,9 @@ To do reverse port forwarding, call ssh_channel_listen_forward(),
|
|||||||
then ssh_channel_accept_forward().
|
then ssh_channel_accept_forward().
|
||||||
|
|
||||||
When you call ssh_channel_listen_forward(), you can let the remote server
|
When you call ssh_channel_listen_forward(), you can let the remote server
|
||||||
chose the non-priviledged port it should listen to. Otherwise, you can chose
|
chose the non-privileged port it should listen to. Otherwise, you can chose
|
||||||
your own priviledged or non-priviledged port. Beware that you should have
|
your own privileged or non-privileged port. Beware that you should have
|
||||||
administrative priviledges on the remote server to open a priviledged port
|
administrative privileges on the remote server to open a privileged port
|
||||||
(port number < 1024).
|
(port number < 1024).
|
||||||
|
|
||||||
Below is an example of a very rough web server waiting for connections on port
|
Below is an example of a very rough web server waiting for connections on port
|
||||||
|
|||||||
@@ -31,20 +31,20 @@ A SSH session goes through the following steps:
|
|||||||
- Invoke your own subsystem. This is outside the scope of this document,
|
- Invoke your own subsystem. This is outside the scope of this document,
|
||||||
but can be done.
|
but can be done.
|
||||||
|
|
||||||
- When everything is finished, just close the channels, and then the connection.
|
- When everything is finished, just close the channels, and then the connection.
|
||||||
|
|
||||||
The sftp and scp subsystems use channels, but libssh hides them to
|
The sftp and scp subsystems use channels, but libssh hides them to
|
||||||
the programmer. If you want to use those subsystems, instead of a channel,
|
the programmer. If you want to use those subsystems, instead of a channel,
|
||||||
you'll usually open a "sftp session" or a "scp session".
|
you'll usually open a "sftp session" or a "scp session".
|
||||||
|
|
||||||
|
|
||||||
@subsection setup Creating the session and setting options
|
@subsection setup Creating the session and setting options
|
||||||
|
|
||||||
The most important object in a SSH connection is the SSH session. In order
|
The most important object in a SSH connection is the SSH session. In order
|
||||||
to allocate a new SSH session, you use ssh_new(). Don't forget to
|
to allocate a new SSH session, you use ssh_new(). Don't forget to
|
||||||
always verify that the allocation successed.
|
always verify that the allocation succeeded.
|
||||||
@code
|
@code
|
||||||
#include <libssh/libssh.h>
|
#include <libssh/libssh.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
@@ -69,12 +69,12 @@ The ssh_options_set() function sets the options of the session. The most importa
|
|||||||
|
|
||||||
The complete list of options can be found in the documentation of ssh_options_set().
|
The complete list of options can be found in the documentation of ssh_options_set().
|
||||||
The only mandatory option is SSH_OPTIONS_HOST. If you don't use SSH_OPTIONS_USER,
|
The only mandatory option is SSH_OPTIONS_HOST. If you don't use SSH_OPTIONS_USER,
|
||||||
the local username of your account will be used.
|
the local username of your account will be used.
|
||||||
|
|
||||||
Here is a small example of how to use it:
|
Here is a small example of how to use it:
|
||||||
|
|
||||||
@code
|
@code
|
||||||
#include <libssh/libssh.h>
|
#include <libssh/libssh.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
@@ -122,7 +122,7 @@ Here's an example:
|
|||||||
@code
|
@code
|
||||||
#include <libssh/libssh.h>
|
#include <libssh/libssh.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
@@ -158,7 +158,7 @@ you just connected to is known and safe to use (remember, SSH is about security
|
|||||||
authentication).
|
authentication).
|
||||||
|
|
||||||
There are two ways of doing this:
|
There are two ways of doing this:
|
||||||
- The first way (recommended) is to use the ssh_is_server_known()
|
- The first way (recommended) is to use the ssh_session_is_known_server()
|
||||||
function. This function will look into the known host file
|
function. This function will look into the known host file
|
||||||
(~/.ssh/known_hosts on UNIX), look for the server hostname's pattern,
|
(~/.ssh/known_hosts on UNIX), look for the server hostname's pattern,
|
||||||
and determine whether this host is present or not in the list.
|
and determine whether this host is present or not in the list.
|
||||||
@@ -185,74 +185,89 @@ examples/ directory:
|
|||||||
|
|
||||||
int verify_knownhost(ssh_session session)
|
int verify_knownhost(ssh_session session)
|
||||||
{
|
{
|
||||||
int state, hlen;
|
enum ssh_known_hosts_e state;
|
||||||
unsigned char *hash = NULL;
|
unsigned char *hash = NULL;
|
||||||
char *hexa;
|
ssh_key srv_pubkey = NULL;
|
||||||
char buf[10];
|
size_t hlen;
|
||||||
|
char buf[10];
|
||||||
|
char *hexa;
|
||||||
|
char *p;
|
||||||
|
int cmp;
|
||||||
|
int rc;
|
||||||
|
|
||||||
state = ssh_is_server_known(session);
|
rc = ssh_get_server_publickey(session, &srv_pubkey);
|
||||||
|
if (rc < 0) {
|
||||||
hlen = ssh_get_pubkey_hash(session, &hash);
|
|
||||||
if (hlen < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
switch (state)
|
|
||||||
{
|
|
||||||
case SSH_SERVER_KNOWN_OK:
|
|
||||||
break; /* ok */
|
|
||||||
|
|
||||||
case SSH_SERVER_KNOWN_CHANGED:
|
|
||||||
fprintf(stderr, "Host key for server changed: it is now:\n");
|
|
||||||
ssh_print_hexa("Public key hash", hash, hlen);
|
|
||||||
fprintf(stderr, "For security reasons, connection will be stopped\n");
|
|
||||||
free(hash);
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
case SSH_SERVER_FOUND_OTHER:
|
|
||||||
fprintf(stderr, "The host key for this server was not found but an other"
|
|
||||||
"type of key exists.\n");
|
|
||||||
fprintf(stderr, "An attacker might change the default server key to"
|
|
||||||
"confuse your client into thinking the key does not exist\n");
|
|
||||||
free(hash);
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
case SSH_SERVER_FILE_NOT_FOUND:
|
|
||||||
fprintf(stderr, "Could not find known host file.\n");
|
|
||||||
fprintf(stderr, "If you accept the host key here, the file will be"
|
|
||||||
"automatically created.\n");
|
|
||||||
/* fallback to SSH_SERVER_NOT_KNOWN behavior */
|
|
||||||
|
|
||||||
case SSH_SERVER_NOT_KNOWN:
|
|
||||||
hexa = ssh_get_hexa(hash, hlen);
|
|
||||||
fprintf(stderr,"The server is unknown. Do you trust the host key?\n");
|
|
||||||
fprintf(stderr, "Public key hash: %s\n", hexa);
|
|
||||||
free(hexa);
|
|
||||||
if (fgets(buf, sizeof(buf), stdin) == NULL)
|
|
||||||
{
|
|
||||||
free(hash);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (strncasecmp(buf, "yes", 3) != 0)
|
|
||||||
{
|
|
||||||
free(hash);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (ssh_write_knownhost(session) < 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Error %s\n", strerror(errno));
|
|
||||||
free(hash);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SSH_SERVER_ERROR:
|
rc = ssh_get_publickey_hash(srv_pubkey,
|
||||||
fprintf(stderr, "Error %s", ssh_get_error(session));
|
SSH_PUBLICKEY_HASH_SHA1,
|
||||||
free(hash);
|
&hash,
|
||||||
return -1;
|
&hlen);
|
||||||
}
|
ssh_key_free(srv_pubkey);
|
||||||
|
if (rc < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
free(hash);
|
state = ssh_session_is_known_server(session);
|
||||||
return 0;
|
switch (state) {
|
||||||
|
case SSH_KNOWN_HOSTS_OK:
|
||||||
|
/* OK */
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SSH_KNOWN_HOSTS_CHANGED:
|
||||||
|
fprintf(stderr, "Host key for server changed: it is now:\n");
|
||||||
|
ssh_print_hexa("Public key hash", hash, hlen);
|
||||||
|
fprintf(stderr, "For security reasons, connection will be stopped\n");
|
||||||
|
ssh_clean_pubkey_hash(&hash);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
case SSH_KNOWN_HOSTS_OTHER:
|
||||||
|
fprintf(stderr, "The host key for this server was not found but an other"
|
||||||
|
"type of key exists.\n");
|
||||||
|
fprintf(stderr, "An attacker might change the default server key to"
|
||||||
|
"confuse your client into thinking the key does not exist\n");
|
||||||
|
ssh_clean_pubkey_hash(&hash);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
case SSH_KNOWN_HOSTS_NOT_FOUND:
|
||||||
|
fprintf(stderr, "Could not find known host file.\n");
|
||||||
|
fprintf(stderr, "If you accept the host key here, the file will be"
|
||||||
|
"automatically created.\n");
|
||||||
|
|
||||||
|
/* FALL THROUGH to SSH_SERVER_NOT_KNOWN behavior */
|
||||||
|
|
||||||
|
case SSH_KNOWN_HOSTS_UNKNOWN:
|
||||||
|
hexa = ssh_get_hexa(hash, hlen);
|
||||||
|
fprintf(stderr,"The server is unknown. Do you trust the host key?\n");
|
||||||
|
fprintf(stderr, "Public key hash: %s\n", hexa);
|
||||||
|
ssh_string_free_char(hexa);
|
||||||
|
ssh_clean_pubkey_hash(&hash);
|
||||||
|
p = fgets(buf, sizeof(buf), stdin);
|
||||||
|
if (p == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmp = strncasecmp(buf, "yes", 3);
|
||||||
|
if (cmp != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = ssh_session_update_known_hosts(session);
|
||||||
|
if (rc < 0) {
|
||||||
|
fprintf(stderr, "Error %s\n", strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SSH_KNOWN_HOSTS_ERROR:
|
||||||
|
fprintf(stderr, "Error %s", ssh_get_error(session));
|
||||||
|
ssh_clean_pubkey_hash(&hash);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssh_clean_pubkey_hash(&hash);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
@@ -260,18 +275,19 @@ int verify_knownhost(ssh_session session)
|
|||||||
@see ssh_disconnect
|
@see ssh_disconnect
|
||||||
@see ssh_get_error
|
@see ssh_get_error
|
||||||
@see ssh_get_error_code
|
@see ssh_get_error_code
|
||||||
@see ssh_get_pubkey_hash
|
@see ssh_get_server_publickey
|
||||||
@see ssh_is_server_known
|
@see ssh_get_publickey_hash
|
||||||
@see ssh_write_knownhost
|
@see ssh_session_is_known_server
|
||||||
|
@see ssh_session_update_known_hosts
|
||||||
|
|
||||||
|
|
||||||
@subsection auth Authenticating the user
|
@subsection auth Authenticating the user
|
||||||
|
|
||||||
The authentication process is the way a service provider can identify a
|
The authentication process is the way a service provider can identify a
|
||||||
user and verify his/her identity. The authorization process is about enabling
|
user and verify his/her identity. The authorization process is about enabling
|
||||||
the authenticated user the access to ressources. In SSH, the two concepts
|
the authenticated user the access to resources. In SSH, the two concepts
|
||||||
are linked. After authentication, the server can grant the user access to
|
are linked. After authentication, the server can grant the user access to
|
||||||
several ressources such as port forwarding, shell, sftp subsystem, and so on.
|
several resources such as port forwarding, shell, sftp subsystem, and so on.
|
||||||
|
|
||||||
libssh supports several methods of authentication:
|
libssh supports several methods of authentication:
|
||||||
- "none" method. This method allows to get the available authentications
|
- "none" method. This method allows to get the available authentications
|
||||||
@@ -297,7 +313,7 @@ The example below shows an authentication with password:
|
|||||||
@code
|
@code
|
||||||
#include <libssh/libssh.h>
|
#include <libssh/libssh.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
@@ -322,7 +338,7 @@ int main()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Verify the server's identity
|
// Verify the server's identity
|
||||||
// For the source code of verify_knowhost(), check previous example
|
// For the source code of verify_knownhost(), check previous example
|
||||||
if (verify_knownhost(my_ssh_session) < 0)
|
if (verify_knownhost(my_ssh_session) < 0)
|
||||||
{
|
{
|
||||||
ssh_disconnect(my_ssh_session);
|
ssh_disconnect(my_ssh_session);
|
||||||
@@ -367,7 +383,7 @@ int show_remote_processes(ssh_session session)
|
|||||||
ssh_channel channel;
|
ssh_channel channel;
|
||||||
int rc;
|
int rc;
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
unsigned int nbytes;
|
int nbytes;
|
||||||
|
|
||||||
channel = ssh_channel_new(session);
|
channel = ssh_channel_new(session);
|
||||||
if (channel == NULL)
|
if (channel == NULL)
|
||||||
@@ -391,7 +407,7 @@ int show_remote_processes(ssh_session session)
|
|||||||
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
|
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
|
||||||
while (nbytes > 0)
|
while (nbytes > 0)
|
||||||
{
|
{
|
||||||
if (write(1, buffer, nbytes) != nbytes)
|
if (write(1, buffer, nbytes) != (unsigned int) nbytes)
|
||||||
{
|
{
|
||||||
ssh_channel_close(channel);
|
ssh_channel_close(channel);
|
||||||
ssh_channel_free(channel);
|
ssh_channel_free(channel);
|
||||||
@@ -399,7 +415,7 @@ int show_remote_processes(ssh_session session)
|
|||||||
}
|
}
|
||||||
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
|
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nbytes < 0)
|
if (nbytes < 0)
|
||||||
{
|
{
|
||||||
ssh_channel_close(channel);
|
ssh_channel_close(channel);
|
||||||
@@ -440,7 +456,7 @@ might be recoverable. SSH_FATAL means the connection has an important
|
|||||||
problem and isn't probably recoverable.
|
problem and isn't probably recoverable.
|
||||||
|
|
||||||
Most of time, the error returned are SSH_FATAL, but some functions
|
Most of time, the error returned are SSH_FATAL, but some functions
|
||||||
(generaly the ssh_request_xxx ones) may fail because of server denying request.
|
(generally the ssh_request_xxx ones) may fail because of server denying request.
|
||||||
In these cases, SSH_REQUEST_DENIED is returned.
|
In these cases, SSH_REQUEST_DENIED is returned.
|
||||||
|
|
||||||
For thread safety, errors are bound to ssh_session objects.
|
For thread safety, errors are bound to ssh_session objects.
|
||||||
|
|||||||
@@ -12,13 +12,13 @@ mean that you should not try to know about and understand these details.
|
|||||||
|
|
||||||
libssh is a Free Software / Open Source project. The libssh library
|
libssh is a Free Software / Open Source project. The libssh library
|
||||||
is distributed under LGPL license. The libssh project has nothing to do with
|
is distributed under LGPL license. The libssh project has nothing to do with
|
||||||
"libssh2", which is a completly different and independant project.
|
"libssh2", which is a completely different and independent project.
|
||||||
|
|
||||||
libssh can run on top of either libgcrypt or libcrypto,
|
libssh can run on top of either libgcrypt or libcrypto,
|
||||||
two general-purpose cryptographic libraries.
|
two general-purpose cryptographic libraries.
|
||||||
|
|
||||||
This tutorial concentrates for its main part on the "client" side of libssh.
|
This tutorial concentrates for its main part on the "client" side of libssh.
|
||||||
To learn how to accept incoming SSH connexions (how to write a SSH server),
|
To learn how to accept incoming SSH connections (how to write a SSH server),
|
||||||
you'll have to jump to the end of this document.
|
you'll have to jump to the end of this document.
|
||||||
|
|
||||||
This tutorial describes libssh version 0.5.0. This version is a little different
|
This tutorial describes libssh version 0.5.0. This version is a little different
|
||||||
|
|||||||
@@ -27,4 +27,7 @@ the dllimport attribute.
|
|||||||
#include <libssh/libssh.h>
|
#include <libssh/libssh.h>
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
If you're are statically linking with OpenSSL, read the "Linking your
|
||||||
|
application" section in the NOTES.<OS> in the OpenSSL source tree!
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -19,16 +19,16 @@ the interesting functions as you go.
|
|||||||
|
|
||||||
The libssh library provides:
|
The libssh library provides:
|
||||||
|
|
||||||
- <strong>Key Exchange Methods</strong>: <i>curve25519-sha256@libssh.org, ecdh-sha2-nistp256</i>, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1
|
- <strong>Key Exchange Methods</strong>: <i>curve25519-sha256, curve25519-sha256@libssh.org, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521</i>, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1
|
||||||
- <strong>Hostkey Types</strong>: <i>ecdsa-sha2-nistp256</i>, ssh-dss, ssh-rsa
|
- <strong>Public Key Algorithms</strong>: ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521, ssh-rsa, rsa-sha2-512, rsa-sha2-256,ssh-dss
|
||||||
- <strong>Ciphers</strong>: <i>aes256-ctr, aes192-ctr, aes128-ctr</i>, aes256-cbc (rijndael-cbc@lysator.liu.se), aes192-cbc, aes128-cbc, 3des-cbc, des-cbc-ssh1, blowfish-cbc, none
|
- <strong>Ciphers</strong>: <i>aes256-ctr, aes192-ctr, aes128-ctr</i>, aes256-cbc (rijndael-cbc@lysator.liu.se), aes192-cbc, aes128-cbc, 3des-cbc, blowfish-cbc, none
|
||||||
- <strong>Compression Schemes</strong>: zlib, <i>zlib@openssh.com</i>, none
|
- <strong>Compression Schemes</strong>: zlib, <i>zlib@openssh.com</i>, none
|
||||||
- <strong>MAC hashes</strong>: hmac-sha1, none
|
- <strong>MAC hashes</strong>: hmac-sha1, hmac-sha2-256, hmac-sha2-512, hmac-md5, none
|
||||||
- <strong>Authentication</strong>: none, password, public-key, hostbased, keyboard-interactive, <i>gssapi-with-mic</i>
|
- <strong>Authentication</strong>: none, password, public-key, keyboard-interactive, <i>gssapi-with-mic</i>
|
||||||
- <strong>Channels</strong>: shell, exec (incl. SCP wrapper), direct-tcpip, subsystem, <i>auth-agent-req@openssh.com</i>
|
- <strong>Channels</strong>: shell, exec (incl. SCP wrapper), direct-tcpip, subsystem, <i>auth-agent-req@openssh.com</i>
|
||||||
- <strong>Global Requests</strong>: tcpip-forward, forwarded-tcpip
|
- <strong>Global Requests</strong>: tcpip-forward, forwarded-tcpip
|
||||||
- <strong>Channel Requests</strong>: x11, pty, <i>exit-status, signal, exit-signal, keepalive@openssh.com, auth-agent-req@openssh.com</i>
|
- <strong>Channel Requests</strong>: x11, pty, <i>exit-status, signal, exit-signal, keepalive@openssh.com, auth-agent-req@openssh.com</i>
|
||||||
- <strong>Subsystems</strong>: sftp(version 3), publickey(version 2), <i>OpenSSH Extensions</i>
|
- <strong>Subsystems</strong>: sftp(version 3), <i>OpenSSH Extensions</i>
|
||||||
- <strong>SFTP</strong>: <i>statvfs@openssh.com, fstatvfs@openssh.com</i>
|
- <strong>SFTP</strong>: <i>statvfs@openssh.com, fstatvfs@openssh.com</i>
|
||||||
- <strong>Thread-safe</strong>: Just don't share sessions
|
- <strong>Thread-safe</strong>: Just don't share sessions
|
||||||
- <strong>Non-blocking</strong>: it can be used both blocking and non-blocking
|
- <strong>Non-blocking</strong>: it can be used both blocking and non-blocking
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
@page libssh_tutor_scp Chapter 6: The SCP subsystem
|
@page libssh_tutor_scp Chapter 6: The SCP subsystem
|
||||||
@section scp_subsystem The SCP subsystem
|
@section scp_subsystem The SCP subsystem
|
||||||
|
|
||||||
The SCP subsystem has far less functionnality than the SFTP subsystem.
|
The SCP subsystem has far less functionality than the SFTP subsystem.
|
||||||
However, if you only need to copy files from and to the remote system,
|
However, if you only need to copy files from and to the remote system,
|
||||||
it does its job.
|
it does its job.
|
||||||
|
|
||||||
@@ -158,7 +158,7 @@ Let's say you want to copy the following tree of files to the remote site:
|
|||||||
+-- file1
|
+-- file1
|
||||||
+-- B --+
|
+-- B --+
|
||||||
| +-- file2
|
| +-- file2
|
||||||
-- A --+
|
-- A --+
|
||||||
| +-- file3
|
| +-- file3
|
||||||
+-- C --+
|
+-- C --+
|
||||||
+-- file4
|
+-- file4
|
||||||
@@ -210,7 +210,7 @@ int scp_receive(ssh_session session, ssh_scp scp)
|
|||||||
size = ssh_scp_request_get_size(scp);
|
size = ssh_scp_request_get_size(scp);
|
||||||
filename = strdup(ssh_scp_request_get_filename(scp));
|
filename = strdup(ssh_scp_request_get_filename(scp));
|
||||||
mode = ssh_scp_request_get_permissions(scp);
|
mode = ssh_scp_request_get_permissions(scp);
|
||||||
printf("Receiving file %s, size %d, permisssions 0%o\n",
|
printf("Receiving file %s, size %d, permissions 0%o\n",
|
||||||
filename, size, mode);
|
filename, size, mode);
|
||||||
free(filename);
|
free(filename);
|
||||||
|
|
||||||
|
|||||||
12
doc/sftp.dox
@@ -100,7 +100,7 @@ Possible errors are:
|
|||||||
|
|
||||||
@subsection sftp_mkdir Creating a directory
|
@subsection sftp_mkdir Creating a directory
|
||||||
|
|
||||||
The function sftp_mkdir() tahes the "SFTP session" we juste created as
|
The function sftp_mkdir() takes the "SFTP session" we just created as
|
||||||
its first argument. It also needs the name of the file to create, and the
|
its first argument. It also needs the name of the file to create, and the
|
||||||
desired permissions. The permissions are the same as for the usual mkdir()
|
desired permissions. The permissions are the same as for the usual mkdir()
|
||||||
function. To get a comprehensive list of the available permissions, use the
|
function. To get a comprehensive list of the available permissions, use the
|
||||||
@@ -253,7 +253,7 @@ int sftp_read_sync(ssh_session session, sftp_session sftp)
|
|||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
nwritten = write(fd, buf, nbytes);
|
nwritten = write(fd, buffer, nbytes);
|
||||||
if (nwritten != nbytes) {
|
if (nwritten != nbytes) {
|
||||||
fprintf(stderr, "Error writing: %s\n",
|
fprintf(stderr, "Error writing: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
@@ -282,7 +282,7 @@ sftp_async_read() waits for the data to come. To open a file in nonblocking mode
|
|||||||
call sftp_file_set_nonblocking() right after you opened it. Default is blocking mode.
|
call sftp_file_set_nonblocking() right after you opened it. Default is blocking mode.
|
||||||
|
|
||||||
The example below reads a very big file in asynchronous, nonblocking, mode. Each
|
The example below reads a very big file in asynchronous, nonblocking, mode. Each
|
||||||
time the data are not ready yet, a counter is incrementer.
|
time the data is not ready yet, a counter is incremented.
|
||||||
|
|
||||||
@code
|
@code
|
||||||
// Good chunk size
|
// Good chunk size
|
||||||
@@ -358,19 +358,19 @@ int sftp_read_async(ssh_session session, sftp_session sftp)
|
|||||||
@subsection sftp_ls Listing the contents of a directory
|
@subsection sftp_ls Listing the contents of a directory
|
||||||
|
|
||||||
The functions sftp_opendir(), sftp_readdir(), sftp_dir_eof(),
|
The functions sftp_opendir(), sftp_readdir(), sftp_dir_eof(),
|
||||||
and sftp_closedir() enable to list the contents of a directory.
|
and sftp_closedir() enable to list the contents of a directory.
|
||||||
They use a new handle_type, "sftp_dir", which gives access to the
|
They use a new handle_type, "sftp_dir", which gives access to the
|
||||||
directory being read.
|
directory being read.
|
||||||
|
|
||||||
In addition, sftp_readdir() returns a "sftp_attributes" which is a pointer
|
In addition, sftp_readdir() returns a "sftp_attributes" which is a pointer
|
||||||
to a structure with informations about a directory entry:
|
to a structure with information about a directory entry:
|
||||||
- name: the name of the file or directory
|
- name: the name of the file or directory
|
||||||
- size: its size in bytes
|
- size: its size in bytes
|
||||||
- etc.
|
- etc.
|
||||||
|
|
||||||
sftp_readdir() might return NULL under two conditions:
|
sftp_readdir() might return NULL under two conditions:
|
||||||
- when the end of the directory has been met
|
- when the end of the directory has been met
|
||||||
- when an error occured
|
- when an error occurred
|
||||||
|
|
||||||
To tell the difference, call sftp_dir_eof().
|
To tell the difference, call sftp_dir_eof().
|
||||||
|
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ int interactive_shell_session(ssh_channel channel)
|
|||||||
|
|
||||||
Of course, this is a poor terminal emulator, since the echo from the keys
|
Of course, this is a poor terminal emulator, since the echo from the keys
|
||||||
pressed should not be done locally, but should be done by the remote side.
|
pressed should not be done locally, but should be done by the remote side.
|
||||||
Also, user's input should not be sent once "Enter" key is pressed, but
|
Also, user's input should not be sent once "Enter" key is pressed, but
|
||||||
immediately after each key is pressed. This can be accomplished
|
immediately after each key is pressed. This can be accomplished
|
||||||
by setting the local terminal to "raw" mode with the cfmakeraw(3) function.
|
by setting the local terminal to "raw" mode with the cfmakeraw(3) function.
|
||||||
cfmakeraw() is a standard function under Linux, on other systems you can
|
cfmakeraw() is a standard function under Linux, on other systems you can
|
||||||
@@ -245,13 +245,13 @@ provide a more elegant way to wait for data coming from many sources.
|
|||||||
|
|
||||||
The functions ssh_select() and ssh_channel_select() remind of the standard
|
The functions ssh_select() and ssh_channel_select() remind of the standard
|
||||||
UNIX select(2) function. The idea is to wait for "something" to happen:
|
UNIX select(2) function. The idea is to wait for "something" to happen:
|
||||||
incoming data to be read, outcoming data to block, or an exception to
|
incoming data to be read, outgoing data to block, or an exception to
|
||||||
occur. Both these functions do a "passive wait", i.e. you can safely use
|
occur. Both these functions do a "passive wait", i.e. you can safely use
|
||||||
them repeatedly in a loop, it will not consume exaggerate processor time
|
them repeatedly in a loop, it will not consume exaggerate processor time
|
||||||
and make your computer unresponsive. It is quite common to use these
|
and make your computer unresponsive. It is quite common to use these
|
||||||
functions in your application's main loop.
|
functions in your application's main loop.
|
||||||
|
|
||||||
The difference between ssh_select() and ssh_channel_select() is that
|
The difference between ssh_select() and ssh_channel_select() is that
|
||||||
ssh_channel_select() is simpler, but allows you only to watch SSH channels.
|
ssh_channel_select() is simpler, but allows you only to watch SSH channels.
|
||||||
ssh_select() is more complete and enables watching regular file descriptors
|
ssh_select() is more complete and enables watching regular file descriptors
|
||||||
as well, in the same function call.
|
as well, in the same function call.
|
||||||
|
|||||||
21
doc/that_style/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017 Jan-Lukas Wynen
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
22
doc/that_style/README.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# that style
|
||||||
|
A plain, more modern HTML style for Doxygen
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
- Doxygen (tested with version 1.8.13)
|
||||||
|
- *optional*: a sass/scss compiler if you want to modify the style
|
||||||
|
|
||||||
|
## Simple usage
|
||||||
|
Tell Doxygen about the files for that style as shown in [doxyfile.conf](doxyfile.conf). You might need to adjust the
|
||||||
|
paths depending on where you installed that style.
|
||||||
|
When you run Doxygen, all files are copied into to generated HTML folder. So you don't need to keep the originals around
|
||||||
|
unless you want to re-generate the documentation.
|
||||||
|
|
||||||
|
## Advanced
|
||||||
|
that style uses a custom javascript to hack some nice stripes into some tables. It has to be loaded from HTML. Hence you need
|
||||||
|
to use the provided custom header. Since its default content may change when Doxygen is updated, there might be syntax error in
|
||||||
|
the generated HTML. If this is the case, you can remove the custom header (adjust your doxyfile.conf). This has no
|
||||||
|
disadvantages other than removing the stripes.
|
||||||
|
|
||||||
|
[that_style.css](that_style.css) was generated from the scss files in the folder [sass](sass). If you want to change the style,
|
||||||
|
use those files in order to have better control. For instance, you can easily change most colors by modifying the variables
|
||||||
|
in the beginning of [that_style.scss](sass/that_style.scss).
|
||||||
56
doc/that_style/header.html
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<!-- HTML header for doxygen 1.8.13-->
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
|
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
|
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
|
||||||
|
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="$relpath^jquery.js"></script>
|
||||||
|
<script type="text/javascript" src="$relpath^dynsections.js"></script>
|
||||||
|
$treeview
|
||||||
|
$search
|
||||||
|
$mathjax
|
||||||
|
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
|
<script src="$relpath^striped_bg.js"></script>
|
||||||
|
$extrastylesheet
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||||
|
|
||||||
|
<!--BEGIN TITLEAREA-->
|
||||||
|
<div id="titlearea">
|
||||||
|
<table cellspacing="0" cellpadding="0">
|
||||||
|
<tbody>
|
||||||
|
<tr style="height: 56px;">
|
||||||
|
<!--BEGIN PROJECT_LOGO-->
|
||||||
|
<td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
|
||||||
|
<!--END PROJECT_LOGO-->
|
||||||
|
<!--BEGIN PROJECT_NAME-->
|
||||||
|
<td id="projectalign" style="padding-left: 0.5em;">
|
||||||
|
<div id="projectname">$projectname
|
||||||
|
<!--BEGIN PROJECT_NUMBER--> <span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER-->
|
||||||
|
</div>
|
||||||
|
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME-->
|
||||||
|
<!--BEGIN PROJECT_BRIEF-->
|
||||||
|
<td style="padding-left: 0.5em;">
|
||||||
|
<div id="projectbrief">$projectbrief</div>
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_BRIEF-->
|
||||||
|
<!--END !PROJECT_NAME-->
|
||||||
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
|
<!--BEGIN SEARCHENGINE-->
|
||||||
|
<td>$searchbox</td>
|
||||||
|
<!--END SEARCHENGINE-->
|
||||||
|
<!--END DISABLE_INDEX-->
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--END TITLEAREA-->
|
||||||
|
<!-- end header part -->
|
||||||
97
doc/that_style/img/doc.svg
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="24"
|
||||||
|
height="22"
|
||||||
|
viewBox="0 0 6.3499999 5.8208335"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
sodipodi:docname="doc.svg"
|
||||||
|
inkscape:version="0.92.1 r">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="32"
|
||||||
|
inkscape:cx="11.139212"
|
||||||
|
inkscape:cy="14.811193"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-291.17915)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#4d4d4d;stroke-width:0.26458329;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="M 3.315043,291.8406 H 1.4552083 v 4.49792 h 3.1749999 v -3.10055 z"
|
||||||
|
id="path5095"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 3.1837239,291.84114 v 1.71186 h 1.4472656 v -0.31418 H 3.4473958 v -1.39768 z"
|
||||||
|
id="path5128"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect5132"
|
||||||
|
width="2.1166668"
|
||||||
|
height="0.26458332"
|
||||||
|
x="1.8520833"
|
||||||
|
y="293.82498" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect5136"
|
||||||
|
width="1.0583334"
|
||||||
|
height="0.26458332"
|
||||||
|
x="1.8520832"
|
||||||
|
y="294.35416" />
|
||||||
|
<rect
|
||||||
|
y="294.88333"
|
||||||
|
x="1.8520832"
|
||||||
|
height="0.26458332"
|
||||||
|
width="1.8520833"
|
||||||
|
id="rect5138"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4543"
|
||||||
|
width="1.5875"
|
||||||
|
height="0.26458332"
|
||||||
|
x="1.8520832"
|
||||||
|
y="295.41248" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 6.5 KiB |
77
doc/that_style/img/folderclosed.svg
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="24"
|
||||||
|
height="22"
|
||||||
|
viewBox="0 0 6.3499998 5.8208335"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.1 r"
|
||||||
|
sodipodi:docname="folderclosed.svg"
|
||||||
|
inkscape:export-filename="/home/jl/Prog/doxygen_style/folderclosed.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="51.113139"
|
||||||
|
inkscape:cx="7.7057751"
|
||||||
|
inkscape:cy="12.584171"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:snap-global="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:measure-start="0,0"
|
||||||
|
inkscape:measure-end="0,0" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-291.17915)">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 0.52916667,292.2374 -0.26458334,0.52925 v 3.43958 H 4.7625001 v -3.43958 H 2.38125 L 2.1166667,292.2374 Z"
|
||||||
|
id="rect4498"
|
||||||
|
sodipodi:nodetypes="cccccccc" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.66145831;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="M 2.9104167,292.76665 2.38125,293.56034 H 0.26458333 v 0.26464 H 2.38125 l 0.5291667,-0.79375 h 1.8520834 v -0.26458 z"
|
||||||
|
id="rect4500"
|
||||||
|
sodipodi:nodetypes="ccccccccc" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
83
doc/that_style/img/folderopen.svg
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="24"
|
||||||
|
height="22"
|
||||||
|
viewBox="0 0 6.3499998 5.8208335"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.1 r"
|
||||||
|
sodipodi:docname="folderopen.svg"
|
||||||
|
inkscape:export-filename="/home/jl/Prog/doxygen_style/folderopen.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="43.725861"
|
||||||
|
inkscape:cx="8.2043861"
|
||||||
|
inkscape:cy="13.464183"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:snap-global="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:measure-start="0,0"
|
||||||
|
inkscape:measure-end="0,0" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-291.17915)">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.66145831;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 0.52916667,292.23748 -0.26458334,0.52917 v 3.43958 H 4.762461 l 7.8e-5,-3.43958 H 2.38125 l -0.2645833,-0.52917 z"
|
||||||
|
id="path5228"
|
||||||
|
sodipodi:nodetypes="cccccccc" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5279"
|
||||||
|
d="M 1.0583333,293.5604 H 5.55625 L 4.7625,296.20603 H 0.26458333 Z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.66145831;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ccccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path5234"
|
||||||
|
d="M 1.0583333,294.35415 H 3.175 l 0.5291667,-0.52917 H 5.55625 L 4.7625,296.20603 H 0.26458333 Z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.66145831;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.1 KiB |
73
doc/that_style/img/mag_glass.svg
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="22"
|
||||||
|
height="22"
|
||||||
|
viewBox="0 0 5.8208332 5.8208335"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.1 r"
|
||||||
|
sodipodi:docname="mag_glass.svg">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="32"
|
||||||
|
inkscape:cx="8.961936"
|
||||||
|
inkscape:cy="10.205344"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:snap-bbox="false"
|
||||||
|
inkscape:bbox-nodes="true"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:snap-global="false" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-291.17915)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="M 6.9101562 2.4082031 C 3.1105656 2.4082031 -5.9211895e-16 5.5081643 0 9.3027344 C 0 13.097342 3.1105656 16.197266 6.9101562 16.197266 C 8.2869348 16.197266 9.5698699 15.787508 10.650391 15.087891 L 15.162109 19.587891 L 16.636719 18.115234 L 12.214844 13.707031 C 13.214837 12.510659 13.818359 10.974238 13.818359 9.3027344 C 13.818359 5.5081643 10.709747 2.4082031 6.9101562 2.4082031 z M 6.9101562 4.9101562 C 9.3624717 4.9101562 11.324219 6.8631249 11.324219 9.3027344 C 11.324219 11.742382 9.3624717 13.695312 6.9101562 13.695312 C 4.4578408 13.695312 2.5019531 11.742382 2.5019531 9.3027344 C 2.5019531 6.8631249 4.4578408 4.9101562 6.9101562 4.9101562 z "
|
||||||
|
transform="matrix(0.26458333,0,0,0.26458333,0,291.17915)"
|
||||||
|
id="rect4524" />
|
||||||
|
<path
|
||||||
|
transform="matrix(0.99422295,0,0,0.68955299,-0.83134947,91.755588)"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.63466448;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
inkscape:transform-center-y="0.25905895"
|
||||||
|
d="m 5.6074138,294.49889 -1.0836583,-1.87695 2.1673165,0 z"
|
||||||
|
id="path4491" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.8 KiB |
73
doc/that_style/img/nav_edge_inter.svg
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="10.53333"
|
||||||
|
height="32"
|
||||||
|
viewBox="0 0 9.8749964 30"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.92.1 r"
|
||||||
|
sodipodi:docname="nav_edge_inter.svg">
|
||||||
|
<defs
|
||||||
|
id="defs4" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="32"
|
||||||
|
inkscape:cx="8.6823304"
|
||||||
|
inkscape:cy="16.225639"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="false"
|
||||||
|
inkscape:bbox-nodes="true"
|
||||||
|
inkscape:snap-bbox-edge-midpoints="true"
|
||||||
|
inkscape:object-nodes="true"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1022.3622)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 0,1022.3622 v 15 15 l 8,-15 z"
|
||||||
|
id="path4143"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9375px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 1.2910156,1022.3496 -0.82421872,0.4473 7.87890622,14.5527 -7.87890622,14.5527 0.82421872,0.4473 8.1210938,-15 z"
|
||||||
|
id="path5240"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.8 KiB |
73
doc/that_style/img/nav_edge_left.svg
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="8.5333338"
|
||||||
|
height="32"
|
||||||
|
viewBox="0 0 8.0000001 30"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.92.1 r"
|
||||||
|
sodipodi:docname="nav_edge_left.svg">
|
||||||
|
<defs
|
||||||
|
id="defs4" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="32"
|
||||||
|
inkscape:cx="5.3721385"
|
||||||
|
inkscape:cy="14.16429"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="false"
|
||||||
|
inkscape:bbox-nodes="false"
|
||||||
|
inkscape:snap-bbox-edge-midpoints="false"
|
||||||
|
inkscape:object-nodes="true"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1022.3622)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="M 0 0 L 0 32 L 8.5332031 16 L 0 0 z "
|
||||||
|
transform="matrix(0.93749998,0,0,0.93749998,0,1022.3622)"
|
||||||
|
id="rect4586" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 0,1022.3622 v 15 15 l 8,-15 z"
|
||||||
|
id="path4143"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.1 KiB |
73
doc/that_style/img/nav_edge_right.svg
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="8"
|
||||||
|
height="30"
|
||||||
|
viewBox="0 0 8.0000001 30"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="nav_edge.svg">
|
||||||
|
<defs
|
||||||
|
id="defs4" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="32"
|
||||||
|
inkscape:cx="5.3721385"
|
||||||
|
inkscape:cy="14.16429"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="false"
|
||||||
|
inkscape:bbox-nodes="false"
|
||||||
|
inkscape:snap-bbox-edge-midpoints="false"
|
||||||
|
inkscape:object-nodes="true"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1022.3622)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 0,1022.3622 0,15 0,15 8,-15 -8,-15 z"
|
||||||
|
id="path4143"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 1e-8,1022.3622 7.99999999,15 0,-15 -8,0 z m 7.99999999,15 -8,15 8,0 0,-15 z"
|
||||||
|
id="rect4136"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.1 KiB |
120
doc/that_style/img/splitbar_handle.svg
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="6"
|
||||||
|
height="9"
|
||||||
|
viewBox="0 0 1.5875 2.3812501"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.1 r"
|
||||||
|
sodipodi:docname="splitbar_handle.svg">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="32"
|
||||||
|
inkscape:cx="8.7681488"
|
||||||
|
inkscape:cy="-2.7929517"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
showguides="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1357"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid4487" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-294.61873)">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4485"
|
||||||
|
width="0.26458335"
|
||||||
|
height="0.26458332"
|
||||||
|
x="0.26458332"
|
||||||
|
y="294.8833" />
|
||||||
|
<rect
|
||||||
|
y="294.8833"
|
||||||
|
x="1.0583333"
|
||||||
|
height="0.26458332"
|
||||||
|
width="0.26458335"
|
||||||
|
id="rect4489"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
y="295.41248"
|
||||||
|
x="0.26458329"
|
||||||
|
height="0.26458332"
|
||||||
|
width="0.26458335"
|
||||||
|
id="rect4491"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4493"
|
||||||
|
width="0.26458335"
|
||||||
|
height="0.26458332"
|
||||||
|
x="1.0583333"
|
||||||
|
y="295.41248" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4495"
|
||||||
|
width="0.26458335"
|
||||||
|
height="0.26458332"
|
||||||
|
x="0.26458332"
|
||||||
|
y="295.94165" />
|
||||||
|
<rect
|
||||||
|
y="295.94165"
|
||||||
|
x="1.0583333"
|
||||||
|
height="0.26458332"
|
||||||
|
width="0.26458335"
|
||||||
|
id="rect4497"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
y="296.47079"
|
||||||
|
x="0.26458329"
|
||||||
|
height="0.26458332"
|
||||||
|
width="0.26458335"
|
||||||
|
id="rect4499"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4501"
|
||||||
|
width="0.26458335"
|
||||||
|
height="0.26458332"
|
||||||
|
x="1.0583333"
|
||||||
|
y="296.47079" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 7.1 KiB |
BIN
doc/that_style/img/sync_off.png
Normal file
|
After Width: | Height: | Size: 483 B |
BIN
doc/that_style/img/sync_on.png
Normal file
|
After Width: | Height: | Size: 488 B |
32
doc/that_style/js/striped_bg.js
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// Adds extra CSS classes "even" and "odd" to .memberdecls to allow
|
||||||
|
// striped backgrounds.
|
||||||
|
function MemberDeclsStriper () {
|
||||||
|
var counter = 0;
|
||||||
|
|
||||||
|
this.stripe = function() {
|
||||||
|
$(".memberdecls tbody").children().each(function(i) {
|
||||||
|
|
||||||
|
// reset counter at every heading -> always start with even
|
||||||
|
if ($(this).is(".heading")) {
|
||||||
|
counter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add extra classes
|
||||||
|
if (counter % 2 == 1) {
|
||||||
|
$(this).addClass("odd");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$(this).addClass("even");
|
||||||
|
}
|
||||||
|
|
||||||
|
// advance counter at every separator
|
||||||
|
// this is the only way to reliably detect which table rows belong together
|
||||||
|
if ($(this).is('[class^="separator"]')) {
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// execute the function
|
||||||
|
$(document).ready(new MemberDeclsStriper().stripe);
|
||||||
1431
doc/that_style/that_style.css
Normal file
@@ -3,64 +3,50 @@
|
|||||||
@section threads_with_libssh How to use libssh with threads
|
@section threads_with_libssh How to use libssh with threads
|
||||||
|
|
||||||
libssh may be used in multithreaded applications, but under several conditions :
|
libssh may be used in multithreaded applications, but under several conditions :
|
||||||
- Threading must be initialized during the initialization of libssh. This
|
- Your system must support libpthread or, in Windows environment,
|
||||||
initialization must be done outside of any threading context.
|
CriticalSection based mutex control.
|
||||||
- If pthreads is being used by your application (or your framework's backend),
|
- Since version 0.8.0, threads initialization is called automatically in the
|
||||||
you must link with libssh_threads dynamic library and initialize
|
library constructor if libssh is dynamically linked. This means it is no
|
||||||
threading with the ssh_threads_pthreads threading object.
|
longer necessary to call ssh_init()/ssh_finalize().
|
||||||
- If an other threading library is being used by your application, you must
|
- If libssh is statically linked, threading must be initialized by calling
|
||||||
implement all the methods of the ssh_threads_callbacks_struct structure
|
ssh_init() before using any of libssh provided functions. This initialization
|
||||||
and initialize libssh with it.
|
must be done outside of any threading context. Don't forget to call
|
||||||
|
ssh_finalize() to avoid memory leak
|
||||||
- At all times, you may use different sessions inside threads, make parallel
|
- At all times, you may use different sessions inside threads, make parallel
|
||||||
connections, read/write on different sessions and so on. You *cannot* use a
|
connections, read/write on different sessions and so on. You *cannot* use a
|
||||||
single session (or channels for a single session) in several threads at the same
|
single session (or channels for a single session) in several threads at the same
|
||||||
time. This will most likely lead to internal state corruption. This limitation is
|
time. This will most likely lead to internal state corruption. This limitation is
|
||||||
being worked out and will maybe disappear later.
|
being worked out and will maybe disappear later.
|
||||||
|
|
||||||
@subsection threads_init Initialization of threads
|
@subsection threads_init Initialization of threads
|
||||||
|
|
||||||
To initialize threading, you must first select the threading model you want to
|
Since version 0.8.0, it is no longer necessary to call ssh_init()/ssh_finalize()
|
||||||
use, using ssh_threads_set_callbacks(), then call ssh_init().
|
if libssh is dynamically linked.
|
||||||
|
|
||||||
@code
|
If libssh is statically linked, call ssh_init() before using any of libssh
|
||||||
#include <libssh/callbacks.h>
|
provided functions.
|
||||||
...
|
|
||||||
ssh_threads_set_callbacks(ssh_threads_get_noop());
|
|
||||||
ssh_init();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
ssh_threads_noop is the threading structure that does nothing. It's the
|
|
||||||
threading callbacks being used by default when you're not using threading.
|
|
||||||
|
|
||||||
@subsection threads_pthread Using libpthread with libssh
|
@subsection threads_pthread Using libpthread with libssh
|
||||||
|
|
||||||
If your application is using libpthread, you may simply use the libpthread
|
Since version 0.8.0, libpthread is the default threads library used by libssh.
|
||||||
threading backend:
|
|
||||||
|
|
||||||
@code
|
To use libpthread, simply link it to you application.
|
||||||
#include <libssh/callbacks.h>
|
|
||||||
...
|
|
||||||
ssh_threads_set_callbacks(ssh_threads_get_pthread());
|
|
||||||
ssh_init();
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
However, you must be sure to link with the library ssh_threads. If
|
|
||||||
you're using gcc, you must use the commandline
|
|
||||||
@code
|
|
||||||
gcc -o output input.c -lssh -lssh_threads
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
|
If you are using libssh statically linked, don't forget to call ssh_init()
|
||||||
|
before using any of libssh provided functions (and ssh_finalize() in the end).
|
||||||
|
|
||||||
@subsection threads_other Using another threading library
|
@subsection threads_other Using another threading library
|
||||||
|
|
||||||
You must find your way in the ssh_threads_callbacks_struct structure. You must
|
Since version 0.8.0, libssh does not support custom threading libraries.
|
||||||
implement the following methods :
|
The change makes sense since the newer versions for libcrypto (OpenSSL) and
|
||||||
- mutex_lock
|
libgcrypt don't support custom threading libraries.
|
||||||
- mutex_unlock
|
|
||||||
- mutex_init
|
The default used threading library is libpthread.
|
||||||
- mutex_destroy
|
Alternatively, in Windows environment, CriticalSection based mutex control can
|
||||||
- thread_id
|
be used.
|
||||||
|
|
||||||
|
If your system does not support libpthread nor CriticalSection based mutex
|
||||||
|
control, unfortunately, you cannot use libssh in multithreaded scenarios.
|
||||||
|
|
||||||
libgcrypt 1.6 and bigger backend does not support custom callback. Using anything else than pthreads (ssh_threads_get_pthread()) here will fail.
|
|
||||||
Good luck !
|
Good luck !
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -11,52 +11,63 @@ include_directories(
|
|||||||
${CMAKE_BINARY_DIR}
|
${CMAKE_BINARY_DIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
if (BSD OR SOLARIS OR OSX)
|
if (ARGP_INCLUDE_DIR)
|
||||||
find_package(Argp)
|
include_directories(${ARGP_INCLUDE_DIR})
|
||||||
endif (BSD OR SOLARIS OR OSX)
|
endif()
|
||||||
|
|
||||||
if (UNIX AND NOT WIN32)
|
if (UNIX AND NOT WIN32)
|
||||||
add_executable(libssh_scp libssh_scp.c ${examples_SRCS})
|
add_executable(libssh_scp libssh_scp.c ${examples_SRCS})
|
||||||
|
target_compile_options(libssh_scp PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(libssh_scp ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(libssh_scp ${LIBSSH_SHARED_LIBRARY})
|
||||||
|
|
||||||
add_executable(scp_download scp_download.c ${examples_SRCS})
|
add_executable(scp_download scp_download.c ${examples_SRCS})
|
||||||
|
target_compile_options(scp_download PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(scp_download ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(scp_download ${LIBSSH_SHARED_LIBRARY})
|
||||||
|
|
||||||
add_executable(sshnetcat sshnetcat.c ${examples_SRCS})
|
add_executable(sshnetcat sshnetcat.c ${examples_SRCS})
|
||||||
|
target_compile_options(sshnetcat PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(sshnetcat ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(sshnetcat ${LIBSSH_SHARED_LIBRARY})
|
||||||
|
|
||||||
if (WITH_SFTP)
|
if (WITH_SFTP)
|
||||||
add_executable(samplesftp samplesftp.c ${examples_SRCS})
|
add_executable(samplesftp samplesftp.c ${examples_SRCS})
|
||||||
|
target_compile_options(samplesftp PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(samplesftp ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(samplesftp ${LIBSSH_SHARED_LIBRARY})
|
||||||
endif (WITH_SFTP)
|
endif (WITH_SFTP)
|
||||||
|
|
||||||
add_executable(samplessh sample.c ${examples_SRCS})
|
add_executable(ssh-client ssh_client.c ${examples_SRCS})
|
||||||
target_link_libraries(samplessh ${LIBSSH_SHARED_LIBRARY})
|
target_compile_options(ssh-client PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
target_link_libraries(ssh-client ${LIBSSH_SHARED_LIBRARY})
|
||||||
|
|
||||||
if (WITH_SERVER)
|
if (WITH_SERVER AND (ARGP_LIBRARY OR HAVE_ARGP_H))
|
||||||
if (HAVE_LIBUTIL)
|
if (HAVE_LIBUTIL)
|
||||||
add_executable(ssh_server_fork ssh_server_fork.c)
|
add_executable(ssh_server_fork ssh_server_fork.c)
|
||||||
target_link_libraries(ssh_server_fork ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARIES} util)
|
target_compile_options(ssh_server_fork PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
target_link_libraries(ssh_server_fork ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY} util)
|
||||||
endif (HAVE_LIBUTIL)
|
endif (HAVE_LIBUTIL)
|
||||||
|
|
||||||
if (WITH_GSSAPI AND GSSAPI_FOUND)
|
if (WITH_GSSAPI AND GSSAPI_FOUND)
|
||||||
add_executable(samplesshd-cb samplesshd-cb.c)
|
add_executable(samplesshd-cb samplesshd-cb.c)
|
||||||
target_link_libraries(samplesshd-cb ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARIES})
|
target_compile_options(samplesshd-cb PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
target_link_libraries(samplesshd-cb ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY})
|
||||||
|
|
||||||
add_executable(proxy proxy.c)
|
add_executable(proxy proxy.c)
|
||||||
target_link_libraries(proxy ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARIES})
|
target_compile_options(proxy PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
target_link_libraries(proxy ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY})
|
||||||
endif (WITH_GSSAPI AND GSSAPI_FOUND)
|
endif (WITH_GSSAPI AND GSSAPI_FOUND)
|
||||||
|
|
||||||
add_executable(samplesshd-kbdint samplesshd-kbdint.c)
|
add_executable(samplesshd-kbdint samplesshd-kbdint.c)
|
||||||
target_link_libraries(samplesshd-kbdint ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARIES})
|
target_compile_options(samplesshd-kbdint PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
|
target_link_libraries(samplesshd-kbdint ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY})
|
||||||
|
|
||||||
endif (WITH_SERVER)
|
endif()
|
||||||
endif (UNIX AND NOT WIN32)
|
endif (UNIX AND NOT WIN32)
|
||||||
|
|
||||||
add_executable(exec exec.c ${examples_SRCS})
|
add_executable(exec exec.c ${examples_SRCS})
|
||||||
|
target_compile_options(exec PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(exec ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(exec ${LIBSSH_SHARED_LIBRARY})
|
||||||
|
|
||||||
add_executable(senddata senddata.c ${examples_SRCS})
|
add_executable(senddata senddata.c ${examples_SRCS})
|
||||||
|
target_compile_options(senddata PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
||||||
target_link_libraries(senddata ${LIBSSH_SHARED_LIBRARY})
|
target_link_libraries(senddata ${LIBSSH_SHARED_LIBRARY})
|
||||||
|
|
||||||
add_executable(libsshpp libsshpp.cpp)
|
add_executable(libsshpp libsshpp.cpp)
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ clients must be made or how a client should react.
|
|||||||
#include <libssh/libssh.h>
|
#include <libssh/libssh.h>
|
||||||
#include "examples_common.h"
|
#include "examples_common.h"
|
||||||
|
|
||||||
int authenticate_kbdint(ssh_session session, const char *password) {
|
int authenticate_kbdint(ssh_session session, const char *password)
|
||||||
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = ssh_userauth_kbdint(session, NULL, NULL);
|
err = ssh_userauth_kbdint(session, NULL, NULL);
|
||||||
@@ -99,78 +100,80 @@ int authenticate_kbdint(ssh_session session, const char *password) {
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void error(ssh_session session){
|
static void error(ssh_session session)
|
||||||
fprintf(stderr,"Authentication failed: %s\n",ssh_get_error(session));
|
{
|
||||||
|
fprintf(stderr,"Authentication failed: %s\n",ssh_get_error(session));
|
||||||
}
|
}
|
||||||
|
|
||||||
int authenticate_console(ssh_session session){
|
int authenticate_console(ssh_session session)
|
||||||
int rc;
|
{
|
||||||
int method;
|
int rc;
|
||||||
char password[128] = {0};
|
int method;
|
||||||
char *banner;
|
char password[128] = {0};
|
||||||
|
char *banner;
|
||||||
|
|
||||||
|
// Try to authenticate
|
||||||
|
rc = ssh_userauth_none(session, NULL);
|
||||||
|
if (rc == SSH_AUTH_ERROR) {
|
||||||
|
error(session);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
method = ssh_userauth_list(session, NULL);
|
||||||
|
while (rc != SSH_AUTH_SUCCESS) {
|
||||||
|
if (method & SSH_AUTH_METHOD_GSSAPI_MIC){
|
||||||
|
rc = ssh_userauth_gssapi(session);
|
||||||
|
if(rc == SSH_AUTH_ERROR) {
|
||||||
|
error(session);
|
||||||
|
return rc;
|
||||||
|
} else if (rc == SSH_AUTH_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Try to authenticate with public key first
|
||||||
|
if (method & SSH_AUTH_METHOD_PUBLICKEY) {
|
||||||
|
rc = ssh_userauth_publickey_auto(session, NULL, NULL);
|
||||||
|
if (rc == SSH_AUTH_ERROR) {
|
||||||
|
error(session);
|
||||||
|
return rc;
|
||||||
|
} else if (rc == SSH_AUTH_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to authenticate with keyboard interactive";
|
||||||
|
if (method & SSH_AUTH_METHOD_INTERACTIVE) {
|
||||||
|
rc = authenticate_kbdint(session, NULL);
|
||||||
|
if (rc == SSH_AUTH_ERROR) {
|
||||||
|
error(session);
|
||||||
|
return rc;
|
||||||
|
} else if (rc == SSH_AUTH_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ssh_getpass("Password: ", password, sizeof(password), 0, 0) < 0) {
|
||||||
|
return SSH_AUTH_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to authenticate with password
|
||||||
|
if (method & SSH_AUTH_METHOD_PASSWORD) {
|
||||||
|
rc = ssh_userauth_password(session, NULL, password);
|
||||||
|
if (rc == SSH_AUTH_ERROR) {
|
||||||
|
error(session);
|
||||||
|
return rc;
|
||||||
|
} else if (rc == SSH_AUTH_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memset(password, 0, sizeof(password));
|
||||||
|
}
|
||||||
|
|
||||||
|
banner = ssh_get_issue_banner(session);
|
||||||
|
if (banner) {
|
||||||
|
printf("%s\n",banner);
|
||||||
|
ssh_string_free_char(banner);
|
||||||
|
}
|
||||||
|
|
||||||
// Try to authenticate
|
|
||||||
rc = ssh_userauth_none(session, NULL);
|
|
||||||
if (rc == SSH_AUTH_ERROR) {
|
|
||||||
error(session);
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
|
||||||
|
|
||||||
method = ssh_userauth_list(session, NULL);
|
|
||||||
while (rc != SSH_AUTH_SUCCESS) {
|
|
||||||
if (method & SSH_AUTH_METHOD_GSSAPI_MIC){
|
|
||||||
rc = ssh_userauth_gssapi(session);
|
|
||||||
if(rc == SSH_AUTH_ERROR) {
|
|
||||||
error(session);
|
|
||||||
return rc;
|
|
||||||
} else if (rc == SSH_AUTH_SUCCESS) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Try to authenticate with public key first
|
|
||||||
if (method & SSH_AUTH_METHOD_PUBLICKEY) {
|
|
||||||
rc = ssh_userauth_publickey_auto(session, NULL, NULL);
|
|
||||||
if (rc == SSH_AUTH_ERROR) {
|
|
||||||
error(session);
|
|
||||||
return rc;
|
|
||||||
} else if (rc == SSH_AUTH_SUCCESS) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to authenticate with keyboard interactive";
|
|
||||||
if (method & SSH_AUTH_METHOD_INTERACTIVE) {
|
|
||||||
rc = authenticate_kbdint(session, NULL);
|
|
||||||
if (rc == SSH_AUTH_ERROR) {
|
|
||||||
error(session);
|
|
||||||
return rc;
|
|
||||||
} else if (rc == SSH_AUTH_SUCCESS) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ssh_getpass("Password: ", password, sizeof(password), 0, 0) < 0) {
|
|
||||||
return SSH_AUTH_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to authenticate with password
|
|
||||||
if (method & SSH_AUTH_METHOD_PASSWORD) {
|
|
||||||
rc = ssh_userauth_password(session, NULL, password);
|
|
||||||
if (rc == SSH_AUTH_ERROR) {
|
|
||||||
error(session);
|
|
||||||
return rc;
|
|
||||||
} else if (rc == SSH_AUTH_SUCCESS) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
memset(password, 0, sizeof(password));
|
|
||||||
}
|
|
||||||
|
|
||||||
banner = ssh_get_issue_banner(session);
|
|
||||||
if (banner) {
|
|
||||||
printf("%s\n",banner);
|
|
||||||
ssh_string_free_char(banner);
|
|
||||||
}
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,14 @@ The goal is to show the API in action. It's not a reference on how terminal
|
|||||||
clients must be made or how a client should react.
|
clients must be made or how a client should react.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "libssh/priv.h"
|
||||||
#include <libssh/libssh.h>
|
#include <libssh/libssh.h>
|
||||||
#include "examples_common.h"
|
#include "examples_common.h"
|
||||||
|
|
||||||
@@ -30,23 +33,20 @@ clients must be made or how a client should react.
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int verify_knownhost(ssh_session session){
|
int verify_knownhost(ssh_session session){
|
||||||
char *hexa;
|
enum ssh_known_hosts_e state;
|
||||||
int state;
|
|
||||||
char buf[10];
|
char buf[10];
|
||||||
unsigned char *hash = NULL;
|
unsigned char *hash = NULL;
|
||||||
size_t hlen;
|
size_t hlen;
|
||||||
ssh_key srv_pubkey;
|
ssh_key srv_pubkey;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
state=ssh_is_server_known(session);
|
rc = ssh_get_server_publickey(session, &srv_pubkey);
|
||||||
|
|
||||||
rc = ssh_get_publickey(session, &srv_pubkey);
|
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ssh_get_publickey_hash(srv_pubkey,
|
rc = ssh_get_publickey_hash(srv_pubkey,
|
||||||
SSH_PUBLICKEY_HASH_SHA1,
|
SSH_PUBLICKEY_HASH_SHA256,
|
||||||
&hash,
|
&hash,
|
||||||
&hlen);
|
&hlen);
|
||||||
ssh_key_free(srv_pubkey);
|
ssh_key_free(srv_pubkey);
|
||||||
@@ -54,30 +54,33 @@ int verify_knownhost(ssh_session session){
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state = ssh_session_is_known_server(session);
|
||||||
|
|
||||||
switch(state){
|
switch(state){
|
||||||
case SSH_SERVER_KNOWN_OK:
|
case SSH_KNOWN_HOSTS_OK:
|
||||||
break; /* ok */
|
break; /* ok */
|
||||||
case SSH_SERVER_KNOWN_CHANGED:
|
case SSH_KNOWN_HOSTS_CHANGED:
|
||||||
fprintf(stderr,"Host key for server changed : server's one is now :\n");
|
fprintf(stderr,"Host key for server changed : server's one is now :\n");
|
||||||
ssh_print_hexa("Public key hash",hash, hlen);
|
ssh_print_hash(SSH_PUBLICKEY_HASH_SHA256, hash, hlen);
|
||||||
ssh_clean_pubkey_hash(&hash);
|
ssh_clean_pubkey_hash(&hash);
|
||||||
fprintf(stderr,"For security reason, connection will be stopped\n");
|
fprintf(stderr,"For security reason, connection will be stopped\n");
|
||||||
return -1;
|
return -1;
|
||||||
case SSH_SERVER_FOUND_OTHER:
|
case SSH_KNOWN_HOSTS_OTHER:
|
||||||
fprintf(stderr,"The host key for this server was not found but an other type of key exists.\n");
|
fprintf(stderr,"The host key for this server was not found but an other type of key exists.\n");
|
||||||
fprintf(stderr,"An attacker might change the default server key to confuse your client"
|
fprintf(stderr,"An attacker might change the default server key to confuse your client"
|
||||||
"into thinking the key does not exist\n"
|
"into thinking the key does not exist\n"
|
||||||
"We advise you to rerun the client with -d or -r for more safety.\n");
|
"We advise you to rerun the client with -d or -r for more safety.\n");
|
||||||
return -1;
|
return -1;
|
||||||
case SSH_SERVER_FILE_NOT_FOUND:
|
case SSH_KNOWN_HOSTS_NOT_FOUND:
|
||||||
fprintf(stderr,"Could not find known host file. If you accept the host key here,\n");
|
fprintf(stderr,"Could not find known host file. If you accept the host key here,\n");
|
||||||
fprintf(stderr,"the file will be automatically created.\n");
|
fprintf(stderr,"the file will be automatically created.\n");
|
||||||
/* fallback to SSH_SERVER_NOT_KNOWN behavior */
|
/* fallback to SSH_SERVER_NOT_KNOWN behavior */
|
||||||
|
FALL_THROUGH;
|
||||||
case SSH_SERVER_NOT_KNOWN:
|
case SSH_SERVER_NOT_KNOWN:
|
||||||
hexa = ssh_get_hexa(hash, hlen);
|
fprintf(stderr,
|
||||||
fprintf(stderr,"The server is unknown. Do you trust the host key ?\n");
|
"The server is unknown. Do you trust the host key (yes/no)?\n");
|
||||||
fprintf(stderr, "Public key hash: %s\n", hexa);
|
ssh_print_hash(SSH_PUBLICKEY_HASH_SHA256, hash, hlen);
|
||||||
ssh_string_free_char(hexa);
|
|
||||||
if (fgets(buf, sizeof(buf), stdin) == NULL) {
|
if (fgets(buf, sizeof(buf), stdin) == NULL) {
|
||||||
ssh_clean_pubkey_hash(&hash);
|
ssh_clean_pubkey_hash(&hash);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -100,7 +103,7 @@ int verify_knownhost(ssh_session session){
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case SSH_SERVER_ERROR:
|
case SSH_KNOWN_HOSTS_ERROR:
|
||||||
ssh_clean_pubkey_hash(&hash);
|
ssh_clean_pubkey_hash(&hash);
|
||||||
fprintf(stderr,"%s",ssh_get_error(session));
|
fprintf(stderr,"%s",ssh_get_error(session));
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@@ -25,148 +25,230 @@ program.
|
|||||||
static char **sources;
|
static char **sources;
|
||||||
static int nsources;
|
static int nsources;
|
||||||
static char *destination;
|
static char *destination;
|
||||||
static int verbosity=0;
|
static int verbosity = 0;
|
||||||
|
|
||||||
struct location {
|
struct location {
|
||||||
int is_ssh;
|
int is_ssh;
|
||||||
char *user;
|
char *user;
|
||||||
char *host;
|
char *host;
|
||||||
char *path;
|
char *path;
|
||||||
ssh_session session;
|
ssh_session session;
|
||||||
ssh_scp scp;
|
ssh_scp scp;
|
||||||
FILE *file;
|
FILE *file;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
READ,
|
READ,
|
||||||
WRITE
|
WRITE
|
||||||
};
|
};
|
||||||
|
|
||||||
static void usage(const char *argv0){
|
static void usage(const char *argv0) {
|
||||||
fprintf(stderr,"Usage : %s [options] [[user@]host1:]file1 ... \n"
|
fprintf(stderr, "Usage : %s [options] [[user@]host1:]file1 ... \n"
|
||||||
" [[user@]host2:]destination\n"
|
" [[user@]host2:]destination\n"
|
||||||
"sample scp client - libssh-%s\n",
|
"sample scp client - libssh-%s\n",
|
||||||
// "Options :\n",
|
// "Options :\n",
|
||||||
// " -r : use RSA to verify host public key\n",
|
// " -r : use RSA to verify host public key\n",
|
||||||
argv0,
|
argv0,
|
||||||
ssh_version(0));
|
ssh_version(0));
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opts(int argc, char **argv){
|
static int opts(int argc, char **argv) {
|
||||||
int i;
|
int i;
|
||||||
while((i=getopt(argc,argv,"v"))!=-1){
|
|
||||||
switch(i){
|
while((i = getopt(argc, argv, "v")) != -1) {
|
||||||
case 'v':
|
switch(i) {
|
||||||
verbosity++;
|
case 'v':
|
||||||
break;
|
verbosity++;
|
||||||
default:
|
break;
|
||||||
fprintf(stderr,"unknown option %c\n",optopt);
|
default:
|
||||||
|
fprintf(stderr, "unknown option %c\n", optopt);
|
||||||
|
usage(argv[0]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsources = argc - optind - 1;
|
||||||
|
if (nsources < 1) {
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
nsources=argc-optind-1;
|
sources = malloc((nsources + 1) * sizeof(char *));
|
||||||
if(nsources < 1){
|
if (sources == NULL) {
|
||||||
usage(argv[0]);
|
return -1;
|
||||||
return -1;
|
}
|
||||||
}
|
|
||||||
sources=malloc((nsources + 1) * sizeof(char *));
|
for(i = 0; i < nsources; ++i) {
|
||||||
if(sources == NULL)
|
sources[i] = argv[optind];
|
||||||
return -1;
|
optind++;
|
||||||
for(i=0;i<nsources;++i){
|
}
|
||||||
sources[i] = argv[optind];
|
|
||||||
optind++;
|
sources[i] = NULL;
|
||||||
}
|
destination = argv[optind];
|
||||||
sources[i]=NULL;
|
return 0;
|
||||||
destination=argv[optind];
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct location *parse_location(char *loc){
|
static void location_free(struct location *loc)
|
||||||
struct location *location;
|
{
|
||||||
char *ptr;
|
if (loc) {
|
||||||
|
if (loc->path) {
|
||||||
|
free(loc->path);
|
||||||
|
}
|
||||||
|
loc->path = NULL;
|
||||||
|
if (loc->is_ssh) {
|
||||||
|
if (loc->host) {
|
||||||
|
free(loc->host);
|
||||||
|
}
|
||||||
|
loc->host = NULL;
|
||||||
|
if (loc->user) {
|
||||||
|
free(loc->user);
|
||||||
|
}
|
||||||
|
loc->user = NULL;
|
||||||
|
if (loc->host) {
|
||||||
|
free(loc->host);
|
||||||
|
}
|
||||||
|
loc->host = NULL;
|
||||||
|
}
|
||||||
|
free(loc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
location = malloc(sizeof(struct location));
|
static struct location *parse_location(char *loc) {
|
||||||
if (location == NULL) {
|
struct location *location;
|
||||||
return NULL;
|
char *ptr;
|
||||||
}
|
|
||||||
memset(location, 0, sizeof(struct location));
|
|
||||||
|
|
||||||
location->host=location->user=NULL;
|
location = malloc(sizeof(struct location));
|
||||||
ptr=strchr(loc,':');
|
if (location == NULL) {
|
||||||
if(ptr != NULL){
|
return NULL;
|
||||||
location->is_ssh=1;
|
}
|
||||||
location->path=strdup(ptr+1);
|
memset(location, 0, sizeof(struct location));
|
||||||
*ptr='\0';
|
|
||||||
ptr=strchr(loc,'@');
|
location->host = location->user = NULL;
|
||||||
if(ptr != NULL){
|
ptr = strchr(loc, ':');
|
||||||
location->host=strdup(ptr+1);
|
|
||||||
*ptr='\0';
|
if (ptr != NULL) {
|
||||||
location->user=strdup(loc);
|
location->is_ssh = 1;
|
||||||
|
location->path = strdup(ptr+1);
|
||||||
|
*ptr = '\0';
|
||||||
|
ptr = strchr(loc, '@');
|
||||||
|
|
||||||
|
if (ptr != NULL) {
|
||||||
|
location->host = strdup(ptr+1);
|
||||||
|
*ptr = '\0';
|
||||||
|
location->user = strdup(loc);
|
||||||
|
} else {
|
||||||
|
location->host = strdup(loc);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
location->host=strdup(loc);
|
location->is_ssh = 0;
|
||||||
|
location->path = strdup(loc);
|
||||||
}
|
}
|
||||||
} else {
|
return location;
|
||||||
location->is_ssh=0;
|
|
||||||
location->path=strdup(loc);
|
|
||||||
}
|
|
||||||
return location;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int open_location(struct location *loc, int flag){
|
static void close_location(struct location *loc) {
|
||||||
if(loc->is_ssh && flag==WRITE){
|
int rc;
|
||||||
loc->session=connect_ssh(loc->host,loc->user,verbosity);
|
|
||||||
if(!loc->session){
|
if (loc) {
|
||||||
fprintf(stderr,"Couldn't connect to %s\n",loc->host);
|
if (loc->is_ssh) {
|
||||||
return -1;
|
if (loc->scp) {
|
||||||
|
rc = ssh_scp_close(loc->scp);
|
||||||
|
if (rc == SSH_ERROR) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error closing scp: %s\n",
|
||||||
|
ssh_get_error(loc->session));
|
||||||
|
}
|
||||||
|
ssh_scp_free(loc->scp);
|
||||||
|
loc->scp = NULL;
|
||||||
|
}
|
||||||
|
if (loc->session) {
|
||||||
|
ssh_disconnect(loc->session);
|
||||||
|
ssh_free(loc->session);
|
||||||
|
loc->session = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (loc->file) {
|
||||||
|
fclose(loc->file);
|
||||||
|
loc->file = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
loc->scp=ssh_scp_new(loc->session,SSH_SCP_WRITE,loc->path);
|
}
|
||||||
if(!loc->scp){
|
|
||||||
fprintf(stderr,"error : %s\n",ssh_get_error(loc->session));
|
static int open_location(struct location *loc, int flag) {
|
||||||
return -1;
|
if (loc->is_ssh && flag == WRITE) {
|
||||||
|
loc->session = connect_ssh(loc->host, loc->user, verbosity);
|
||||||
|
if (!loc->session) {
|
||||||
|
fprintf(stderr, "Couldn't connect to %s\n", loc->host);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
loc->scp = ssh_scp_new(loc->session, SSH_SCP_WRITE, loc->path);
|
||||||
|
if (!loc->scp) {
|
||||||
|
fprintf(stderr, "error : %s\n", ssh_get_error(loc->session));
|
||||||
|
ssh_disconnect(loc->session);
|
||||||
|
ssh_free(loc->session);
|
||||||
|
loc->session = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ssh_scp_init(loc->scp) == SSH_ERROR) {
|
||||||
|
fprintf(stderr, "error : %s\n", ssh_get_error(loc->session));
|
||||||
|
ssh_scp_free(loc->scp);
|
||||||
|
loc->scp = NULL;
|
||||||
|
ssh_disconnect(loc->session);
|
||||||
|
ssh_free(loc->session);
|
||||||
|
loc->session = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
} else if (loc->is_ssh && flag == READ) {
|
||||||
|
loc->session = connect_ssh(loc->host, loc->user, verbosity);
|
||||||
|
if (!loc->session) {
|
||||||
|
fprintf(stderr, "Couldn't connect to %s\n", loc->host);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
loc->scp = ssh_scp_new(loc->session, SSH_SCP_READ, loc->path);
|
||||||
|
if (!loc->scp) {
|
||||||
|
fprintf(stderr, "error : %s\n", ssh_get_error(loc->session));
|
||||||
|
ssh_disconnect(loc->session);
|
||||||
|
ssh_free(loc->session);
|
||||||
|
loc->session = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ssh_scp_init(loc->scp) == SSH_ERROR) {
|
||||||
|
fprintf(stderr, "error : %s\n", ssh_get_error(loc->session));
|
||||||
|
ssh_scp_free(loc->scp);
|
||||||
|
loc->scp = NULL;
|
||||||
|
ssh_disconnect(loc->session);
|
||||||
|
ssh_free(loc->session);
|
||||||
|
loc->session = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
loc->file = fopen(loc->path, flag == READ ? "r":"w");
|
||||||
|
if (!loc->file) {
|
||||||
|
if (errno == EISDIR) {
|
||||||
|
if (chdir(loc->path)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error changing directory to %s: %s\n",
|
||||||
|
loc->path, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error opening %s: %s\n",
|
||||||
|
loc->path, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
if(ssh_scp_init(loc->scp)==SSH_ERROR){
|
return -1;
|
||||||
fprintf(stderr,"error : %s\n",ssh_get_error(loc->session));
|
|
||||||
ssh_scp_free(loc->scp);
|
|
||||||
loc->scp = NULL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
} else if(loc->is_ssh && flag==READ){
|
|
||||||
loc->session=connect_ssh(loc->host, loc->user,verbosity);
|
|
||||||
if(!loc->session){
|
|
||||||
fprintf(stderr,"Couldn't connect to %s\n",loc->host);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
loc->scp=ssh_scp_new(loc->session,SSH_SCP_READ,loc->path);
|
|
||||||
if(!loc->scp){
|
|
||||||
fprintf(stderr,"error : %s\n",ssh_get_error(loc->session));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if(ssh_scp_init(loc->scp)==SSH_ERROR){
|
|
||||||
fprintf(stderr,"error : %s\n",ssh_get_error(loc->session));
|
|
||||||
ssh_scp_free(loc->scp);
|
|
||||||
loc->scp = NULL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
loc->file=fopen(loc->path,flag==READ ? "r":"w");
|
|
||||||
if(!loc->file){
|
|
||||||
if(errno==EISDIR){
|
|
||||||
if(chdir(loc->path)){
|
|
||||||
fprintf(stderr,"Error changing directory to %s: %s\n",loc->path,strerror(errno));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
fprintf(stderr,"Error opening %s: %s\n",loc->path,strerror(errno));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @brief copies files from source location to destination
|
/** @brief copies files from source location to destination
|
||||||
@@ -174,155 +256,197 @@ static int open_location(struct location *loc, int flag){
|
|||||||
* @param dest destination location
|
* @param dest destination location
|
||||||
* @param recursive Copy also directories
|
* @param recursive Copy also directories
|
||||||
*/
|
*/
|
||||||
static int do_copy(struct location *src, struct location *dest, int recursive){
|
static int do_copy(struct location *src, struct location *dest, int recursive) {
|
||||||
int size;
|
int size;
|
||||||
socket_t fd;
|
socket_t fd;
|
||||||
struct stat s;
|
struct stat s;
|
||||||
int w,r;
|
int w, r;
|
||||||
char buffer[16384];
|
char buffer[16384];
|
||||||
int total=0;
|
int total = 0;
|
||||||
int mode;
|
int mode;
|
||||||
char *filename = NULL;
|
char *filename = NULL;
|
||||||
/* recursive mode doesn't work yet */
|
/* recursive mode doesn't work yet */
|
||||||
(void)recursive;
|
(void)recursive;
|
||||||
/* Get the file name and size*/
|
/* Get the file name and size*/
|
||||||
if(!src->is_ssh){
|
if (!src->is_ssh) {
|
||||||
fd = fileno(src->file);
|
fd = fileno(src->file);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
fprintf(stderr, "Invalid file pointer, error: %s\n", strerror(errno));
|
fprintf(stderr,
|
||||||
return -1;
|
"Invalid file pointer, error: %s\n",
|
||||||
}
|
strerror(errno));
|
||||||
r = fstat(fd, &s);
|
return -1;
|
||||||
if (r < 0) {
|
}
|
||||||
return -1;
|
r = fstat(fd, &s);
|
||||||
}
|
if (r < 0) {
|
||||||
size=s.st_size;
|
return -1;
|
||||||
mode = s.st_mode & ~S_IFMT;
|
}
|
||||||
filename=ssh_basename(src->path);
|
size = s.st_size;
|
||||||
} else {
|
mode = s.st_mode & ~S_IFMT;
|
||||||
size=0;
|
filename = ssh_basename(src->path);
|
||||||
do {
|
} else {
|
||||||
r=ssh_scp_pull_request(src->scp);
|
size = 0;
|
||||||
if(r==SSH_SCP_REQUEST_NEWDIR){
|
do {
|
||||||
ssh_scp_deny_request(src->scp,"Not in recursive mode");
|
r = ssh_scp_pull_request(src->scp);
|
||||||
continue;
|
if (r == SSH_SCP_REQUEST_NEWDIR) {
|
||||||
}
|
ssh_scp_deny_request(src->scp, "Not in recursive mode");
|
||||||
if(r==SSH_SCP_REQUEST_NEWFILE){
|
continue;
|
||||||
size=ssh_scp_request_get_size(src->scp);
|
}
|
||||||
filename=strdup(ssh_scp_request_get_filename(src->scp));
|
if (r == SSH_SCP_REQUEST_NEWFILE) {
|
||||||
mode=ssh_scp_request_get_permissions(src->scp);
|
size = ssh_scp_request_get_size(src->scp);
|
||||||
//ssh_scp_accept_request(src->scp);
|
filename = strdup(ssh_scp_request_get_filename(src->scp));
|
||||||
break;
|
mode = ssh_scp_request_get_permissions(src->scp);
|
||||||
}
|
//ssh_scp_accept_request(src->scp);
|
||||||
if(r==SSH_ERROR){
|
break;
|
||||||
fprintf(stderr,"Error: %s\n",ssh_get_error(src->session));
|
}
|
||||||
|
if (r == SSH_ERROR) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error: %s\n",
|
||||||
|
ssh_get_error(src->session));
|
||||||
ssh_string_free_char(filename);
|
ssh_string_free_char(filename);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} while(r != SSH_SCP_REQUEST_NEWFILE);
|
} while(r != SSH_SCP_REQUEST_NEWFILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dest->is_ssh){
|
if (dest->is_ssh) {
|
||||||
r=ssh_scp_push_file(dest->scp,src->path, size, mode);
|
r = ssh_scp_push_file(dest->scp, src->path, size, mode);
|
||||||
// snprintf(buffer,sizeof(buffer),"C0644 %d %s\n",size,src->path);
|
// snprintf(buffer, sizeof(buffer), "C0644 %d %s\n", size, src->path);
|
||||||
if(r==SSH_ERROR){
|
if (r == SSH_ERROR) {
|
||||||
fprintf(stderr,"error: %s\n",ssh_get_error(dest->session));
|
fprintf(stderr,
|
||||||
ssh_string_free_char(filename);
|
"error: %s\n",
|
||||||
ssh_scp_free(dest->scp);
|
ssh_get_error(dest->session));
|
||||||
dest->scp = NULL;
|
ssh_string_free_char(filename);
|
||||||
return -1;
|
ssh_scp_free(dest->scp);
|
||||||
}
|
dest->scp = NULL;
|
||||||
} else {
|
return -1;
|
||||||
if(!dest->file){
|
}
|
||||||
dest->file=fopen(filename,"w");
|
} else {
|
||||||
if(!dest->file){
|
if (!dest->file) {
|
||||||
fprintf(stderr,"Cannot open %s for writing: %s\n",filename,strerror(errno));
|
dest->file = fopen(filename, "w");
|
||||||
if(src->is_ssh)
|
if (!dest->file) {
|
||||||
ssh_scp_deny_request(src->scp,"Cannot open local file");
|
fprintf(stderr,
|
||||||
ssh_string_free_char(filename);
|
"Cannot open %s for writing: %s\n",
|
||||||
return -1;
|
filename, strerror(errno));
|
||||||
}
|
if (src->is_ssh) {
|
||||||
}
|
ssh_scp_deny_request(src->scp, "Cannot open local file");
|
||||||
if(src->is_ssh){
|
}
|
||||||
ssh_scp_accept_request(src->scp);
|
ssh_string_free_char(filename);
|
||||||
}
|
return -1;
|
||||||
}
|
}
|
||||||
do {
|
}
|
||||||
if(src->is_ssh){
|
if (src->is_ssh) {
|
||||||
r=ssh_scp_read(src->scp,buffer,sizeof(buffer));
|
ssh_scp_accept_request(src->scp);
|
||||||
if(r==SSH_ERROR){
|
}
|
||||||
fprintf(stderr,"Error reading scp: %s\n",ssh_get_error(src->session));
|
}
|
||||||
ssh_string_free_char(filename);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if(r==0)
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
r=fread(buffer,1,sizeof(buffer),src->file);
|
|
||||||
if(r==0)
|
|
||||||
break;
|
|
||||||
if(r<0){
|
|
||||||
fprintf(stderr,"Error reading file: %s\n",strerror(errno));
|
|
||||||
ssh_string_free_char(filename);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(dest->is_ssh){
|
|
||||||
w=ssh_scp_write(dest->scp,buffer,r);
|
|
||||||
if(w == SSH_ERROR){
|
|
||||||
fprintf(stderr,"Error writing in scp: %s\n",ssh_get_error(dest->session));
|
|
||||||
ssh_scp_free(dest->scp);
|
|
||||||
dest->scp=NULL;
|
|
||||||
ssh_string_free_char(filename);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
w=fwrite(buffer,r,1,dest->file);
|
|
||||||
if(w<=0){
|
|
||||||
fprintf(stderr,"Error writing in local file: %s\n",strerror(errno));
|
|
||||||
ssh_string_free_char(filename);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
total+=r;
|
|
||||||
|
|
||||||
} while(total < size);
|
do {
|
||||||
ssh_string_free_char(filename);
|
if (src->is_ssh) {
|
||||||
printf("wrote %d bytes\n",total);
|
r = ssh_scp_read(src->scp, buffer, sizeof(buffer));
|
||||||
return 0;
|
if (r == SSH_ERROR) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error reading scp: %s\n",
|
||||||
|
ssh_get_error(src->session));
|
||||||
|
ssh_string_free_char(filename);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
r = fread(buffer, 1, sizeof(buffer), src->file);
|
||||||
|
if (r == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r < 0) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error reading file: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
ssh_string_free_char(filename);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dest->is_ssh) {
|
||||||
|
w = ssh_scp_write(dest->scp, buffer, r);
|
||||||
|
if (w == SSH_ERROR) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error writing in scp: %s\n",
|
||||||
|
ssh_get_error(dest->session));
|
||||||
|
ssh_scp_free(dest->scp);
|
||||||
|
dest->scp = NULL;
|
||||||
|
ssh_string_free_char(filename);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
w = fwrite(buffer, r, 1, dest->file);
|
||||||
|
if (w <= 0) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error writing in local file: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
ssh_string_free_char(filename);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
total += r;
|
||||||
|
|
||||||
|
} while(total < size);
|
||||||
|
|
||||||
|
ssh_string_free_char(filename);
|
||||||
|
printf("wrote %d bytes\n", total);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv){
|
int main(int argc, char **argv) {
|
||||||
struct location *dest, *src;
|
struct location *dest, *src;
|
||||||
int i;
|
int i;
|
||||||
int r;
|
int r;
|
||||||
if(opts(argc,argv)<0)
|
if (opts(argc, argv) < 0) {
|
||||||
return EXIT_FAILURE;
|
r = EXIT_FAILURE;
|
||||||
dest=parse_location(destination);
|
goto end;
|
||||||
if(open_location(dest,WRITE)<0)
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
for(i=0;i<nsources;++i){
|
|
||||||
src=parse_location(sources[i]);
|
|
||||||
if(open_location(src,READ)<0){
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
}
|
||||||
if(do_copy(src,dest,0) < 0){
|
|
||||||
break;
|
dest = parse_location(destination);
|
||||||
|
if (dest == NULL) {
|
||||||
|
r = EXIT_FAILURE;
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (dest->is_ssh && dest->scp != NULL) {
|
if (open_location(dest, WRITE) < 0) {
|
||||||
r=ssh_scp_close(dest->scp);
|
location_free(dest);
|
||||||
if(r == SSH_ERROR){
|
r = EXIT_FAILURE;
|
||||||
fprintf(stderr,"Error closing scp: %s\n",ssh_get_error(dest->session));
|
goto end;
|
||||||
ssh_scp_free(dest->scp);
|
}
|
||||||
dest->scp=NULL;
|
|
||||||
return -1;
|
for (i = 0; i < nsources; ++i) {
|
||||||
}
|
src = parse_location(sources[i]);
|
||||||
} else {
|
if (src == NULL) {
|
||||||
fclose(dest->file);
|
r = EXIT_FAILURE;
|
||||||
dest->file=NULL;
|
goto close_dest;
|
||||||
}
|
}
|
||||||
ssh_disconnect(dest->session);
|
|
||||||
ssh_finalize();
|
if (open_location(src, READ) < 0) {
|
||||||
return 0;
|
location_free(src);
|
||||||
|
r = EXIT_FAILURE;
|
||||||
|
goto close_dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (do_copy(src, dest, 0) < 0) {
|
||||||
|
close_location(src);
|
||||||
|
location_free(src);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
close_location(src);
|
||||||
|
location_free(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
r = 0;
|
||||||
|
|
||||||
|
close_dest:
|
||||||
|
close_location(dest);
|
||||||
|
location_free(dest);
|
||||||
|
end:
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,523 +0,0 @@
|
|||||||
/* client.c */
|
|
||||||
/*
|
|
||||||
Copyright 2003-2009 Aris Adamantiadis
|
|
||||||
|
|
||||||
This file is part of the SSH Library
|
|
||||||
|
|
||||||
You are free to copy this file, modify it in any way, consider it being public
|
|
||||||
domain. This does not apply to the rest of the library though, but it is
|
|
||||||
allowed to cut-and-paste working code from this file to any license of
|
|
||||||
program.
|
|
||||||
The goal is to show the API in action. It's not a reference on how terminal
|
|
||||||
clients must be made or how a client should react.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <sys/select.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_TERMIOS_H
|
|
||||||
#include <termios.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_UNISTD_H
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_PTY_H
|
|
||||||
#include <pty.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include <libssh/callbacks.h>
|
|
||||||
#include <libssh/libssh.h>
|
|
||||||
#include <libssh/sftp.h>
|
|
||||||
|
|
||||||
|
|
||||||
#include "examples_common.h"
|
|
||||||
#define MAXCMD 10
|
|
||||||
|
|
||||||
static char *host;
|
|
||||||
static char *user;
|
|
||||||
static char *cmds[MAXCMD];
|
|
||||||
static struct termios terminal;
|
|
||||||
|
|
||||||
static char *pcap_file=NULL;
|
|
||||||
|
|
||||||
static char *proxycommand;
|
|
||||||
|
|
||||||
static int auth_callback(const char *prompt, char *buf, size_t len,
|
|
||||||
int echo, int verify, void *userdata) {
|
|
||||||
(void) verify;
|
|
||||||
(void) userdata;
|
|
||||||
|
|
||||||
return ssh_getpass(prompt, buf, len, echo, verify);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ssh_callbacks_struct cb = {
|
|
||||||
.auth_function=auth_callback,
|
|
||||||
.userdata=NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static void add_cmd(char *cmd){
|
|
||||||
int n;
|
|
||||||
|
|
||||||
for (n = 0; (n < MAXCMD) && cmds[n] != NULL; n++);
|
|
||||||
|
|
||||||
if (n == MAXCMD) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
cmds[n]=strdup(cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usage(){
|
|
||||||
fprintf(stderr,"Usage : ssh [options] [login@]hostname\n"
|
|
||||||
"sample client - libssh-%s\n"
|
|
||||||
"Options :\n"
|
|
||||||
" -l user : log in as user\n"
|
|
||||||
" -p port : connect to port\n"
|
|
||||||
" -d : use DSS to verify host public key\n"
|
|
||||||
" -r : use RSA to verify host public key\n"
|
|
||||||
#ifdef WITH_PCAP
|
|
||||||
" -P file : create a pcap debugging file\n"
|
|
||||||
#endif
|
|
||||||
#ifndef _WIN32
|
|
||||||
" -T proxycommand : command to execute as a socket proxy\n"
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
ssh_version(0));
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int opts(int argc, char **argv){
|
|
||||||
int i;
|
|
||||||
// for(i=0;i<argc;i++)
|
|
||||||
// printf("%d : %s\n",i,argv[i]);
|
|
||||||
/* insert your own arguments here */
|
|
||||||
while((i=getopt(argc,argv,"T:P:"))!=-1){
|
|
||||||
switch(i){
|
|
||||||
case 'P':
|
|
||||||
pcap_file=optarg;
|
|
||||||
break;
|
|
||||||
#ifndef _WIN32
|
|
||||||
case 'T':
|
|
||||||
proxycommand=optarg;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
fprintf(stderr,"unknown option %c\n",optopt);
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(optind < argc)
|
|
||||||
host=argv[optind++];
|
|
||||||
while(optind < argc)
|
|
||||||
add_cmd(argv[optind++]);
|
|
||||||
if(host==NULL)
|
|
||||||
usage();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef HAVE_CFMAKERAW
|
|
||||||
static void cfmakeraw(struct termios *termios_p){
|
|
||||||
termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
|
|
||||||
termios_p->c_oflag &= ~OPOST;
|
|
||||||
termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
|
|
||||||
termios_p->c_cflag &= ~(CSIZE|PARENB);
|
|
||||||
termios_p->c_cflag |= CS8;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static void do_cleanup(int i) {
|
|
||||||
/* unused variable */
|
|
||||||
(void) i;
|
|
||||||
|
|
||||||
tcsetattr(0,TCSANOW,&terminal);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void do_exit(int i) {
|
|
||||||
/* unused variable */
|
|
||||||
(void) i;
|
|
||||||
|
|
||||||
do_cleanup(0);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ssh_channel chan;
|
|
||||||
int signal_delayed=0;
|
|
||||||
|
|
||||||
static void sigwindowchanged(int i){
|
|
||||||
(void) i;
|
|
||||||
signal_delayed=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void setsignal(void){
|
|
||||||
signal(SIGWINCH, sigwindowchanged);
|
|
||||||
signal_delayed=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void sizechanged(void){
|
|
||||||
struct winsize win = { 0, 0, 0, 0 };
|
|
||||||
ioctl(1, TIOCGWINSZ, &win);
|
|
||||||
ssh_channel_change_pty_size(chan,win.ws_col, win.ws_row);
|
|
||||||
// printf("Changed pty size\n");
|
|
||||||
setsignal();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* There are two flavors of select loop: the one based on
|
|
||||||
* ssh_select and the one based on channel_select.
|
|
||||||
* The ssh_select one permits you to give your own file descriptors to
|
|
||||||
* follow. It is thus a complete select loop.
|
|
||||||
* The second one only selects on channels. It is simplier to use
|
|
||||||
* but doesn't permit you to fill in your own file descriptor. It is
|
|
||||||
* more adapted if you can't use ssh_select as a main loop (because
|
|
||||||
* you already have another main loop system).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef USE_CHANNEL_SELECT
|
|
||||||
|
|
||||||
/* channel_select base main loop, with a standard select(2)
|
|
||||||
*/
|
|
||||||
static void select_loop(ssh_session session,ssh_channel channel){
|
|
||||||
fd_set fds;
|
|
||||||
struct timeval timeout;
|
|
||||||
char buffer[4096];
|
|
||||||
ssh_buffer readbuf=ssh_buffer_new();
|
|
||||||
ssh_channel channels[2];
|
|
||||||
int lus;
|
|
||||||
int eof=0;
|
|
||||||
int maxfd;
|
|
||||||
int ret;
|
|
||||||
while(channel){
|
|
||||||
/* when a signal is caught, ssh_select will return
|
|
||||||
* with SSH_EINTR, which means it should be started
|
|
||||||
* again. It lets you handle the signal the faster you
|
|
||||||
* can, like in this window changed example. Of course, if
|
|
||||||
* your signal handler doesn't call libssh at all, you're
|
|
||||||
* free to handle signals directly in sighandler.
|
|
||||||
*/
|
|
||||||
do{
|
|
||||||
FD_ZERO(&fds);
|
|
||||||
if(!eof)
|
|
||||||
FD_SET(0,&fds);
|
|
||||||
timeout.tv_sec=30;
|
|
||||||
timeout.tv_usec=0;
|
|
||||||
FD_SET(ssh_get_fd(session),&fds);
|
|
||||||
maxfd=ssh_get_fd(session)+1;
|
|
||||||
ret=select(maxfd,&fds,NULL,NULL,&timeout);
|
|
||||||
if(ret==EINTR)
|
|
||||||
continue;
|
|
||||||
if(FD_ISSET(0,&fds)){
|
|
||||||
lus=read(0,buffer,sizeof(buffer));
|
|
||||||
if(lus)
|
|
||||||
ssh_channel_write(channel,buffer,lus);
|
|
||||||
else {
|
|
||||||
eof=1;
|
|
||||||
ssh_channel_send_eof(channel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(FD_ISSET(ssh_get_fd(session),&fds)){
|
|
||||||
ssh_set_fd_toread(session);
|
|
||||||
}
|
|
||||||
channels[0]=channel; // set the first channel we want to read from
|
|
||||||
channels[1]=NULL;
|
|
||||||
ret=ssh_channel_select(channels,NULL,NULL,NULL); // no specific timeout - just poll
|
|
||||||
if(signal_delayed)
|
|
||||||
sizechanged();
|
|
||||||
} while (ret==EINTR || ret==SSH_EINTR);
|
|
||||||
|
|
||||||
// we already looked for input from stdin. Now, we are looking for input from the channel
|
|
||||||
|
|
||||||
if(channel && ssh_channel_is_closed(channel)){
|
|
||||||
ssh_channel_free(channel);
|
|
||||||
channel=NULL;
|
|
||||||
channels[0]=NULL;
|
|
||||||
}
|
|
||||||
if(channels[0]){
|
|
||||||
while(channel && ssh_channel_is_open(channel) && ssh_channel_poll(channel,0)>0){
|
|
||||||
lus=channel_read_buffer(channel,readbuf,0,0);
|
|
||||||
if(lus==-1){
|
|
||||||
fprintf(stderr, "Error reading channel: %s\n",
|
|
||||||
ssh_get_error(session));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(lus==0){
|
|
||||||
ssh_channel_free(channel);
|
|
||||||
channel=channels[0]=NULL;
|
|
||||||
} else
|
|
||||||
if (write(1,ssh_buffer_get_begin(readbuf),lus) < 0) {
|
|
||||||
fprintf(stderr, "Error writing to buffer\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while(channel && ssh_channel_is_open(channel) && ssh_channel_poll(channel,1)>0){ /* stderr */
|
|
||||||
lus=channel_read_buffer(channel,readbuf,0,1);
|
|
||||||
if(lus==-1){
|
|
||||||
fprintf(stderr, "Error reading channel: %s\n",
|
|
||||||
ssh_get_error(session));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(lus==0){
|
|
||||||
ssh_channel_free(channel);
|
|
||||||
channel=channels[0]=NULL;
|
|
||||||
} else
|
|
||||||
if (write(2,ssh_buffer_get_begin(readbuf),lus) < 0) {
|
|
||||||
fprintf(stderr, "Error writing to buffer\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(channel && ssh_channel_is_closed(channel)){
|
|
||||||
ssh_channel_free(channel);
|
|
||||||
channel=NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ssh_buffer_free(readbuf);
|
|
||||||
}
|
|
||||||
#else /* CHANNEL_SELECT */
|
|
||||||
|
|
||||||
static void select_loop(ssh_session session,ssh_channel channel){
|
|
||||||
fd_set fds;
|
|
||||||
struct timeval timeout;
|
|
||||||
char buffer[4096];
|
|
||||||
/* channels will be set to the channels to poll.
|
|
||||||
* outchannels will contain the result of the poll
|
|
||||||
*/
|
|
||||||
ssh_channel channels[2], outchannels[2];
|
|
||||||
int lus;
|
|
||||||
int eof=0;
|
|
||||||
int maxfd;
|
|
||||||
unsigned int r;
|
|
||||||
int ret;
|
|
||||||
while(channel){
|
|
||||||
do{
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
FD_ZERO(&fds);
|
|
||||||
if(!eof)
|
|
||||||
FD_SET(0,&fds);
|
|
||||||
timeout.tv_sec=30;
|
|
||||||
timeout.tv_usec=0;
|
|
||||||
|
|
||||||
fd = ssh_get_fd(session);
|
|
||||||
if (fd < 0) {
|
|
||||||
fprintf(stderr, "Error getting fd\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
FD_SET(fd, &fds);
|
|
||||||
maxfd = fd + 1;
|
|
||||||
|
|
||||||
channels[0]=channel; // set the first channel we want to read from
|
|
||||||
channels[1]=NULL;
|
|
||||||
ret=ssh_select(channels,outchannels,maxfd,&fds,&timeout);
|
|
||||||
if(signal_delayed)
|
|
||||||
sizechanged();
|
|
||||||
if(ret==EINTR)
|
|
||||||
continue;
|
|
||||||
if(FD_ISSET(0,&fds)){
|
|
||||||
lus=read(0,buffer,sizeof(buffer));
|
|
||||||
if(lus)
|
|
||||||
ssh_channel_write(channel,buffer,lus);
|
|
||||||
else {
|
|
||||||
eof=1;
|
|
||||||
ssh_channel_send_eof(channel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(channel && ssh_channel_is_closed(channel)){
|
|
||||||
ssh_channel_free(channel);
|
|
||||||
channel=NULL;
|
|
||||||
channels[0]=NULL;
|
|
||||||
}
|
|
||||||
if(outchannels[0]){
|
|
||||||
while(channel && ssh_channel_is_open(channel) && (r = ssh_channel_poll(channel,0))!=0){
|
|
||||||
lus=ssh_channel_read(channel,buffer,sizeof(buffer) > r ? r : sizeof(buffer),0);
|
|
||||||
if(lus==-1){
|
|
||||||
fprintf(stderr, "Error reading channel: %s\n",
|
|
||||||
ssh_get_error(session));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(lus==0){
|
|
||||||
ssh_channel_free(channel);
|
|
||||||
channel=channels[0]=NULL;
|
|
||||||
} else
|
|
||||||
if (write(1,buffer,lus) < 0) {
|
|
||||||
fprintf(stderr, "Error writing to buffer\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while(channel && ssh_channel_is_open(channel) && (r = ssh_channel_poll(channel,1))!=0){ /* stderr */
|
|
||||||
lus=ssh_channel_read(channel,buffer,sizeof(buffer) > r ? r : sizeof(buffer),1);
|
|
||||||
if(lus==-1){
|
|
||||||
fprintf(stderr, "Error reading channel: %s\n",
|
|
||||||
ssh_get_error(session));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(lus==0){
|
|
||||||
ssh_channel_free(channel);
|
|
||||||
channel=channels[0]=NULL;
|
|
||||||
} else
|
|
||||||
if (write(2,buffer,lus) < 0) {
|
|
||||||
fprintf(stderr, "Error writing to buffer\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(channel && ssh_channel_is_closed(channel)){
|
|
||||||
ssh_channel_free(channel);
|
|
||||||
channel=NULL;
|
|
||||||
}
|
|
||||||
} while (ret==EINTR || ret==SSH_EINTR);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void shell(ssh_session session){
|
|
||||||
ssh_channel channel;
|
|
||||||
struct termios terminal_local;
|
|
||||||
int interactive=isatty(0);
|
|
||||||
channel = ssh_channel_new(session);
|
|
||||||
if(interactive){
|
|
||||||
tcgetattr(0,&terminal_local);
|
|
||||||
memcpy(&terminal,&terminal_local,sizeof(struct termios));
|
|
||||||
}
|
|
||||||
if(ssh_channel_open_session(channel)){
|
|
||||||
printf("error opening channel : %s\n",ssh_get_error(session));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
chan=channel;
|
|
||||||
if(interactive){
|
|
||||||
ssh_channel_request_pty(channel);
|
|
||||||
sizechanged();
|
|
||||||
}
|
|
||||||
if(ssh_channel_request_shell(channel)){
|
|
||||||
printf("Requesting shell : %s\n",ssh_get_error(session));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(interactive){
|
|
||||||
cfmakeraw(&terminal_local);
|
|
||||||
tcsetattr(0,TCSANOW,&terminal_local);
|
|
||||||
setsignal();
|
|
||||||
}
|
|
||||||
signal(SIGTERM,do_cleanup);
|
|
||||||
select_loop(session,channel);
|
|
||||||
if(interactive)
|
|
||||||
do_cleanup(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void batch_shell(ssh_session session){
|
|
||||||
ssh_channel channel;
|
|
||||||
char buffer[1024];
|
|
||||||
int i,s=0;
|
|
||||||
for(i=0;i<MAXCMD && cmds[i];++i) {
|
|
||||||
s+=snprintf(buffer+s,sizeof(buffer)-s,"%s ",cmds[i]);
|
|
||||||
free(cmds[i]);
|
|
||||||
cmds[i] = NULL;
|
|
||||||
}
|
|
||||||
channel=ssh_channel_new(session);
|
|
||||||
ssh_channel_open_session(channel);
|
|
||||||
if(ssh_channel_request_exec(channel,buffer)){
|
|
||||||
printf("error executing \"%s\" : %s\n",buffer,ssh_get_error(session));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
select_loop(session,channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int client(ssh_session session){
|
|
||||||
int auth=0;
|
|
||||||
char *banner;
|
|
||||||
int state;
|
|
||||||
if (user)
|
|
||||||
if (ssh_options_set(session, SSH_OPTIONS_USER, user) < 0)
|
|
||||||
return -1;
|
|
||||||
if (ssh_options_set(session, SSH_OPTIONS_HOST ,host) < 0)
|
|
||||||
return -1;
|
|
||||||
if (proxycommand != NULL){
|
|
||||||
if(ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, proxycommand))
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
ssh_options_parse_config(session, NULL);
|
|
||||||
|
|
||||||
if(ssh_connect(session)){
|
|
||||||
fprintf(stderr,"Connection failed : %s\n",ssh_get_error(session));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
state=verify_knownhost(session);
|
|
||||||
if (state != 0)
|
|
||||||
return -1;
|
|
||||||
ssh_userauth_none(session, NULL);
|
|
||||||
banner=ssh_get_issue_banner(session);
|
|
||||||
if(banner){
|
|
||||||
printf("%s\n",banner);
|
|
||||||
free(banner);
|
|
||||||
}
|
|
||||||
auth=authenticate_console(session);
|
|
||||||
if(auth != SSH_AUTH_SUCCESS){
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if(!cmds[0])
|
|
||||||
shell(session);
|
|
||||||
else
|
|
||||||
batch_shell(session);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ssh_pcap_file pcap;
|
|
||||||
void set_pcap(ssh_session session);
|
|
||||||
void set_pcap(ssh_session session){
|
|
||||||
if(!pcap_file)
|
|
||||||
return;
|
|
||||||
pcap=ssh_pcap_file_new();
|
|
||||||
if(!pcap)
|
|
||||||
return;
|
|
||||||
if(ssh_pcap_file_open(pcap,pcap_file) == SSH_ERROR){
|
|
||||||
printf("Error opening pcap file\n");
|
|
||||||
ssh_pcap_file_free(pcap);
|
|
||||||
pcap=NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ssh_set_pcap_file(session,pcap);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cleanup_pcap(void);
|
|
||||||
void cleanup_pcap(){
|
|
||||||
if(pcap)
|
|
||||||
ssh_pcap_file_free(pcap);
|
|
||||||
pcap=NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv){
|
|
||||||
ssh_session session;
|
|
||||||
|
|
||||||
session = ssh_new();
|
|
||||||
|
|
||||||
ssh_callbacks_init(&cb);
|
|
||||||
ssh_set_callbacks(session,&cb);
|
|
||||||
|
|
||||||
if(ssh_options_getopt(session, &argc, argv)) {
|
|
||||||
fprintf(stderr, "error parsing command line :%s\n",
|
|
||||||
ssh_get_error(session));
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
opts(argc,argv);
|
|
||||||
signal(SIGTERM, do_exit);
|
|
||||||
|
|
||||||
set_pcap(session);
|
|
||||||
client(session);
|
|
||||||
|
|
||||||
ssh_disconnect(session);
|
|
||||||
ssh_free(session);
|
|
||||||
cleanup_pcap();
|
|
||||||
|
|
||||||
ssh_finalize();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -33,236 +33,259 @@ static int verbosity;
|
|||||||
static char *destination;
|
static char *destination;
|
||||||
|
|
||||||
#define DATALEN 65536
|
#define DATALEN 65536
|
||||||
static void do_sftp(ssh_session session){
|
|
||||||
sftp_session sftp=sftp_new(session);
|
static void do_sftp(ssh_session session) {
|
||||||
|
sftp_session sftp = sftp_new(session);
|
||||||
sftp_dir dir;
|
sftp_dir dir;
|
||||||
sftp_attributes file;
|
sftp_attributes file;
|
||||||
sftp_statvfs_t sftpstatvfs;
|
sftp_statvfs_t sftpstatvfs;
|
||||||
struct statvfs sysstatvfs;
|
struct statvfs sysstatvfs;
|
||||||
sftp_file fichier;
|
sftp_file fichier;
|
||||||
sftp_file to;
|
sftp_file to;
|
||||||
int len=1;
|
int len = 1;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
char data[DATALEN]={0};
|
char data[DATALEN] = {0};
|
||||||
char *lnk;
|
char *lnk;
|
||||||
|
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
|
|
||||||
if(!sftp){
|
if (!sftp) {
|
||||||
fprintf(stderr, "sftp error initialising channel: %s\n",
|
fprintf(stderr, "sftp error initialising channel: %s\n",
|
||||||
ssh_get_error(session));
|
ssh_get_error(session));
|
||||||
return;
|
goto end;
|
||||||
}
|
}
|
||||||
if(sftp_init(sftp)){
|
|
||||||
|
if (sftp_init(sftp)) {
|
||||||
fprintf(stderr, "error initialising sftp: %s\n",
|
fprintf(stderr, "error initialising sftp: %s\n",
|
||||||
ssh_get_error(session));
|
ssh_get_error(session));
|
||||||
return;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Additional SFTP extensions provided by the server:\n");
|
printf("Additional SFTP extensions provided by the server:\n");
|
||||||
count = sftp_extensions_get_count(sftp);
|
count = sftp_extensions_get_count(sftp);
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
printf("\t%s, version: %s\n",
|
printf("\t%s, version: %s\n",
|
||||||
sftp_extensions_get_name(sftp, i),
|
sftp_extensions_get_name(sftp, i),
|
||||||
sftp_extensions_get_data(sftp, i));
|
sftp_extensions_get_data(sftp, i));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* test symlink and readlink */
|
/* test symlink and readlink */
|
||||||
if (sftp_symlink(sftp, "/tmp/this_is_the_link",
|
if (sftp_symlink(sftp, "/tmp/this_is_the_link",
|
||||||
"/tmp/sftp_symlink_test") < 0) {
|
"/tmp/sftp_symlink_test") < 0)
|
||||||
fprintf(stderr, "Could not create link (%s)\n", ssh_get_error(session));
|
{
|
||||||
return;
|
fprintf(stderr, "Could not create link (%s)\n",
|
||||||
|
ssh_get_error(session));
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
lnk = sftp_readlink(sftp, "/tmp/sftp_symlink_test");
|
lnk = sftp_readlink(sftp, "/tmp/sftp_symlink_test");
|
||||||
if (lnk == NULL) {
|
if (lnk == NULL) {
|
||||||
fprintf(stderr, "Could not read link (%s)\n", ssh_get_error(session));
|
fprintf(stderr, "Could not read link (%s)\n", ssh_get_error(session));
|
||||||
return;
|
goto end;
|
||||||
}
|
}
|
||||||
printf("readlink /tmp/sftp_symlink_test: %s\n", lnk);
|
printf("readlink /tmp/sftp_symlink_test: %s\n", lnk);
|
||||||
|
|
||||||
sftp_unlink(sftp, "/tmp/sftp_symlink_test");
|
sftp_unlink(sftp, "/tmp/sftp_symlink_test");
|
||||||
|
|
||||||
if (sftp_extension_supported(sftp, "statvfs@openssh.com", "2")) {
|
if (sftp_extension_supported(sftp, "statvfs@openssh.com", "2")) {
|
||||||
sftpstatvfs = sftp_statvfs(sftp, "/tmp");
|
sftpstatvfs = sftp_statvfs(sftp, "/tmp");
|
||||||
if (sftpstatvfs == NULL) {
|
if (sftpstatvfs == NULL) {
|
||||||
fprintf(stderr, "statvfs failed (%s)\n", ssh_get_error(session));
|
fprintf(stderr, "statvfs failed (%s)\n", ssh_get_error(session));
|
||||||
return;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("sftp statvfs:\n"
|
printf("sftp statvfs:\n"
|
||||||
"\tfile system block size: %llu\n"
|
"\tfile system block size: %llu\n"
|
||||||
"\tfundamental fs block size: %llu\n"
|
"\tfundamental fs block size: %llu\n"
|
||||||
"\tnumber of blocks (unit f_frsize): %llu\n"
|
"\tnumber of blocks (unit f_frsize): %llu\n"
|
||||||
"\tfree blocks in file system: %llu\n"
|
"\tfree blocks in file system: %llu\n"
|
||||||
"\tfree blocks for non-root: %llu\n"
|
"\tfree blocks for non-root: %llu\n"
|
||||||
"\ttotal file inodes: %llu\n"
|
"\ttotal file inodes: %llu\n"
|
||||||
"\tfree file inodes: %llu\n"
|
"\tfree file inodes: %llu\n"
|
||||||
"\tfree file inodes for to non-root: %llu\n"
|
"\tfree file inodes for to non-root: %llu\n"
|
||||||
"\tfile system id: %llu\n"
|
"\tfile system id: %llu\n"
|
||||||
"\tbit mask of f_flag values: %llu\n"
|
"\tbit mask of f_flag values: %llu\n"
|
||||||
"\tmaximum filename length: %llu\n",
|
"\tmaximum filename length: %llu\n",
|
||||||
(unsigned long long) sftpstatvfs->f_bsize,
|
(unsigned long long) sftpstatvfs->f_bsize,
|
||||||
(unsigned long long) sftpstatvfs->f_frsize,
|
(unsigned long long) sftpstatvfs->f_frsize,
|
||||||
(unsigned long long) sftpstatvfs->f_blocks,
|
(unsigned long long) sftpstatvfs->f_blocks,
|
||||||
(unsigned long long) sftpstatvfs->f_bfree,
|
(unsigned long long) sftpstatvfs->f_bfree,
|
||||||
(unsigned long long) sftpstatvfs->f_bavail,
|
(unsigned long long) sftpstatvfs->f_bavail,
|
||||||
(unsigned long long) sftpstatvfs->f_files,
|
(unsigned long long) sftpstatvfs->f_files,
|
||||||
(unsigned long long) sftpstatvfs->f_ffree,
|
(unsigned long long) sftpstatvfs->f_ffree,
|
||||||
(unsigned long long) sftpstatvfs->f_favail,
|
(unsigned long long) sftpstatvfs->f_favail,
|
||||||
(unsigned long long) sftpstatvfs->f_fsid,
|
(unsigned long long) sftpstatvfs->f_fsid,
|
||||||
(unsigned long long) sftpstatvfs->f_flag,
|
(unsigned long long) sftpstatvfs->f_flag,
|
||||||
(unsigned long long) sftpstatvfs->f_namemax);
|
(unsigned long long) sftpstatvfs->f_namemax);
|
||||||
|
|
||||||
sftp_statvfs_free(sftpstatvfs);
|
sftp_statvfs_free(sftpstatvfs);
|
||||||
|
|
||||||
if (statvfs("/tmp", &sysstatvfs) < 0) {
|
if (statvfs("/tmp", &sysstatvfs) < 0) {
|
||||||
fprintf(stderr, "statvfs failed (%s)\n", strerror(errno));
|
fprintf(stderr, "statvfs failed (%s)\n", strerror(errno));
|
||||||
return;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("sys statvfs:\n"
|
printf("sys statvfs:\n"
|
||||||
"\tfile system block size: %llu\n"
|
"\tfile system block size: %llu\n"
|
||||||
"\tfundamental fs block size: %llu\n"
|
"\tfundamental fs block size: %llu\n"
|
||||||
"\tnumber of blocks (unit f_frsize): %llu\n"
|
"\tnumber of blocks (unit f_frsize): %llu\n"
|
||||||
"\tfree blocks in file system: %llu\n"
|
"\tfree blocks in file system: %llu\n"
|
||||||
"\tfree blocks for non-root: %llu\n"
|
"\tfree blocks for non-root: %llu\n"
|
||||||
"\ttotal file inodes: %llu\n"
|
"\ttotal file inodes: %llu\n"
|
||||||
"\tfree file inodes: %llu\n"
|
"\tfree file inodes: %llu\n"
|
||||||
"\tfree file inodes for to non-root: %llu\n"
|
"\tfree file inodes for to non-root: %llu\n"
|
||||||
"\tfile system id: %llu\n"
|
"\tfile system id: %llu\n"
|
||||||
"\tbit mask of f_flag values: %llu\n"
|
"\tbit mask of f_flag values: %llu\n"
|
||||||
"\tmaximum filename length: %llu\n",
|
"\tmaximum filename length: %llu\n",
|
||||||
(unsigned long long) sysstatvfs.f_bsize,
|
(unsigned long long) sysstatvfs.f_bsize,
|
||||||
(unsigned long long) sysstatvfs.f_frsize,
|
(unsigned long long) sysstatvfs.f_frsize,
|
||||||
(unsigned long long) sysstatvfs.f_blocks,
|
(unsigned long long) sysstatvfs.f_blocks,
|
||||||
(unsigned long long) sysstatvfs.f_bfree,
|
(unsigned long long) sysstatvfs.f_bfree,
|
||||||
(unsigned long long) sysstatvfs.f_bavail,
|
(unsigned long long) sysstatvfs.f_bavail,
|
||||||
(unsigned long long) sysstatvfs.f_files,
|
(unsigned long long) sysstatvfs.f_files,
|
||||||
(unsigned long long) sysstatvfs.f_ffree,
|
(unsigned long long) sysstatvfs.f_ffree,
|
||||||
(unsigned long long) sysstatvfs.f_favail,
|
(unsigned long long) sysstatvfs.f_favail,
|
||||||
(unsigned long long) sysstatvfs.f_fsid,
|
(unsigned long long) sysstatvfs.f_fsid,
|
||||||
(unsigned long long) sysstatvfs.f_flag,
|
(unsigned long long) sysstatvfs.f_flag,
|
||||||
(unsigned long long) sysstatvfs.f_namemax);
|
(unsigned long long) sysstatvfs.f_namemax);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the connection is made */
|
/* the connection is made */
|
||||||
/* opening a directory */
|
/* opening a directory */
|
||||||
dir=sftp_opendir(sftp,"./");
|
dir = sftp_opendir(sftp, "./");
|
||||||
if(!dir) {
|
if (!dir) {
|
||||||
fprintf(stderr, "Directory not opened(%s)\n", ssh_get_error(session));
|
fprintf(stderr, "Directory not opened(%s)\n", ssh_get_error(session));
|
||||||
return ;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* reading the whole directory, file by file */
|
/* reading the whole directory, file by file */
|
||||||
while((file=sftp_readdir(sftp,dir))){
|
while ((file = sftp_readdir(sftp, dir))) {
|
||||||
fprintf(stderr, "%30s(%.8o) : %s(%.5d) %s(%.5d) : %.10llu bytes\n",
|
fprintf(stderr, "%30s(%.8o) : %s(%.5d) %s(%.5d) : %.10llu bytes\n",
|
||||||
file->name,
|
file->name,
|
||||||
file->permissions,
|
file->permissions,
|
||||||
file->owner,
|
file->owner,
|
||||||
file->uid,
|
file->uid,
|
||||||
file->group,
|
file->group,
|
||||||
file->gid,
|
file->gid,
|
||||||
(long long unsigned int) file->size);
|
(long long unsigned int) file->size);
|
||||||
sftp_attributes_free(file);
|
sftp_attributes_free(file);
|
||||||
}
|
}
|
||||||
/* when file=NULL, an error has occured OR the directory listing is end of file */
|
|
||||||
if(!sftp_dir_eof(dir)){
|
/* when file = NULL, an error has occured OR the directory listing is end of
|
||||||
|
* file */
|
||||||
|
if (!sftp_dir_eof(dir)) {
|
||||||
fprintf(stderr, "Error: %s\n", ssh_get_error(session));
|
fprintf(stderr, "Error: %s\n", ssh_get_error(session));
|
||||||
return;
|
goto end;
|
||||||
}
|
}
|
||||||
if(sftp_closedir(dir)){
|
|
||||||
|
if (sftp_closedir(dir)) {
|
||||||
fprintf(stderr, "Error: %s\n", ssh_get_error(session));
|
fprintf(stderr, "Error: %s\n", ssh_get_error(session));
|
||||||
return;
|
goto end;
|
||||||
}
|
}
|
||||||
/* this will open a file and copy it into your /home directory */
|
/* this will open a file and copy it into your /home directory */
|
||||||
/* the small buffer size was intended to stress the library. of course, you can use a buffer till 20kbytes without problem */
|
/* the small buffer size was intended to stress the library. of course, you
|
||||||
|
* can use a buffer till 20kbytes without problem */
|
||||||
|
|
||||||
fichier=sftp_open(sftp,"/usr/bin/ssh",O_RDONLY, 0);
|
fichier = sftp_open(sftp, "/usr/bin/ssh", O_RDONLY, 0);
|
||||||
if(!fichier){
|
if (!fichier) {
|
||||||
fprintf(stderr, "Error opening /usr/bin/ssh: %s\n",
|
fprintf(stderr, "Error opening /usr/bin/ssh: %s\n",
|
||||||
ssh_get_error(session));
|
ssh_get_error(session));
|
||||||
return;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* open a file for writing... */
|
/* open a file for writing... */
|
||||||
to=sftp_open(sftp,"ssh-copy",O_WRONLY | O_CREAT, 0700);
|
to = sftp_open(sftp, "ssh-copy", O_WRONLY | O_CREAT, 0700);
|
||||||
if(!to){
|
if (!to) {
|
||||||
fprintf(stderr, "Error opening ssh-copy for writing: %s\n",
|
fprintf(stderr, "Error opening ssh-copy for writing: %s\n",
|
||||||
ssh_get_error(session));
|
ssh_get_error(session));
|
||||||
return;
|
sftp_close(fichier);
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
while((len=sftp_read(fichier,data,4096)) > 0){
|
|
||||||
if(sftp_write(to,data,len)!=len){
|
while ((len = sftp_read(fichier, data, 4096)) > 0) {
|
||||||
|
if (sftp_write(to, data, len) != len) {
|
||||||
fprintf(stderr, "Error writing %d bytes: %s\n",
|
fprintf(stderr, "Error writing %d bytes: %s\n",
|
||||||
len, ssh_get_error(session));
|
len, ssh_get_error(session));
|
||||||
return;
|
sftp_close(to);
|
||||||
|
sftp_close(fichier);
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("finished\n");
|
printf("finished\n");
|
||||||
if(len<0)
|
if (len < 0) {
|
||||||
fprintf(stderr, "Error reading file: %s\n", ssh_get_error(session));
|
fprintf(stderr, "Error reading file: %s\n", ssh_get_error(session));
|
||||||
|
}
|
||||||
|
|
||||||
sftp_close(fichier);
|
sftp_close(fichier);
|
||||||
sftp_close(to);
|
sftp_close(to);
|
||||||
printf("fichiers ferm\n");
|
printf("fichiers ferm\n");
|
||||||
to=sftp_open(sftp,"/tmp/grosfichier",O_WRONLY|O_CREAT, 0644);
|
to = sftp_open(sftp, "/tmp/grosfichier", O_WRONLY|O_CREAT, 0644);
|
||||||
for(i=0;i<1000;++i){
|
|
||||||
len=sftp_write(to,data,DATALEN);
|
for (i = 0; i < 1000; ++i) {
|
||||||
printf("wrote %d bytes\n",len);
|
len = sftp_write(to, data, DATALEN);
|
||||||
if(len != DATALEN){
|
printf("wrote %d bytes\n", len);
|
||||||
printf("chunk %d : %d (%s)\n",i,len,ssh_get_error(session));
|
if (len != DATALEN) {
|
||||||
|
printf("chunk %d : %d (%s)\n", i, len, ssh_get_error(session));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sftp_close(to);
|
|
||||||
|
|
||||||
|
sftp_close(to);
|
||||||
|
end:
|
||||||
/* close the sftp session */
|
/* close the sftp session */
|
||||||
sftp_free(sftp);
|
sftp_free(sftp);
|
||||||
printf("sftp session terminated\n");
|
printf("sftp session terminated\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usage(const char *argv0){
|
static void usage(const char *argv0) {
|
||||||
fprintf(stderr,"Usage : %s [-v] remotehost\n"
|
fprintf(stderr, "Usage : %s [-v] remotehost\n"
|
||||||
"sample sftp test client - libssh-%s\n"
|
"sample sftp test client - libssh-%s\n"
|
||||||
"Options :\n"
|
"Options :\n"
|
||||||
" -v : increase log verbosity\n",
|
" -v : increase log verbosity\n",
|
||||||
argv0,
|
argv0,
|
||||||
ssh_version(0));
|
ssh_version(0));
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opts(int argc, char **argv){
|
static int opts(int argc, char **argv) {
|
||||||
int i;
|
int i;
|
||||||
while((i=getopt(argc,argv,"v"))!=-1){
|
|
||||||
switch(i){
|
while ((i = getopt(argc, argv, "v")) != -1) {
|
||||||
case 'v':
|
switch(i) {
|
||||||
verbosity++;
|
case 'v':
|
||||||
break;
|
verbosity++;
|
||||||
default:
|
break;
|
||||||
fprintf(stderr,"unknown option %c\n",optopt);
|
default:
|
||||||
|
fprintf(stderr, "unknown option %c\n", optopt);
|
||||||
|
usage(argv[0]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destination = argv[optind];
|
||||||
|
if (destination == NULL) {
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
return 0;
|
||||||
|
|
||||||
destination=argv[optind];
|
|
||||||
if(destination == NULL){
|
|
||||||
usage(argv[0]);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv){
|
int main(int argc, char **argv) {
|
||||||
ssh_session session;
|
ssh_session session;
|
||||||
if(opts(argc,argv)<0)
|
|
||||||
return EXIT_FAILURE;
|
if (opts(argc, argv) < 0) {
|
||||||
session=connect_ssh(destination,NULL,verbosity);
|
return EXIT_FAILURE;
|
||||||
if(session == NULL)
|
}
|
||||||
return EXIT_FAILURE;
|
|
||||||
do_sftp(session);
|
session = connect_ssh(destination, NULL, verbosity);
|
||||||
ssh_disconnect(session);
|
if (session == NULL) {
|
||||||
ssh_free(session);
|
return EXIT_FAILURE;
|
||||||
return 0;
|
}
|
||||||
|
|
||||||
|
do_sftp(session);
|
||||||
|
ssh_disconnect(session);
|
||||||
|
ssh_free(session);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ clients must be made or how a client should react.
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#define SSHD_USER "libssh"
|
#define SSHD_USER "libssh"
|
||||||
#define SSHD_PASSWORD "libssh"
|
#define SSHD_PASSWORD "libssh"
|
||||||
@@ -36,6 +37,7 @@ clients must be made or how a client should react.
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int port = 22;
|
static int port = 22;
|
||||||
|
static bool authenticated = false;
|
||||||
|
|
||||||
#ifdef WITH_PCAP
|
#ifdef WITH_PCAP
|
||||||
static const char *pcap_file = "debug.server.pcap";
|
static const char *pcap_file = "debug.server.pcap";
|
||||||
@@ -61,11 +63,20 @@ static void cleanup_pcap(void) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static int auth_password(const char *user, const char *password){
|
static int auth_password(const char *user, const char *password)
|
||||||
if(strcmp(user, SSHD_USER))
|
{
|
||||||
|
int cmp;
|
||||||
|
|
||||||
|
cmp = strcmp(user, SSHD_USER);
|
||||||
|
if (cmp != 0) {
|
||||||
return 0;
|
return 0;
|
||||||
if(strcmp(password, SSHD_PASSWORD))
|
}
|
||||||
|
cmp = strcmp(password, SSHD_PASSWORD);
|
||||||
|
if (cmp != 0) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
authenticated = true;
|
||||||
return 1; // authenticated
|
return 1; // authenticated
|
||||||
}
|
}
|
||||||
#ifdef HAVE_ARGP_H
|
#ifdef HAVE_ARGP_H
|
||||||
@@ -200,6 +211,7 @@ static int kbdint_check_response(ssh_session session) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
authenticated = true;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -328,7 +340,7 @@ int main(int argc, char **argv){
|
|||||||
|
|
||||||
/* proceed to authentication */
|
/* proceed to authentication */
|
||||||
auth = authenticate(session);
|
auth = authenticate(session);
|
||||||
if(!auth){
|
if (!auth || !authenticated) {
|
||||||
printf("Authentication error: %s\n", ssh_get_error(session));
|
printf("Authentication error: %s\n", ssh_get_error(session));
|
||||||
ssh_disconnect(session);
|
ssh_disconnect(session);
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -22,9 +22,12 @@ program.
|
|||||||
#include <libssh/libssh.h>
|
#include <libssh/libssh.h>
|
||||||
#include "examples_common.h"
|
#include "examples_common.h"
|
||||||
|
|
||||||
int verbosity=0;
|
static int verbosity = 0;
|
||||||
const char *createcommand="rm -fr /tmp/libssh_tests && mkdir /tmp/libssh_tests && cd /tmp/libssh_tests && date > a && date > b && mkdir c && date > d";
|
static const char *createcommand =
|
||||||
char *host=NULL;
|
"rm -fr /tmp/libssh_tests && mkdir /tmp/libssh_tests && "
|
||||||
|
"cd /tmp/libssh_tests && date > a && date > b && mkdir c && date > d";
|
||||||
|
static char *host = NULL;
|
||||||
|
|
||||||
static void usage(const char *argv0){
|
static void usage(const char *argv0){
|
||||||
fprintf(stderr,"Usage : %s [options] host\n"
|
fprintf(stderr,"Usage : %s [options] host\n"
|
||||||
"sample tiny scp downloader client - libssh-%s\n"
|
"sample tiny scp downloader client - libssh-%s\n"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#include <libssh/libssh.h>
|
#include <libssh/libssh.h>
|
||||||
#include "examples_common.h"
|
#include "examples_common.h"
|
||||||
|
|
||||||
#define LIMIT 0x100000000
|
#define LIMIT 0x100000000UL
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
ssh_session session;
|
ssh_session session;
|
||||||
|
|||||||
407
examples/ssh_client.c
Normal file
@@ -0,0 +1,407 @@
|
|||||||
|
/* client.c */
|
||||||
|
/*
|
||||||
|
Copyright 2003-2009 Aris Adamantiadis
|
||||||
|
|
||||||
|
This file is part of the SSH Library
|
||||||
|
|
||||||
|
You are free to copy this file, modify it in any way, consider it being public
|
||||||
|
domain. This does not apply to the rest of the library though, but it is
|
||||||
|
allowed to cut-and-paste working code from this file to any license of
|
||||||
|
program.
|
||||||
|
The goal is to show the API in action. It's not a reference on how terminal
|
||||||
|
clients must be made or how a client should react.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_TERMIOS_H
|
||||||
|
#include <termios.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_PTY_H
|
||||||
|
#include <pty.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include <libssh/callbacks.h>
|
||||||
|
#include <libssh/libssh.h>
|
||||||
|
#include <libssh/sftp.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "examples_common.h"
|
||||||
|
#define MAXCMD 10
|
||||||
|
|
||||||
|
static char *host;
|
||||||
|
static char *user;
|
||||||
|
static char *cmds[MAXCMD];
|
||||||
|
static struct termios terminal;
|
||||||
|
|
||||||
|
static char *pcap_file = NULL;
|
||||||
|
|
||||||
|
static char *proxycommand;
|
||||||
|
|
||||||
|
static int auth_callback(const char *prompt,
|
||||||
|
char *buf,
|
||||||
|
size_t len,
|
||||||
|
int echo,
|
||||||
|
int verify,
|
||||||
|
void *userdata)
|
||||||
|
{
|
||||||
|
(void) verify;
|
||||||
|
(void) userdata;
|
||||||
|
|
||||||
|
return ssh_getpass(prompt, buf, len, echo, verify);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ssh_callbacks_struct cb = {
|
||||||
|
.auth_function = auth_callback,
|
||||||
|
.userdata = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void add_cmd(char *cmd)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
for (n = 0; (n < MAXCMD) && cmds[n] != NULL; n++);
|
||||||
|
|
||||||
|
if (n == MAXCMD) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmds[n] = strdup(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"Usage : ssh [options] [login@]hostname\n"
|
||||||
|
"sample client - libssh-%s\n"
|
||||||
|
"Options :\n"
|
||||||
|
" -l user : log in as user\n"
|
||||||
|
" -p port : connect to port\n"
|
||||||
|
" -d : use DSS to verify host public key\n"
|
||||||
|
" -r : use RSA to verify host public key\n"
|
||||||
|
#ifdef WITH_PCAP
|
||||||
|
" -P file : create a pcap debugging file\n"
|
||||||
|
#endif
|
||||||
|
#ifndef _WIN32
|
||||||
|
" -T proxycommand : command to execute as a socket proxy\n"
|
||||||
|
#endif
|
||||||
|
"\n",
|
||||||
|
ssh_version(0));
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int opts(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
while((i = getopt(argc,argv,"T:P:")) != -1) {
|
||||||
|
switch(i){
|
||||||
|
case 'P':
|
||||||
|
pcap_file = optarg;
|
||||||
|
break;
|
||||||
|
#ifndef _WIN32
|
||||||
|
case 'T':
|
||||||
|
proxycommand = optarg;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Unknown option %c\n", optopt);
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (optind < argc) {
|
||||||
|
host = argv[optind++];
|
||||||
|
}
|
||||||
|
|
||||||
|
while(optind < argc) {
|
||||||
|
add_cmd(argv[optind++]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (host == NULL) {
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef HAVE_CFMAKERAW
|
||||||
|
static void cfmakeraw(struct termios *termios_p)
|
||||||
|
{
|
||||||
|
termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
|
||||||
|
termios_p->c_oflag &= ~OPOST;
|
||||||
|
termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
|
||||||
|
termios_p->c_cflag &= ~(CSIZE|PARENB);
|
||||||
|
termios_p->c_cflag |= CS8;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static void do_cleanup(int i)
|
||||||
|
{
|
||||||
|
/* unused variable */
|
||||||
|
(void) i;
|
||||||
|
|
||||||
|
tcsetattr(0, TCSANOW, &terminal);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void do_exit(int i)
|
||||||
|
{
|
||||||
|
/* unused variable */
|
||||||
|
(void) i;
|
||||||
|
|
||||||
|
do_cleanup(0);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssh_channel chan;
|
||||||
|
static int signal_delayed = 0;
|
||||||
|
|
||||||
|
static void sigwindowchanged(int i)
|
||||||
|
{
|
||||||
|
(void) i;
|
||||||
|
signal_delayed = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setsignal(void)
|
||||||
|
{
|
||||||
|
signal(SIGWINCH, sigwindowchanged);
|
||||||
|
signal_delayed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sizechanged(void)
|
||||||
|
{
|
||||||
|
struct winsize win = {
|
||||||
|
.ws_row = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
ioctl(1, TIOCGWINSZ, &win);
|
||||||
|
ssh_channel_change_pty_size(chan,win.ws_col, win.ws_row);
|
||||||
|
setsignal();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void select_loop(ssh_session session,ssh_channel channel)
|
||||||
|
{
|
||||||
|
ssh_connector connector_in, connector_out, connector_err;
|
||||||
|
|
||||||
|
ssh_event event = ssh_event_new();
|
||||||
|
|
||||||
|
/* stdin */
|
||||||
|
connector_in = ssh_connector_new(session);
|
||||||
|
ssh_connector_set_out_channel(connector_in, channel, SSH_CONNECTOR_STDOUT);
|
||||||
|
ssh_connector_set_in_fd(connector_in, 0);
|
||||||
|
ssh_event_add_connector(event, connector_in);
|
||||||
|
|
||||||
|
/* stdout */
|
||||||
|
connector_out = ssh_connector_new(session);
|
||||||
|
ssh_connector_set_out_fd(connector_out, 1);
|
||||||
|
ssh_connector_set_in_channel(connector_out, channel, SSH_CONNECTOR_STDOUT);
|
||||||
|
ssh_event_add_connector(event, connector_out);
|
||||||
|
|
||||||
|
/* stderr */
|
||||||
|
connector_err = ssh_connector_new(session);
|
||||||
|
ssh_connector_set_out_fd(connector_err, 2);
|
||||||
|
ssh_connector_set_in_channel(connector_err, channel, SSH_CONNECTOR_STDERR);
|
||||||
|
ssh_event_add_connector(event, connector_err);
|
||||||
|
|
||||||
|
while (ssh_channel_is_open(channel)) {
|
||||||
|
if (signal_delayed) {
|
||||||
|
sizechanged();
|
||||||
|
}
|
||||||
|
ssh_event_dopoll(event, 60000);
|
||||||
|
}
|
||||||
|
ssh_event_remove_connector(event, connector_in);
|
||||||
|
ssh_event_remove_connector(event, connector_out);
|
||||||
|
ssh_event_remove_connector(event, connector_err);
|
||||||
|
|
||||||
|
ssh_connector_free(connector_in);
|
||||||
|
ssh_connector_free(connector_out);
|
||||||
|
ssh_connector_free(connector_err);
|
||||||
|
|
||||||
|
ssh_event_free(event);
|
||||||
|
ssh_channel_free(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void shell(ssh_session session)
|
||||||
|
{
|
||||||
|
ssh_channel channel;
|
||||||
|
struct termios terminal_local;
|
||||||
|
int interactive=isatty(0);
|
||||||
|
channel = ssh_channel_new(session);
|
||||||
|
|
||||||
|
if (interactive) {
|
||||||
|
tcgetattr(0, &terminal_local);
|
||||||
|
memcpy(&terminal, &terminal_local, sizeof(struct termios));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ssh_channel_open_session(channel)) {
|
||||||
|
printf("Error opening channel : %s\n", ssh_get_error(session));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
chan = channel;
|
||||||
|
if (interactive) {
|
||||||
|
ssh_channel_request_pty(channel);
|
||||||
|
sizechanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ssh_channel_request_shell(channel)) {
|
||||||
|
printf("Requesting shell : %s\n", ssh_get_error(session));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (interactive) {
|
||||||
|
cfmakeraw(&terminal_local);
|
||||||
|
tcsetattr(0, TCSANOW, &terminal_local);
|
||||||
|
setsignal();
|
||||||
|
}
|
||||||
|
signal(SIGTERM, do_cleanup);
|
||||||
|
select_loop(session, channel);
|
||||||
|
if (interactive) {
|
||||||
|
do_cleanup(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void batch_shell(ssh_session session)
|
||||||
|
{
|
||||||
|
ssh_channel channel;
|
||||||
|
char buffer[1024];
|
||||||
|
size_t i;
|
||||||
|
int s = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < MAXCMD && cmds[i]; ++i) {
|
||||||
|
s += snprintf(buffer + s, sizeof(buffer) - s, "%s ", cmds[i]);
|
||||||
|
free(cmds[i]);
|
||||||
|
cmds[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
channel = ssh_channel_new(session);
|
||||||
|
ssh_channel_open_session(channel);
|
||||||
|
if (ssh_channel_request_exec(channel, buffer)) {
|
||||||
|
printf("Error executing '%s' : %s\n", buffer, ssh_get_error(session));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
select_loop(session, channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int client(ssh_session session)
|
||||||
|
{
|
||||||
|
int auth = 0;
|
||||||
|
char *banner;
|
||||||
|
int state;
|
||||||
|
|
||||||
|
if (user) {
|
||||||
|
if (ssh_options_set(session, SSH_OPTIONS_USER, user) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ssh_options_set(session, SSH_OPTIONS_HOST ,host) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (proxycommand != NULL) {
|
||||||
|
if (ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, proxycommand)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ssh_options_parse_config(session, NULL);
|
||||||
|
|
||||||
|
if (ssh_connect(session)) {
|
||||||
|
fprintf(stderr, "Connection failed : %s\n", ssh_get_error(session));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
state = verify_knownhost(session);
|
||||||
|
if (state != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssh_userauth_none(session, NULL);
|
||||||
|
banner = ssh_get_issue_banner(session);
|
||||||
|
if (banner) {
|
||||||
|
printf("%s\n", banner);
|
||||||
|
free(banner);
|
||||||
|
}
|
||||||
|
auth = authenticate_console(session);
|
||||||
|
if (auth != SSH_AUTH_SUCCESS) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (cmds[0] == NULL) {
|
||||||
|
shell(session);
|
||||||
|
} else {
|
||||||
|
batch_shell(session);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssh_pcap_file pcap;
|
||||||
|
static void set_pcap(ssh_session session)
|
||||||
|
{
|
||||||
|
if (pcap_file == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcap = ssh_pcap_file_new();
|
||||||
|
if (pcap == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ssh_pcap_file_open(pcap, pcap_file) == SSH_ERROR) {
|
||||||
|
printf("Error opening pcap file\n");
|
||||||
|
ssh_pcap_file_free(pcap);
|
||||||
|
pcap = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ssh_set_pcap_file(session, pcap);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cleanup_pcap(void)
|
||||||
|
{
|
||||||
|
if (pcap != NULL) {
|
||||||
|
ssh_pcap_file_free(pcap);
|
||||||
|
}
|
||||||
|
pcap = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
ssh_session session;
|
||||||
|
|
||||||
|
session = ssh_new();
|
||||||
|
|
||||||
|
ssh_callbacks_init(&cb);
|
||||||
|
ssh_set_callbacks(session,&cb);
|
||||||
|
|
||||||
|
if (ssh_options_getopt(session, &argc, argv)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error parsing command line: %s\n",
|
||||||
|
ssh_get_error(session));
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
opts(argc, argv);
|
||||||
|
signal(SIGTERM, do_exit);
|
||||||
|
|
||||||
|
set_pcap(session);
|
||||||
|
client(session);
|
||||||
|
|
||||||
|
ssh_disconnect(session);
|
||||||
|
ssh_free(session);
|
||||||
|
cleanup_pcap();
|
||||||
|
|
||||||
|
ssh_finalize();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -14,9 +14,9 @@ The goal is to show the API in action.
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include <libssh/callbacks.h>
|
#include <libssh/callbacks.h>
|
||||||
#include <libssh/poll.h>
|
|
||||||
#include <libssh/server.h>
|
#include <libssh/server.h>
|
||||||
|
|
||||||
|
#include <poll.h>
|
||||||
#ifdef HAVE_ARGP_H
|
#ifdef HAVE_ARGP_H
|
||||||
#include <argp.h>
|
#include <argp.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -621,6 +621,7 @@ int main(int argc, char **argv) {
|
|||||||
ssh_session session;
|
ssh_session session;
|
||||||
ssh_event event;
|
ssh_event event;
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
|
int rc;
|
||||||
|
|
||||||
/* Set up SIGCHLD handler. */
|
/* Set up SIGCHLD handler. */
|
||||||
sa.sa_handler = sigchld_handler;
|
sa.sa_handler = sigchld_handler;
|
||||||
@@ -631,8 +632,17 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssh_init();
|
rc = ssh_init();
|
||||||
|
if (rc < 0) {
|
||||||
|
fprintf(stderr, "ssh_init failed\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
sshbind = ssh_bind_new();
|
sshbind = ssh_bind_new();
|
||||||
|
if (sshbind == NULL) {
|
||||||
|
fprintf(stderr, "ssh_bind_new failed\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_ARGP_H
|
#ifdef HAVE_ARGP_H
|
||||||
argp_parse(&argp, argc, argv, 0, 0, sshbind);
|
argp_parse(&argp, argc, argv, 0, 0, sshbind);
|
||||||
|
|||||||
@@ -43,7 +43,8 @@ const char *port="22";
|
|||||||
char *pcap_file=NULL;
|
char *pcap_file=NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void usage(){
|
static void usage(void)
|
||||||
|
{
|
||||||
fprintf(stderr,"Usage : sshnetcat [user@]host forwarded_host forwarded_port\n");
|
fprintf(stderr,"Usage : sshnetcat [user@]host forwarded_host forwarded_port\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
project(headers C)
|
project(libssh-headers-x C)
|
||||||
|
|
||||||
add_subdirectory(libssh)
|
add_subdirectory(libssh)
|
||||||
|
|||||||
@@ -15,13 +15,6 @@ if (WITH_SFTP)
|
|||||||
)
|
)
|
||||||
endif (WITH_SFTP)
|
endif (WITH_SFTP)
|
||||||
|
|
||||||
if (WITH_SSH1)
|
|
||||||
set(libssh_HDRS
|
|
||||||
${libssh_HDRS}
|
|
||||||
ssh1.h
|
|
||||||
)
|
|
||||||
endif (WITH_SSH1)
|
|
||||||
|
|
||||||
if (WITH_SERVER)
|
if (WITH_SERVER)
|
||||||
set(libssh_HDRS
|
set(libssh_HDRS
|
||||||
${libssh_HDRS}
|
${libssh_HDRS}
|
||||||
|
|||||||
@@ -66,6 +66,9 @@
|
|||||||
#define SSH_COM_AGENT2_FAILURE 102
|
#define SSH_COM_AGENT2_FAILURE 102
|
||||||
|
|
||||||
#define SSH_AGENT_OLD_SIGNATURE 0x01
|
#define SSH_AGENT_OLD_SIGNATURE 0x01
|
||||||
|
/* Signature flags from draft-miller-ssh-agent-02 */
|
||||||
|
#define SSH_AGENT_RSA_SHA2_256 0x02
|
||||||
|
#define SSH_AGENT_RSA_SHA2_512 0x04
|
||||||
|
|
||||||
struct ssh_agent_struct {
|
struct ssh_agent_struct {
|
||||||
struct ssh_socket_struct *sock;
|
struct ssh_socket_struct *sock;
|
||||||
@@ -81,16 +84,16 @@ struct ssh_agent_struct {
|
|||||||
*
|
*
|
||||||
* @return An allocated ssh agent structure or NULL on error.
|
* @return An allocated ssh agent structure or NULL on error.
|
||||||
*/
|
*/
|
||||||
struct ssh_agent_struct *agent_new(struct ssh_session_struct *session);
|
struct ssh_agent_struct *ssh_agent_new(struct ssh_session_struct *session);
|
||||||
|
|
||||||
void agent_close(struct ssh_agent_struct *agent);
|
void ssh_agent_close(struct ssh_agent_struct *agent);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Free an allocated ssh agent structure.
|
* @brief Free an allocated ssh agent structure.
|
||||||
*
|
*
|
||||||
* @param agent The ssh agent structure to free.
|
* @param agent The ssh agent structure to free.
|
||||||
*/
|
*/
|
||||||
void agent_free(struct ssh_agent_struct *agent);
|
void ssh_agent_free(struct ssh_agent_struct *agent);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Check if the ssh agent is running.
|
* @brief Check if the ssh agent is running.
|
||||||
@@ -99,7 +102,7 @@ void agent_free(struct ssh_agent_struct *agent);
|
|||||||
*
|
*
|
||||||
* @return 1 if it is running, 0 if not.
|
* @return 1 if it is running, 0 if not.
|
||||||
*/
|
*/
|
||||||
int agent_is_running(struct ssh_session_struct *session);
|
int ssh_agent_is_running(struct ssh_session_struct *session);
|
||||||
|
|
||||||
int ssh_agent_get_ident_count(struct ssh_session_struct *session);
|
int ssh_agent_get_ident_count(struct ssh_session_struct *session);
|
||||||
|
|
||||||
@@ -115,4 +118,3 @@ ssh_string ssh_agent_sign_data(ssh_session session,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __AGENT_H */
|
#endif /* __AGENT_H */
|
||||||
/* vim: set ts=2 sw=2 et cindent: */
|
|
||||||
|
|||||||
@@ -49,20 +49,6 @@ ssh_kbdint ssh_kbdint_new(void);
|
|||||||
void ssh_kbdint_clean(ssh_kbdint kbd);
|
void ssh_kbdint_clean(ssh_kbdint kbd);
|
||||||
void ssh_kbdint_free(ssh_kbdint kbd);
|
void ssh_kbdint_free(ssh_kbdint kbd);
|
||||||
|
|
||||||
|
|
||||||
#ifdef WITH_SSH1
|
|
||||||
void ssh_auth1_handler(ssh_session session, uint8_t type);
|
|
||||||
|
|
||||||
/* auth1.c */
|
|
||||||
int ssh_userauth1_none(ssh_session session, const char *username);
|
|
||||||
int ssh_userauth1_offer_pubkey(ssh_session session, const char *username,
|
|
||||||
int type, ssh_string pubkey);
|
|
||||||
int ssh_userauth1_password(ssh_session session, const char *username,
|
|
||||||
const char *password);
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** @internal
|
/** @internal
|
||||||
* States of authentication in the client-side. They describe
|
* States of authentication in the client-side. They describe
|
||||||
* what was the last response from the server
|
* what was the last response from the server
|
||||||
@@ -90,6 +76,14 @@ enum ssh_auth_state_e {
|
|||||||
SSH_AUTH_STATE_GSSAPI_TOKEN,
|
SSH_AUTH_STATE_GSSAPI_TOKEN,
|
||||||
/** We have sent the MIC and expecting to be authenticated */
|
/** We have sent the MIC and expecting to be authenticated */
|
||||||
SSH_AUTH_STATE_GSSAPI_MIC_SENT,
|
SSH_AUTH_STATE_GSSAPI_MIC_SENT,
|
||||||
|
/** We have offered a pubkey to check if it is supported */
|
||||||
|
SSH_AUTH_STATE_PUBKEY_OFFER_SENT,
|
||||||
|
/** We have sent pubkey and signature expecting to be authenticated */
|
||||||
|
SSH_AUTH_STATE_PUBKEY_AUTH_SENT,
|
||||||
|
/** We have sent a password expecting to be authenticated */
|
||||||
|
SSH_AUTH_STATE_PASSWORD_AUTH_SENT,
|
||||||
|
/** We have sent a request without auth information (method 'none') */
|
||||||
|
SSH_AUTH_STATE_AUTH_NONE_SENT,
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @internal
|
/** @internal
|
||||||
@@ -104,8 +98,6 @@ enum ssh_auth_service_state_e {
|
|||||||
SSH_AUTH_SERVICE_ACCEPTED,
|
SSH_AUTH_SERVICE_ACCEPTED,
|
||||||
/** Access to service denied (fatal) */
|
/** Access to service denied (fatal) */
|
||||||
SSH_AUTH_SERVICE_DENIED,
|
SSH_AUTH_SERVICE_DENIED,
|
||||||
/** Specific to SSH1 */
|
|
||||||
SSH_AUTH_SERVICE_USER_SENT
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* AUTH_H_ */
|
#endif /* AUTH_H_ */
|
||||||
|
|||||||
@@ -23,11 +23,12 @@
|
|||||||
|
|
||||||
#include "libssh/libcrypto.h"
|
#include "libssh/libcrypto.h"
|
||||||
#include "libssh/libgcrypt.h"
|
#include "libssh/libgcrypt.h"
|
||||||
|
#include "libssh/libmbedcrypto.h"
|
||||||
|
|
||||||
bignum make_string_bn(ssh_string string);
|
bignum ssh_make_string_bn(ssh_string string);
|
||||||
void make_string_bn_inplace(ssh_string string, bignum bnout);
|
void ssh_make_string_bn_inplace(ssh_string string, bignum bnout);
|
||||||
ssh_string make_bignum_string(bignum num);
|
ssh_string ssh_make_bignum_string(bignum num);
|
||||||
void ssh_print_bignum(const char *which,bignum num);
|
void ssh_print_bignum(const char *which, const bignum num);
|
||||||
|
|
||||||
|
|
||||||
#endif /* BIGNUM_H_ */
|
#endif /* BIGNUM_H_ */
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
typedef struct BlowfishContext {
|
typedef struct BlowfishContext {
|
||||||
uint32_t S[4][256]; /* S-Boxes */
|
uint32_t S[4][256]; /* S-Boxes */
|
||||||
uint32_t P[BLF_N + 2]; /* Subkeys */
|
uint32_t P[BLF_N + 2]; /* Subkeys */
|
||||||
} blf_ctx;
|
} ssh_blf_ctx;
|
||||||
|
|
||||||
/* Raw access to customized Blowfish
|
/* Raw access to customized Blowfish
|
||||||
* blf_key is just:
|
* blf_key is just:
|
||||||
@@ -61,24 +61,24 @@ typedef struct BlowfishContext {
|
|||||||
* Blowfish_expand0state( state, key, keylen )
|
* Blowfish_expand0state( state, key, keylen )
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void Blowfish_encipher(blf_ctx *, uint32_t *, uint32_t *);
|
void Blowfish_encipher(ssh_blf_ctx *, uint32_t *, uint32_t *);
|
||||||
void Blowfish_decipher(blf_ctx *, uint32_t *, uint32_t *);
|
void Blowfish_decipher(ssh_blf_ctx *, uint32_t *, uint32_t *);
|
||||||
void Blowfish_initstate(blf_ctx *);
|
void Blowfish_initstate(ssh_blf_ctx *);
|
||||||
void Blowfish_expand0state(blf_ctx *, const uint8_t *, uint16_t);
|
void Blowfish_expand0state(ssh_blf_ctx *, const uint8_t *, uint16_t);
|
||||||
void Blowfish_expandstate
|
void Blowfish_expandstate
|
||||||
(blf_ctx *, const uint8_t *, uint16_t, const uint8_t *, uint16_t);
|
(ssh_blf_ctx *, const uint8_t *, uint16_t, const uint8_t *, uint16_t);
|
||||||
|
|
||||||
/* Standard Blowfish */
|
/* Standard Blowfish */
|
||||||
|
|
||||||
void blf_key(blf_ctx *, const uint8_t *, uint16_t);
|
void ssh_blf_key(ssh_blf_ctx *, const uint8_t *, uint16_t);
|
||||||
void blf_enc(blf_ctx *, uint32_t *, uint16_t);
|
void ssh_blf_enc(ssh_blf_ctx *, uint32_t *, uint16_t);
|
||||||
void blf_dec(blf_ctx *, uint32_t *, uint16_t);
|
void ssh_blf_dec(ssh_blf_ctx *, uint32_t *, uint16_t);
|
||||||
|
|
||||||
void blf_ecb_encrypt(blf_ctx *, uint8_t *, uint32_t);
|
void ssh_blf_ecb_encrypt(ssh_blf_ctx *, uint8_t *, uint32_t);
|
||||||
void blf_ecb_decrypt(blf_ctx *, uint8_t *, uint32_t);
|
void ssh_blf_ecb_decrypt(ssh_blf_ctx *, uint8_t *, uint32_t);
|
||||||
|
|
||||||
void blf_cbc_encrypt(blf_ctx *, uint8_t *, uint8_t *, uint32_t);
|
void ssh_blf_cbc_encrypt(ssh_blf_ctx *, uint8_t *, uint8_t *, uint32_t);
|
||||||
void blf_cbc_decrypt(blf_ctx *, uint8_t *, uint8_t *, uint32_t);
|
void ssh_blf_cbc_decrypt(ssh_blf_ctx *, uint8_t *, uint8_t *, uint32_t);
|
||||||
|
|
||||||
/* Converts uint8_t to uint32_t */
|
/* Converts uint8_t to uint32_t */
|
||||||
uint32_t Blowfish_stream2word(const uint8_t *, uint16_t , uint16_t *);
|
uint32_t Blowfish_stream2word(const uint8_t *, uint16_t , uint16_t *);
|
||||||
|
|||||||
@@ -24,35 +24,20 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
#include "libssh/libssh.h"
|
#include "libssh/libssh.h"
|
||||||
/*
|
|
||||||
* Describes a buffer state
|
|
||||||
* [XXXXXXXXXXXXDATA PAYLOAD XXXXXXXXXXXXXXXXXXXXXXXX]
|
|
||||||
* ^ ^ ^ ^]
|
|
||||||
* \_data points\_pos points here \_used points here | /
|
|
||||||
* here Allocated
|
|
||||||
*/
|
|
||||||
struct ssh_buffer_struct {
|
|
||||||
char *data;
|
|
||||||
uint32_t used;
|
|
||||||
uint32_t allocated;
|
|
||||||
uint32_t pos;
|
|
||||||
int secure;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define SSH_BUFFER_PACK_END ((uint32_t) 0x4f65feb3)
|
#define SSH_BUFFER_PACK_END ((uint32_t) 0x4f65feb3)
|
||||||
|
|
||||||
LIBSSH_API void ssh_buffer_free(ssh_buffer buffer);
|
|
||||||
LIBSSH_API void *ssh_buffer_get_begin(ssh_buffer buffer);
|
|
||||||
LIBSSH_API uint32_t ssh_buffer_get_len(ssh_buffer buffer);
|
|
||||||
LIBSSH_API ssh_buffer ssh_buffer_new(void);
|
|
||||||
void ssh_buffer_set_secure(ssh_buffer buffer);
|
void ssh_buffer_set_secure(ssh_buffer buffer);
|
||||||
int buffer_add_ssh_string(ssh_buffer buffer, ssh_string string);
|
int ssh_buffer_add_ssh_string(ssh_buffer buffer, ssh_string string);
|
||||||
int buffer_add_u8(ssh_buffer buffer, uint8_t data);
|
int ssh_buffer_add_u8(ssh_buffer buffer, uint8_t data);
|
||||||
int buffer_add_u16(ssh_buffer buffer, uint16_t data);
|
int ssh_buffer_add_u16(ssh_buffer buffer, uint16_t data);
|
||||||
int buffer_add_u32(ssh_buffer buffer, uint32_t data);
|
int ssh_buffer_add_u32(ssh_buffer buffer, uint32_t data);
|
||||||
int buffer_add_u64(ssh_buffer buffer, uint64_t data);
|
int ssh_buffer_add_u64(ssh_buffer buffer, uint64_t data);
|
||||||
int ssh_buffer_add_data(ssh_buffer buffer, const void *data, uint32_t len);
|
|
||||||
|
|
||||||
|
int ssh_buffer_validate_length(struct ssh_buffer_struct *buffer, size_t len);
|
||||||
|
|
||||||
|
void *ssh_buffer_allocate(struct ssh_buffer_struct *buffer, uint32_t len);
|
||||||
|
int ssh_buffer_allocate_size(struct ssh_buffer_struct *buffer, uint32_t len);
|
||||||
int ssh_buffer_pack_va(struct ssh_buffer_struct *buffer,
|
int ssh_buffer_pack_va(struct ssh_buffer_struct *buffer,
|
||||||
const char *format,
|
const char *format,
|
||||||
int argc,
|
int argc,
|
||||||
@@ -74,27 +59,19 @@ int _ssh_buffer_unpack(struct ssh_buffer_struct *buffer,
|
|||||||
#define ssh_buffer_unpack(buffer, format, ...) \
|
#define ssh_buffer_unpack(buffer, format, ...) \
|
||||||
_ssh_buffer_unpack((buffer), (format), __VA_NARG__(__VA_ARGS__), __VA_ARGS__, SSH_BUFFER_PACK_END)
|
_ssh_buffer_unpack((buffer), (format), __VA_NARG__(__VA_ARGS__), __VA_ARGS__, SSH_BUFFER_PACK_END)
|
||||||
|
|
||||||
int buffer_prepend_data(ssh_buffer buffer, const void *data, uint32_t len);
|
int ssh_buffer_prepend_data(ssh_buffer buffer, const void *data, uint32_t len);
|
||||||
int buffer_add_buffer(ssh_buffer buffer, ssh_buffer source);
|
int ssh_buffer_add_buffer(ssh_buffer buffer, ssh_buffer source);
|
||||||
int ssh_buffer_reinit(ssh_buffer buffer);
|
|
||||||
|
|
||||||
/* buffer_get_rest returns a pointer to the current position into the buffer */
|
|
||||||
void *buffer_get_rest(ssh_buffer buffer);
|
|
||||||
/* buffer_get_rest_len returns the number of bytes which can be read */
|
|
||||||
uint32_t buffer_get_rest_len(ssh_buffer buffer);
|
|
||||||
|
|
||||||
/* buffer_read_*() returns the number of bytes read, except for ssh strings */
|
/* buffer_read_*() returns the number of bytes read, except for ssh strings */
|
||||||
int buffer_get_u8(ssh_buffer buffer, uint8_t *data);
|
int ssh_buffer_get_u8(ssh_buffer buffer, uint8_t *data);
|
||||||
int buffer_get_u32(ssh_buffer buffer, uint32_t *data);
|
int ssh_buffer_get_u32(ssh_buffer buffer, uint32_t *data);
|
||||||
int buffer_get_u64(ssh_buffer buffer, uint64_t *data);
|
int ssh_buffer_get_u64(ssh_buffer buffer, uint64_t *data);
|
||||||
|
|
||||||
uint32_t buffer_get_data(ssh_buffer buffer, void *data, uint32_t requestedlen);
|
/* ssh_buffer_get_ssh_string() is an exception. if the String read is too large or invalid, it will answer NULL. */
|
||||||
/* buffer_get_ssh_string() is an exception. if the String read is too large or invalid, it will answer NULL. */
|
ssh_string ssh_buffer_get_ssh_string(ssh_buffer buffer);
|
||||||
ssh_string buffer_get_ssh_string(ssh_buffer buffer);
|
|
||||||
/* gets a string out of a SSH-1 mpint */
|
/* ssh_buffer_pass_bytes acts as if len bytes have been read (used for padding) */
|
||||||
ssh_string buffer_get_mpint(ssh_buffer buffer);
|
uint32_t ssh_buffer_pass_bytes_end(ssh_buffer buffer, uint32_t len);
|
||||||
/* buffer_pass_bytes acts as if len bytes have been read (used for padding) */
|
uint32_t ssh_buffer_pass_bytes(ssh_buffer buffer, uint32_t len);
|
||||||
uint32_t buffer_pass_bytes_end(ssh_buffer buffer, uint32_t len);
|
|
||||||
uint32_t buffer_pass_bytes(ssh_buffer buffer, uint32_t len);
|
|
||||||
|
|
||||||
#endif /* BUFFER_H_ */
|
#endif /* BUFFER_H_ */
|
||||||
|
|||||||
@@ -124,6 +124,18 @@ typedef void (*ssh_global_request_callback) (ssh_session session,
|
|||||||
typedef ssh_channel (*ssh_channel_open_request_x11_callback) (ssh_session session,
|
typedef ssh_channel (*ssh_channel_open_request_x11_callback) (ssh_session session,
|
||||||
const char * originator_address, int originator_port, void *userdata);
|
const char * originator_address, int originator_port, void *userdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handles an SSH new channel open "auth-agent" request. This happens when the server
|
||||||
|
* sends back an "auth-agent" connection attempt. This is a client-side API
|
||||||
|
* @param session current session handler
|
||||||
|
* @param userdata Userdata to be passed to the callback function.
|
||||||
|
* @returns a valid ssh_channel handle if the request is to be allowed
|
||||||
|
* @returns NULL if the request should not be allowed
|
||||||
|
* @warning The channel pointer returned by this callback must be closed by the application.
|
||||||
|
*/
|
||||||
|
typedef ssh_channel (*ssh_channel_open_request_auth_agent_callback) (ssh_session session,
|
||||||
|
void *userdata);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The structure to replace libssh functions with appropriate callbacks.
|
* The structure to replace libssh functions with appropriate callbacks.
|
||||||
*/
|
*/
|
||||||
@@ -154,6 +166,9 @@ struct ssh_callbacks_struct {
|
|||||||
/** This function will be called when an incoming X11 request is received.
|
/** This function will be called when an incoming X11 request is received.
|
||||||
*/
|
*/
|
||||||
ssh_channel_open_request_x11_callback channel_open_request_x11_function;
|
ssh_channel_open_request_x11_callback channel_open_request_x11_function;
|
||||||
|
/** This function will be called when an incoming "auth-agent" request is received.
|
||||||
|
*/
|
||||||
|
ssh_channel_open_request_auth_agent_callback channel_open_request_auth_agent_function;
|
||||||
};
|
};
|
||||||
typedef struct ssh_callbacks_struct *ssh_callbacks;
|
typedef struct ssh_callbacks_struct *ssh_callbacks;
|
||||||
|
|
||||||
@@ -420,6 +435,69 @@ typedef struct ssh_socket_callbacks_struct *ssh_socket_callbacks;
|
|||||||
((p)-> c != NULL) \
|
((p)-> c != NULL) \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*
|
||||||
|
* @brief Iterate through a list of callback structures
|
||||||
|
*
|
||||||
|
* This tests for their validity and executes them. The userdata argument is
|
||||||
|
* automatically passed through.
|
||||||
|
*
|
||||||
|
* @param list list of callbacks
|
||||||
|
*
|
||||||
|
* @param cbtype type of the callback
|
||||||
|
*
|
||||||
|
* @param c callback name
|
||||||
|
*
|
||||||
|
* @param va_args parameters to be passed
|
||||||
|
*/
|
||||||
|
#define ssh_callbacks_execute_list(list, cbtype, c, ...) \
|
||||||
|
do { \
|
||||||
|
struct ssh_iterator *i = ssh_list_get_iterator(list); \
|
||||||
|
cbtype cb; \
|
||||||
|
while (i != NULL){ \
|
||||||
|
cb = ssh_iterator_value(cbtype, i); \
|
||||||
|
if (ssh_callbacks_exists(cb, c)) \
|
||||||
|
cb-> c (__VA_ARGS__, cb->userdata); \
|
||||||
|
i = i->next; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*
|
||||||
|
* @brief iterate through a list of callback structures.
|
||||||
|
*
|
||||||
|
* This tests for their validity and give control back to the calling code to
|
||||||
|
* execute them. Caller can decide to break the loop or continue executing the
|
||||||
|
* callbacks with different parameters
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* ssh_callbacks_iterate(channel->callbacks, ssh_channel_callbacks,
|
||||||
|
* channel_eof_function){
|
||||||
|
* rc = ssh_callbacks_iterate_exec(session, channel);
|
||||||
|
* if (rc != SSH_OK){
|
||||||
|
* break;
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* ssh_callbacks_iterate_end();
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
#define ssh_callbacks_iterate(_cb_list, _cb_type, _cb_name) \
|
||||||
|
do { \
|
||||||
|
struct ssh_iterator *_cb_i = ssh_list_get_iterator(_cb_list); \
|
||||||
|
_cb_type _cb; \
|
||||||
|
for (; _cb_i != NULL; _cb_i = _cb_i->next) { \
|
||||||
|
_cb = ssh_iterator_value(_cb_type, _cb_i); \
|
||||||
|
if (ssh_callbacks_exists(_cb, _cb_name))
|
||||||
|
|
||||||
|
#define ssh_callbacks_iterate_exec(_cb_name, ...) \
|
||||||
|
_cb->_cb_name(__VA_ARGS__, _cb->userdata)
|
||||||
|
|
||||||
|
#define ssh_callbacks_iterate_end() \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
/** @brief Prototype for a packet callback, to be called when a new packet arrives
|
/** @brief Prototype for a packet callback, to be called when a new packet arrives
|
||||||
* @param session The current session of the packet
|
* @param session The current session of the packet
|
||||||
* @param type packet type (see ssh2.h)
|
* @param type packet type (see ssh2.h)
|
||||||
@@ -679,6 +757,22 @@ typedef int (*ssh_channel_subsystem_request_callback) (ssh_session session,
|
|||||||
const char *subsystem,
|
const char *subsystem,
|
||||||
void *userdata);
|
void *userdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSH channel write will not block (flow control).
|
||||||
|
*
|
||||||
|
* @param channel the channel
|
||||||
|
*
|
||||||
|
* @param[in] bytes size of the remote window in bytes. Writing as much data
|
||||||
|
* will not block.
|
||||||
|
*
|
||||||
|
* @param[in] userdata Userdata to be passed to the callback function.
|
||||||
|
*
|
||||||
|
* @returns 0 default return value (other return codes may be added in future).
|
||||||
|
*/
|
||||||
|
typedef int (*ssh_channel_write_wontblock_callback) (ssh_session session,
|
||||||
|
ssh_channel channel,
|
||||||
|
size_t bytes,
|
||||||
|
void *userdata);
|
||||||
|
|
||||||
struct ssh_channel_callbacks_struct {
|
struct ssh_channel_callbacks_struct {
|
||||||
/** DON'T SET THIS use ssh_callbacks_init() instead. */
|
/** DON'T SET THIS use ssh_callbacks_init() instead. */
|
||||||
@@ -743,6 +837,10 @@ struct ssh_channel_callbacks_struct {
|
|||||||
* (like sftp).
|
* (like sftp).
|
||||||
*/
|
*/
|
||||||
ssh_channel_subsystem_request_callback channel_subsystem_request_function;
|
ssh_channel_subsystem_request_callback channel_subsystem_request_function;
|
||||||
|
/** This function will be called when the channel write is guaranteed
|
||||||
|
* not to block.
|
||||||
|
*/
|
||||||
|
ssh_channel_write_wontblock_callback channel_write_wontblock_function;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct ssh_channel_callbacks_struct *ssh_channel_callbacks;
|
typedef struct ssh_channel_callbacks_struct *ssh_channel_callbacks;
|
||||||
@@ -767,10 +865,46 @@ typedef struct ssh_channel_callbacks_struct *ssh_channel_callbacks;
|
|||||||
* @param cb The callback structure itself.
|
* @param cb The callback structure itself.
|
||||||
*
|
*
|
||||||
* @return SSH_OK on success, SSH_ERROR on error.
|
* @return SSH_OK on success, SSH_ERROR on error.
|
||||||
|
* @warning this function will not replace existing callbacks but set the
|
||||||
|
* new one atop of them.
|
||||||
*/
|
*/
|
||||||
LIBSSH_API int ssh_set_channel_callbacks(ssh_channel channel,
|
LIBSSH_API int ssh_set_channel_callbacks(ssh_channel channel,
|
||||||
ssh_channel_callbacks cb);
|
ssh_channel_callbacks cb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Add channel callback functions
|
||||||
|
*
|
||||||
|
* This function will add channel callback functions to the channel callback
|
||||||
|
* list.
|
||||||
|
* Callbacks missing from a callback structure will be probed in the next
|
||||||
|
* on the list.
|
||||||
|
*
|
||||||
|
* @param channel The channel to set the callback structure.
|
||||||
|
*
|
||||||
|
* @param cb The callback structure itself.
|
||||||
|
*
|
||||||
|
* @return SSH_OK on success, SSH_ERROR on error.
|
||||||
|
*
|
||||||
|
* @see ssh_set_channel_callbacks
|
||||||
|
*/
|
||||||
|
LIBSSH_API int ssh_add_channel_callbacks(ssh_channel channel,
|
||||||
|
ssh_channel_callbacks cb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Remove a channel callback.
|
||||||
|
*
|
||||||
|
* The channel has been added with ssh_add_channel_callbacks or
|
||||||
|
* ssh_set_channel_callbacks in this case.
|
||||||
|
*
|
||||||
|
* @param channel The channel to remove the callback structure from.
|
||||||
|
*
|
||||||
|
* @param cb The callback structure to remove
|
||||||
|
*
|
||||||
|
* @returns SSH_OK on success, SSH_ERROR on error.
|
||||||
|
*/
|
||||||
|
LIBSSH_API int ssh_remove_channel_callbacks(ssh_channel channel,
|
||||||
|
ssh_channel_callbacks cb);
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/** @group libssh_threads
|
/** @group libssh_threads
|
||||||
|
|||||||
41
include/libssh/chacha.h
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/* $OpenBSD: chacha.h,v 1.3 2014/05/02 03:27:54 djm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
chacha-merged.c version 20080118
|
||||||
|
D. J. Bernstein
|
||||||
|
Public domain.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CHACHA_H
|
||||||
|
#define CHACHA_H
|
||||||
|
|
||||||
|
struct chacha_ctx {
|
||||||
|
uint32_t input[16];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CHACHA_MINKEYLEN 16
|
||||||
|
#define CHACHA_NONCELEN 8
|
||||||
|
#define CHACHA_CTRLEN 8
|
||||||
|
#define CHACHA_STATELEN (CHACHA_NONCELEN+CHACHA_CTRLEN)
|
||||||
|
#define CHACHA_BLOCKLEN 64
|
||||||
|
|
||||||
|
void chacha_keysetup(struct chacha_ctx *x, const uint8_t *k, uint32_t kbits)
|
||||||
|
#ifdef HAVE_GCC_BOUNDED_ATTRIBUTE
|
||||||
|
__attribute__((__bounded__(__minbytes__, 2, CHACHA_MINKEYLEN)))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
void chacha_ivsetup(struct chacha_ctx *x, const uint8_t *iv, const uint8_t *ctr)
|
||||||
|
#ifdef HAVE_GCC_BOUNDED_ATTRIBUTE
|
||||||
|
__attribute__((__bounded__(__minbytes__, 2, CHACHA_NONCELEN)))
|
||||||
|
__attribute__((__bounded__(__minbytes__, 3, CHACHA_CTRLEN)))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
void chacha_encrypt_bytes(struct chacha_ctx *x, const uint8_t *m,
|
||||||
|
uint8_t *c, uint32_t bytes)
|
||||||
|
#ifdef HAVE_GCC_BOUNDED_ATTRIBUTE
|
||||||
|
__attribute__((__bounded__(__buffer__, 2, 4)))
|
||||||
|
__attribute__((__bounded__(__buffer__, 3, 4)))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
|
#endif /* CHACHA_H */
|
||||||
@@ -48,11 +48,16 @@ enum ssh_channel_state_e {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* The channel has been closed by the remote side */
|
/* The channel has been closed by the remote side */
|
||||||
#define SSH_CHANNEL_FLAG_CLOSED_REMOTE 0x1
|
#define SSH_CHANNEL_FLAG_CLOSED_REMOTE 0x0001
|
||||||
|
|
||||||
|
/* The channel has been closed locally */
|
||||||
|
#define SSH_CHANNEL_FLAG_CLOSED_LOCAL 0x0002
|
||||||
|
|
||||||
/* The channel has been freed by the calling program */
|
/* The channel has been freed by the calling program */
|
||||||
#define SSH_CHANNEL_FLAG_FREED_LOCAL 0x2
|
#define SSH_CHANNEL_FLAG_FREED_LOCAL 0x0004
|
||||||
|
|
||||||
/* the channel has not yet been bound to a remote one */
|
/* the channel has not yet been bound to a remote one */
|
||||||
#define SSH_CHANNEL_FLAG_NOT_BOUND 0x4
|
#define SSH_CHANNEL_FLAG_NOT_BOUND 0x0008
|
||||||
|
|
||||||
struct ssh_channel_struct {
|
struct ssh_channel_struct {
|
||||||
ssh_session session; /* SSH_SESSION pointer */
|
ssh_session session; /* SSH_SESSION pointer */
|
||||||
@@ -71,10 +76,10 @@ struct ssh_channel_struct {
|
|||||||
ssh_buffer stdout_buffer;
|
ssh_buffer stdout_buffer;
|
||||||
ssh_buffer stderr_buffer;
|
ssh_buffer stderr_buffer;
|
||||||
void *userarg;
|
void *userarg;
|
||||||
int version;
|
|
||||||
int exit_status;
|
int exit_status;
|
||||||
enum ssh_channel_request_state_e request_state;
|
enum ssh_channel_request_state_e request_state;
|
||||||
ssh_channel_callbacks callbacks;
|
struct ssh_list *callbacks; /* list of ssh_channel_callbacks */
|
||||||
|
|
||||||
/* counters */
|
/* counters */
|
||||||
ssh_counter counter;
|
ssh_counter counter;
|
||||||
};
|
};
|
||||||
@@ -92,27 +97,15 @@ SSH_PACKET_CALLBACK(channel_rcv_close);
|
|||||||
SSH_PACKET_CALLBACK(channel_rcv_request);
|
SSH_PACKET_CALLBACK(channel_rcv_request);
|
||||||
SSH_PACKET_CALLBACK(channel_rcv_data);
|
SSH_PACKET_CALLBACK(channel_rcv_data);
|
||||||
|
|
||||||
ssh_channel ssh_channel_new(ssh_session session);
|
|
||||||
int channel_default_bufferize(ssh_channel channel, void *data, int len,
|
int channel_default_bufferize(ssh_channel channel, void *data, int len,
|
||||||
int is_stderr);
|
int is_stderr);
|
||||||
int ssh_channel_flush(ssh_channel channel);
|
int ssh_channel_flush(ssh_channel channel);
|
||||||
uint32_t ssh_channel_new_id(ssh_session session);
|
uint32_t ssh_channel_new_id(ssh_session session);
|
||||||
ssh_channel ssh_channel_from_local(ssh_session session, uint32_t id);
|
ssh_channel ssh_channel_from_local(ssh_session session, uint32_t id);
|
||||||
void ssh_channel_do_free(ssh_channel channel);
|
void ssh_channel_do_free(ssh_channel channel);
|
||||||
#ifdef WITH_SSH1
|
int ssh_global_request(ssh_session session,
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_data1);
|
const char *request,
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_close1);
|
ssh_buffer buffer,
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_exist_status1);
|
int reply);
|
||||||
|
|
||||||
/* channels1.c */
|
|
||||||
int channel_open_session1(ssh_channel channel);
|
|
||||||
int channel_request_pty_size1(ssh_channel channel, const char *terminal,
|
|
||||||
int cols, int rows);
|
|
||||||
int channel_change_pty_size1(ssh_channel channel, int cols, int rows);
|
|
||||||
int channel_request_shell1(ssh_channel channel);
|
|
||||||
int channel_request_exec1(ssh_channel channel, const char *cmd);
|
|
||||||
int channel_write1(ssh_channel channel, const void *data, int len);
|
|
||||||
ssh_channel ssh_get_channel1(ssh_session session);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* CHANNELS_H_ */
|
#endif /* CHANNELS_H_ */
|
||||||
|
|||||||
@@ -55,14 +55,42 @@ enum ssh_key_exchange_e {
|
|||||||
SSH_KEX_DH_GROUP14_SHA1,
|
SSH_KEX_DH_GROUP14_SHA1,
|
||||||
/* ecdh-sha2-nistp256 */
|
/* ecdh-sha2-nistp256 */
|
||||||
SSH_KEX_ECDH_SHA2_NISTP256,
|
SSH_KEX_ECDH_SHA2_NISTP256,
|
||||||
|
/* ecdh-sha2-nistp384 */
|
||||||
|
SSH_KEX_ECDH_SHA2_NISTP384,
|
||||||
|
/* ecdh-sha2-nistp521 */
|
||||||
|
SSH_KEX_ECDH_SHA2_NISTP521,
|
||||||
/* curve25519-sha256@libssh.org */
|
/* curve25519-sha256@libssh.org */
|
||||||
SSH_KEX_CURVE25519_SHA256_LIBSSH_ORG
|
SSH_KEX_CURVE25519_SHA256_LIBSSH_ORG,
|
||||||
|
/* curve25519-sha256 */
|
||||||
|
SSH_KEX_CURVE25519_SHA256,
|
||||||
|
/* diffie-hellman-group16-sha512 */
|
||||||
|
SSH_KEX_DH_GROUP16_SHA512,
|
||||||
|
/* diffie-hellman-group18-sha512 */
|
||||||
|
SSH_KEX_DH_GROUP18_SHA512,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ssh_cipher_e {
|
||||||
|
SSH_NO_CIPHER=0,
|
||||||
|
SSH_BLOWFISH_CBC,
|
||||||
|
SSH_3DES_CBC,
|
||||||
|
SSH_AES128_CBC,
|
||||||
|
SSH_AES192_CBC,
|
||||||
|
SSH_AES256_CBC,
|
||||||
|
SSH_AES128_CTR,
|
||||||
|
SSH_AES192_CTR,
|
||||||
|
SSH_AES256_CTR
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ssh_crypto_struct {
|
struct ssh_crypto_struct {
|
||||||
bignum e,f,x,k,y;
|
bignum e,f,x,k,y;
|
||||||
#ifdef HAVE_ECDH
|
#ifdef HAVE_ECDH
|
||||||
|
#ifdef HAVE_OPENSSL_ECC
|
||||||
EC_KEY *ecdh_privkey;
|
EC_KEY *ecdh_privkey;
|
||||||
|
#elif defined HAVE_GCRYPT_ECC
|
||||||
|
gcry_sexp_t ecdh_privkey;
|
||||||
|
#elif defined HAVE_LIBMBEDCRYPTO
|
||||||
|
mbedtls_ecp_keypair *ecdh_privkey;
|
||||||
|
#endif
|
||||||
ssh_string ecdh_client_pubkey;
|
ssh_string ecdh_client_pubkey;
|
||||||
ssh_string ecdh_server_pubkey;
|
ssh_string ecdh_server_pubkey;
|
||||||
#endif
|
#endif
|
||||||
@@ -85,8 +113,7 @@ struct ssh_crypto_struct {
|
|||||||
struct ssh_cipher_struct *in_cipher, *out_cipher; /* the cipher structures/objects */
|
struct ssh_cipher_struct *in_cipher, *out_cipher; /* the cipher structures/objects */
|
||||||
enum ssh_hmac_e in_hmac, out_hmac; /* the MAC algorithms used */
|
enum ssh_hmac_e in_hmac, out_hmac; /* the MAC algorithms used */
|
||||||
|
|
||||||
ssh_string server_pubkey;
|
ssh_key server_pubkey;
|
||||||
const char *server_pubkey_type;
|
|
||||||
int do_compress_out; /* idem */
|
int do_compress_out; /* idem */
|
||||||
int do_compress_in; /* don't set them, set the option instead */
|
int do_compress_in; /* don't set them, set the option instead */
|
||||||
int delayed_compress_in; /* Use of zlib@openssh.org */
|
int delayed_compress_in; /* Use of zlib@openssh.org */
|
||||||
@@ -104,14 +131,24 @@ struct ssh_crypto_struct {
|
|||||||
struct ssh_cipher_struct {
|
struct ssh_cipher_struct {
|
||||||
const char *name; /* ssh name of the algorithm */
|
const char *name; /* ssh name of the algorithm */
|
||||||
unsigned int blocksize; /* blocksize of the algo */
|
unsigned int blocksize; /* blocksize of the algo */
|
||||||
unsigned int keylen; /* length of the key structure */
|
enum ssh_cipher_e ciphertype;
|
||||||
|
uint32_t lenfield_blocksize; /* blocksize of the packet length field */
|
||||||
|
size_t keylen; /* length of the key structure */
|
||||||
#ifdef HAVE_LIBGCRYPT
|
#ifdef HAVE_LIBGCRYPT
|
||||||
gcry_cipher_hd_t *key;
|
gcry_cipher_hd_t *key;
|
||||||
#elif defined HAVE_LIBCRYPTO
|
#elif defined HAVE_LIBCRYPTO
|
||||||
void *key; /* a key buffer allocated for the algo */
|
struct ssh_3des_key_schedule *des3_key;
|
||||||
void *IV;
|
struct ssh_aes_key_schedule *aes_key;
|
||||||
|
const EVP_CIPHER *cipher;
|
||||||
|
EVP_CIPHER_CTX *ctx;
|
||||||
|
#elif defined HAVE_LIBMBEDCRYPTO
|
||||||
|
mbedtls_cipher_context_t encrypt_ctx;
|
||||||
|
mbedtls_cipher_context_t decrypt_ctx;
|
||||||
|
mbedtls_cipher_type_t type;
|
||||||
#endif
|
#endif
|
||||||
|
struct chacha20_poly1305_keysched *chacha20_schedule;
|
||||||
unsigned int keysize; /* bytes of key used. != keylen */
|
unsigned int keysize; /* bytes of key used. != keylen */
|
||||||
|
size_t tag_size; /* overhead required for tag */
|
||||||
/* sets the new key for immediate use */
|
/* sets the new key for immediate use */
|
||||||
int (*set_encrypt_key)(struct ssh_cipher_struct *cipher, void *key, void *IV);
|
int (*set_encrypt_key)(struct ssh_cipher_struct *cipher, void *key, void *IV);
|
||||||
int (*set_decrypt_key)(struct ssh_cipher_struct *cipher, void *key, void *IV);
|
int (*set_decrypt_key)(struct ssh_cipher_struct *cipher, void *key, void *IV);
|
||||||
@@ -119,7 +156,15 @@ struct ssh_cipher_struct {
|
|||||||
unsigned long len);
|
unsigned long len);
|
||||||
void (*decrypt)(struct ssh_cipher_struct *cipher, void *in, void *out,
|
void (*decrypt)(struct ssh_cipher_struct *cipher, void *in, void *out,
|
||||||
unsigned long len);
|
unsigned long len);
|
||||||
|
void (*aead_encrypt)(struct ssh_cipher_struct *cipher, void *in, void *out,
|
||||||
|
size_t len, uint8_t *mac, uint64_t seq);
|
||||||
|
int (*aead_decrypt_length)(struct ssh_cipher_struct *cipher, void *in,
|
||||||
|
uint8_t *out, size_t len, uint64_t seq);
|
||||||
|
int (*aead_decrypt)(struct ssh_cipher_struct *cipher, void *complete_packet, uint8_t *out,
|
||||||
|
size_t encrypted_size, uint64_t seq);
|
||||||
|
void (*cleanup)(struct ssh_cipher_struct *cipher);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* vim: set ts=2 sw=2 et cindent: */
|
const struct ssh_cipher_struct *ssh_get_chacha20poly1305_cipher(void);
|
||||||
|
|
||||||
#endif /* _CRYPTO_H_ */
|
#endif /* _CRYPTO_H_ */
|
||||||
|
|||||||
@@ -25,27 +25,37 @@
|
|||||||
|
|
||||||
#include "libssh/crypto.h"
|
#include "libssh/crypto.h"
|
||||||
|
|
||||||
int dh_generate_e(ssh_session session);
|
int ssh_dh_generate_e(ssh_session session);
|
||||||
int dh_generate_f(ssh_session session);
|
int ssh_dh_generate_f(ssh_session session);
|
||||||
int dh_generate_x(ssh_session session);
|
int ssh_dh_generate_x(ssh_session session);
|
||||||
int dh_generate_y(ssh_session session);
|
int ssh_dh_generate_y(ssh_session session);
|
||||||
|
|
||||||
int ssh_crypto_init(void);
|
int ssh_dh_init(void);
|
||||||
void ssh_crypto_finalize(void);
|
void ssh_dh_finalize(void);
|
||||||
|
|
||||||
ssh_string dh_get_e(ssh_session session);
|
ssh_string ssh_dh_get_e(ssh_session session);
|
||||||
ssh_string dh_get_f(ssh_session session);
|
ssh_string ssh_dh_get_f(ssh_session session);
|
||||||
int dh_import_f(ssh_session session,ssh_string f_string);
|
int ssh_dh_import_f(ssh_session session,ssh_string f_string);
|
||||||
int dh_import_e(ssh_session session, ssh_string e_string);
|
int ssh_dh_import_e(ssh_session session, ssh_string e_string);
|
||||||
void dh_import_pubkey(ssh_session session,ssh_string pubkey_string);
|
|
||||||
int dh_build_k(ssh_session session);
|
int ssh_dh_import_pubkey_blob(ssh_session session, ssh_string pubkey_blob);
|
||||||
|
int ssh_dh_import_next_pubkey_blob(ssh_session session, ssh_string pubkey_blob);
|
||||||
|
|
||||||
|
int ssh_dh_build_k(ssh_session session);
|
||||||
int ssh_client_dh_init(ssh_session session);
|
int ssh_client_dh_init(ssh_session session);
|
||||||
int ssh_client_dh_reply(ssh_session session, ssh_buffer packet);
|
int ssh_client_dh_reply(ssh_session session, ssh_buffer packet);
|
||||||
|
|
||||||
int make_sessionid(ssh_session session);
|
ssh_key ssh_dh_get_current_server_publickey(ssh_session session);
|
||||||
|
int ssh_dh_get_current_server_publickey_blob(ssh_session session,
|
||||||
|
ssh_string *pubkey_blob);
|
||||||
|
ssh_key ssh_dh_get_next_server_publickey(ssh_session session);
|
||||||
|
int ssh_dh_get_next_server_publickey_blob(ssh_session session,
|
||||||
|
ssh_string *pubkey_blob);
|
||||||
|
|
||||||
|
int ssh_make_sessionid(ssh_session session);
|
||||||
/* add data for the final cookie */
|
/* add data for the final cookie */
|
||||||
int hashbufin_add_cookie(ssh_session session, unsigned char *cookie);
|
int ssh_hashbufin_add_cookie(ssh_session session, unsigned char *cookie);
|
||||||
int hashbufout_add_cookie(ssh_session session);
|
int ssh_hashbufout_add_cookie(ssh_session session);
|
||||||
int generate_session_keys(ssh_session session);
|
int ssh_generate_session_keys(ssh_session session);
|
||||||
|
|
||||||
#endif /* DH_H_ */
|
#endif /* DH_H_ */
|
||||||
|
|||||||
@@ -33,9 +33,21 @@
|
|||||||
#endif /* HAVE_OPENSSL_ECDH_H */
|
#endif /* HAVE_OPENSSL_ECDH_H */
|
||||||
#endif /* HAVE_LIBCRYPTO */
|
#endif /* HAVE_LIBCRYPTO */
|
||||||
|
|
||||||
int ssh_client_ecdh_init(ssh_session session);
|
#ifdef HAVE_GCRYPT_ECC
|
||||||
|
#define HAVE_ECDH 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBMBEDCRYPTO
|
||||||
|
#define HAVE_ECDH 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Common functions. */
|
||||||
int ssh_client_ecdh_reply(ssh_session session, ssh_buffer packet);
|
int ssh_client_ecdh_reply(ssh_session session, ssh_buffer packet);
|
||||||
|
|
||||||
|
/* Backend-specific functions. */
|
||||||
|
int ssh_client_ecdh_init(ssh_session session);
|
||||||
|
int ecdh_build_k(ssh_session session);
|
||||||
|
|
||||||
#ifdef WITH_SERVER
|
#ifdef WITH_SERVER
|
||||||
int ssh_server_ecdh_init(ssh_session session, ssh_buffer packet);
|
int ssh_server_ecdh_init(ssh_session session, ssh_buffer packet);
|
||||||
#endif /* WITH_SERVER */
|
#endif /* WITH_SERVER */
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ typedef struct
|
|||||||
fe25519 t;
|
fe25519 t;
|
||||||
} ge25519;
|
} ge25519;
|
||||||
|
|
||||||
const ge25519 ge25519_base;
|
extern const ge25519 ge25519_base;
|
||||||
|
|
||||||
int ge25519_unpackneg_vartime(ge25519 *r, const unsigned char p[32]);
|
int ge25519_unpackneg_vartime(ge25519 *r, const unsigned char p[32]);
|
||||||
|
|
||||||
|
|||||||
@@ -32,19 +32,19 @@ struct ssh_kex_struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_kexinit);
|
SSH_PACKET_CALLBACK(ssh_packet_kexinit);
|
||||||
#ifdef WITH_SSH1
|
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_publickey1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int ssh_send_kex(ssh_session session, int server_kex);
|
int ssh_send_kex(ssh_session session, int server_kex);
|
||||||
void ssh_list_kex(struct ssh_kex_struct *kex);
|
void ssh_list_kex(struct ssh_kex_struct *kex);
|
||||||
int set_client_kex(ssh_session session);
|
int ssh_set_client_kex(ssh_session session);
|
||||||
int ssh_kex_select_methods(ssh_session session);
|
int ssh_kex_select_methods(ssh_session session);
|
||||||
int verify_existing_algo(int algo, const char *name);
|
int ssh_verify_existing_algo(enum ssh_kex_types_e algo, const char *name);
|
||||||
char **space_tokenize(const char *chain);
|
char *ssh_keep_known_algos(enum ssh_kex_types_e algo, const char *list);
|
||||||
|
char **ssh_space_tokenize(const char *chain);
|
||||||
int ssh_get_kex1(ssh_session session);
|
int ssh_get_kex1(ssh_session session);
|
||||||
char *ssh_find_matching(const char *in_d, const char *what_d);
|
char *ssh_find_matching(const char *in_d, const char *what_d);
|
||||||
const char *ssh_kex_get_supported_method(uint32_t algo);
|
const char *ssh_kex_get_supported_method(uint32_t algo);
|
||||||
|
const char *ssh_kex_get_default_methods(uint32_t algo);
|
||||||
const char *ssh_kex_get_description(uint32_t algo);
|
const char *ssh_kex_get_description(uint32_t algo);
|
||||||
|
char *ssh_client_select_hostkeys(ssh_session session);
|
||||||
|
|
||||||
#endif /* KEX_H_ */
|
#endif /* KEX_H_ */
|
||||||
|
|||||||
@@ -34,6 +34,9 @@ struct ssh_public_key_struct {
|
|||||||
#elif HAVE_LIBCRYPTO
|
#elif HAVE_LIBCRYPTO
|
||||||
DSA *dsa_pub;
|
DSA *dsa_pub;
|
||||||
RSA *rsa_pub;
|
RSA *rsa_pub;
|
||||||
|
#elif HAVE_LIBMBEDCRYPTO
|
||||||
|
mbedtls_pk_context *rsa_pub;
|
||||||
|
void *dsa_pub;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -45,6 +48,9 @@ struct ssh_private_key_struct {
|
|||||||
#elif defined HAVE_LIBCRYPTO
|
#elif defined HAVE_LIBCRYPTO
|
||||||
DSA *dsa_priv;
|
DSA *dsa_priv;
|
||||||
RSA *rsa_priv;
|
RSA *rsa_priv;
|
||||||
|
#elif HAVE_LIBMBEDCRYPTO
|
||||||
|
mbedtls_pk_context *rsa_priv;
|
||||||
|
void *dsa_priv;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -19,9 +19,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef KNOWNHOSTS_H_
|
#ifndef SSH_KNOWNHOSTS_H_
|
||||||
#define KNOWNHOSTS_H_
|
#define SSH_KNOWNHOSTS_H_
|
||||||
|
|
||||||
char **ssh_knownhosts_algorithms(ssh_session session);
|
struct ssh_list *ssh_known_hosts_get_algorithms(ssh_session session);
|
||||||
|
enum ssh_known_hosts_e
|
||||||
|
ssh_session_get_known_hosts_entry_file(ssh_session session,
|
||||||
|
const char *filename,
|
||||||
|
struct ssh_knownhosts_entry **pentry);
|
||||||
|
|
||||||
#endif /* KNOWNHOSTS_H_ */
|
#endif /* SSH_KNOWNHOSTS_H_ */
|
||||||
|
|||||||
@@ -30,15 +30,13 @@
|
|||||||
#include <openssl/sha.h>
|
#include <openssl/sha.h>
|
||||||
#include <openssl/md5.h>
|
#include <openssl/md5.h>
|
||||||
#include <openssl/hmac.h>
|
#include <openssl/hmac.h>
|
||||||
#ifdef HAVE_OPENSSL_ECC
|
|
||||||
#include <openssl/evp.h>
|
#include <openssl/evp.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef SHA_CTX* SHACTX;
|
typedef EVP_MD_CTX* SHACTX;
|
||||||
typedef SHA256_CTX* SHA256CTX;
|
typedef EVP_MD_CTX* SHA256CTX;
|
||||||
typedef SHA512_CTX* SHA384CTX;
|
typedef EVP_MD_CTX* SHA384CTX;
|
||||||
typedef SHA512_CTX* SHA512CTX;
|
typedef EVP_MD_CTX* SHA512CTX;
|
||||||
typedef MD5_CTX* MD5CTX;
|
typedef EVP_MD_CTX* MD5CTX;
|
||||||
typedef HMAC_CTX* HMACCTX;
|
typedef HMAC_CTX* HMACCTX;
|
||||||
#ifdef HAVE_ECC
|
#ifdef HAVE_ECC
|
||||||
typedef EVP_MD_CTX *EVPCTX;
|
typedef EVP_MD_CTX *EVPCTX;
|
||||||
@@ -69,13 +67,18 @@ typedef BIGNUM* bignum;
|
|||||||
typedef BN_CTX* bignum_CTX;
|
typedef BN_CTX* bignum_CTX;
|
||||||
|
|
||||||
#define bignum_new() BN_new()
|
#define bignum_new() BN_new()
|
||||||
#define bignum_free(num) BN_clear_free(num)
|
#define bignum_safe_free(num) do { \
|
||||||
|
if ((num) != NULL) { \
|
||||||
|
BN_clear_free((num)); \
|
||||||
|
(num)=NULL; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
#define bignum_set_word(bn,n) BN_set_word(bn,n)
|
#define bignum_set_word(bn,n) BN_set_word(bn,n)
|
||||||
#define bignum_bin2bn(bn,datalen,data) BN_bin2bn(bn,datalen,data)
|
#define bignum_bin2bn(bn,datalen,data) BN_bin2bn(bn,datalen,data)
|
||||||
#define bignum_bn2dec(num) BN_bn2dec(num)
|
#define bignum_bn2dec(num) BN_bn2dec(num)
|
||||||
#define bignum_dec2bn(bn,data) BN_dec2bn(data,bn)
|
#define bignum_dec2bn(bn,data) BN_dec2bn(data,bn)
|
||||||
#define bignum_bn2hex(num) BN_bn2hex(num)
|
#define bignum_bn2hex(num) BN_bn2hex(num)
|
||||||
#define bignum_rand(rnd, bits, top, bottom) BN_rand(rnd,bits,top,bottom)
|
#define bignum_rand(rnd, bits) BN_rand(rnd, bits, 0, 1)
|
||||||
#define bignum_ctx_new() BN_CTX_new()
|
#define bignum_ctx_new() BN_CTX_new()
|
||||||
#define bignum_ctx_free(num) BN_CTX_free(num)
|
#define bignum_ctx_free(num) BN_CTX_free(num)
|
||||||
#define bignum_mod_exp(dest,generator,exp,modulo,ctx) BN_mod_exp(dest,generator,exp,modulo,ctx)
|
#define bignum_mod_exp(dest,generator,exp,modulo,ctx) BN_mod_exp(dest,generator,exp,modulo,ctx)
|
||||||
@@ -85,20 +88,6 @@ typedef BN_CTX* bignum_CTX;
|
|||||||
#define bignum_bn2bin(num,ptr) BN_bn2bin(num,ptr)
|
#define bignum_bn2bin(num,ptr) BN_bn2bin(num,ptr)
|
||||||
#define bignum_cmp(num1,num2) BN_cmp(num1,num2)
|
#define bignum_cmp(num1,num2) BN_cmp(num1,num2)
|
||||||
|
|
||||||
SHA256CTX sha256_init(void);
|
|
||||||
void sha256_update(SHA256CTX c, const void *data, unsigned long len);
|
|
||||||
void sha256_final(unsigned char *md, SHA256CTX c);
|
|
||||||
|
|
||||||
SHA384CTX sha384_init(void);
|
|
||||||
void sha384_update(SHA384CTX c, const void *data, unsigned long len);
|
|
||||||
void sha384_final(unsigned char *md, SHA384CTX c);
|
|
||||||
|
|
||||||
SHA512CTX sha512_init(void);
|
|
||||||
void sha512_update(SHA512CTX c, const void *data, unsigned long len);
|
|
||||||
void sha512_final(unsigned char *md, SHA512CTX c);
|
|
||||||
|
|
||||||
struct ssh_cipher_struct *ssh_get_ciphertab(void);
|
|
||||||
|
|
||||||
#endif /* HAVE_LIBCRYPTO */
|
#endif /* HAVE_LIBCRYPTO */
|
||||||
|
|
||||||
#endif /* LIBCRYPTO_H_ */
|
#endif /* LIBCRYPTO_H_ */
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ typedef gcry_md_hd_t SHA384CTX;
|
|||||||
typedef gcry_md_hd_t SHA512CTX;
|
typedef gcry_md_hd_t SHA512CTX;
|
||||||
typedef gcry_md_hd_t MD5CTX;
|
typedef gcry_md_hd_t MD5CTX;
|
||||||
typedef gcry_md_hd_t HMACCTX;
|
typedef gcry_md_hd_t HMACCTX;
|
||||||
typedef void *EVPCTX;
|
typedef gcry_md_hd_t EVPCTX;
|
||||||
#define SHA_DIGEST_LENGTH 20
|
#define SHA_DIGEST_LENGTH 20
|
||||||
#define SHA_DIGEST_LEN SHA_DIGEST_LENGTH
|
#define SHA_DIGEST_LEN SHA_DIGEST_LENGTH
|
||||||
#define MD5_DIGEST_LEN 16
|
#define MD5_DIGEST_LEN 16
|
||||||
@@ -51,16 +51,26 @@ typedef void *EVPCTX;
|
|||||||
|
|
||||||
typedef gcry_mpi_t bignum;
|
typedef gcry_mpi_t bignum;
|
||||||
|
|
||||||
|
/* Constants for curves. */
|
||||||
|
#define NID_gcrypt_nistp256 0
|
||||||
|
#define NID_gcrypt_nistp384 1
|
||||||
|
#define NID_gcrypt_nistp521 2
|
||||||
|
|
||||||
/* missing gcrypt functions */
|
/* missing gcrypt functions */
|
||||||
int my_gcry_dec2bn(bignum *bn, const char *data);
|
int ssh_gcry_dec2bn(bignum *bn, const char *data);
|
||||||
char *my_gcry_bn2dec(bignum bn);
|
char *ssh_gcry_bn2dec(bignum bn);
|
||||||
|
|
||||||
#define bignum_new() gcry_mpi_new(0)
|
#define bignum_new() gcry_mpi_new(0)
|
||||||
#define bignum_free(num) gcry_mpi_release(num)
|
#define bignum_safe_free(num) do { \
|
||||||
|
if ((num) != NULL) { \
|
||||||
|
gcry_mpi_release((num)); \
|
||||||
|
(num)=NULL; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
#define bignum_set_word(bn,n) gcry_mpi_set_ui(bn,n)
|
#define bignum_set_word(bn,n) gcry_mpi_set_ui(bn,n)
|
||||||
#define bignum_bin2bn(bn,datalen,data) gcry_mpi_scan(data,GCRYMPI_FMT_USG,bn,datalen,NULL)
|
#define bignum_bin2bn(bn,datalen,data) gcry_mpi_scan(data,GCRYMPI_FMT_USG,bn,datalen,NULL)
|
||||||
#define bignum_bn2dec(num) my_gcry_bn2dec(num)
|
#define bignum_bn2dec(num) ssh_gcry_bn2dec(num)
|
||||||
#define bignum_dec2bn(num, data) my_gcry_dec2bn(data, num)
|
#define bignum_dec2bn(num, data) ssh_gcry_dec2bn(data, num)
|
||||||
#define bignum_bn2hex(num,data) gcry_mpi_aprint(GCRYMPI_FMT_HEX,data,NULL,num)
|
#define bignum_bn2hex(num,data) gcry_mpi_aprint(GCRYMPI_FMT_HEX,data,NULL,num)
|
||||||
#define bignum_hex2bn(num,datalen,data) gcry_mpi_scan(num,GCRYMPI_FMT_HEX,data,datalen,NULL)
|
#define bignum_hex2bn(num,datalen,data) gcry_mpi_scan(num,GCRYMPI_FMT_HEX,data,datalen,NULL)
|
||||||
#define bignum_rand(num,bits) gcry_mpi_randomize(num,bits,GCRY_STRONG_RANDOM),gcry_mpi_set_bit(num,bits-1),gcry_mpi_set_bit(num,0)
|
#define bignum_rand(num,bits) gcry_mpi_randomize(num,bits,GCRY_STRONG_RANDOM),gcry_mpi_set_bit(num,bits-1),gcry_mpi_set_bit(num,0)
|
||||||
@@ -71,8 +81,16 @@ char *my_gcry_bn2dec(bignum bn);
|
|||||||
#define bignum_bn2bin(num,datalen,data) gcry_mpi_print(GCRYMPI_FMT_USG,data,datalen,NULL,num)
|
#define bignum_bn2bin(num,datalen,data) gcry_mpi_print(GCRYMPI_FMT_USG,data,datalen,NULL,num)
|
||||||
#define bignum_cmp(num1,num2) gcry_mpi_cmp(num1,num2)
|
#define bignum_cmp(num1,num2) gcry_mpi_cmp(num1,num2)
|
||||||
|
|
||||||
|
/* Helper functions for data conversions. */
|
||||||
|
|
||||||
|
/* Extract an MPI from the given s-expression SEXP named NAME which is
|
||||||
|
encoded using INFORMAT and store it in a newly allocated ssh_string
|
||||||
|
encoded using OUTFORMAT. */
|
||||||
|
ssh_string ssh_sexp_extract_mpi(const gcry_sexp_t sexp,
|
||||||
|
const char *name,
|
||||||
|
enum gcry_mpi_format informat,
|
||||||
|
enum gcry_mpi_format outformat);
|
||||||
|
|
||||||
#endif /* HAVE_LIBGCRYPT */
|
#endif /* HAVE_LIBGCRYPT */
|
||||||
|
|
||||||
struct ssh_cipher_struct *ssh_get_ciphertab(void);
|
|
||||||
|
|
||||||
#endif /* LIBGCRYPT_H_ */
|
#endif /* LIBGCRYPT_H_ */
|
||||||
|
|||||||
112
include/libssh/libmbedcrypto.h
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the SSH Library
|
||||||
|
*
|
||||||
|
* Copyright (c) 2017 Sartura d.o.o.
|
||||||
|
*
|
||||||
|
* Author: Juraj Vijtiuk <juraj.vijtiuk@sartura.hr>
|
||||||
|
*
|
||||||
|
* The SSH Library is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2.1 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* The SSH Library 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 Lesser General Public
|
||||||
|
* License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with the SSH Library; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||||
|
* MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIBMBEDCRYPTO_H_
|
||||||
|
#define LIBMBEDCRYPTO_H_
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBMBEDCRYPTO
|
||||||
|
|
||||||
|
#include <mbedtls/md.h>
|
||||||
|
#include <mbedtls/bignum.h>
|
||||||
|
#include <mbedtls/pk.h>
|
||||||
|
#include <mbedtls/cipher.h>
|
||||||
|
#include <mbedtls/entropy.h>
|
||||||
|
#include <mbedtls/ctr_drbg.h>
|
||||||
|
|
||||||
|
typedef mbedtls_md_context_t *SHACTX;
|
||||||
|
typedef mbedtls_md_context_t *SHA256CTX;
|
||||||
|
typedef mbedtls_md_context_t *SHA384CTX;
|
||||||
|
typedef mbedtls_md_context_t *SHA512CTX;
|
||||||
|
typedef mbedtls_md_context_t *MD5CTX;
|
||||||
|
typedef mbedtls_md_context_t *HMACCTX;
|
||||||
|
typedef mbedtls_md_context_t *EVPCTX;
|
||||||
|
|
||||||
|
#define SHA_DIGEST_LENGTH 20
|
||||||
|
#define SHA_DIGEST_LEN SHA_DIGEST_LENGTH
|
||||||
|
#define MD5_DIGEST_LEN 16
|
||||||
|
#define SHA256_DIGEST_LENGTH 32
|
||||||
|
#define SHA256_DIGEST_LEN SHA256_DIGEST_LENGTH
|
||||||
|
#define SHA384_DIGEST_LENGTH 48
|
||||||
|
#define SHA384_DIGEST_LEN SHA384_DIGEST_LENGTH
|
||||||
|
#define SHA512_DIGEST_LENGTH 64
|
||||||
|
#define SHA512_DIGEST_LEN SHA512_DIGEST_LENGTH
|
||||||
|
|
||||||
|
#ifndef EVP_MAX_MD_SIZE
|
||||||
|
#define EVP_MAX_MD_SIZE 64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define EVP_DIGEST_LEN EVP_MAX_MD_SIZE
|
||||||
|
|
||||||
|
typedef mbedtls_mpi *bignum;
|
||||||
|
|
||||||
|
/* Constants for curves */
|
||||||
|
#define NID_mbedtls_nistp256 0
|
||||||
|
#define NID_mbedtls_nistp384 1
|
||||||
|
#define NID_mbedtls_nistp521 2
|
||||||
|
|
||||||
|
struct mbedtls_ecdsa_sig {
|
||||||
|
bignum r;
|
||||||
|
bignum s;
|
||||||
|
};
|
||||||
|
|
||||||
|
bignum ssh_mbedcry_bn_new(void);
|
||||||
|
void ssh_mbedcry_bn_free(bignum num);
|
||||||
|
char *ssh_mbedcry_bn2num(bignum num, int radix);
|
||||||
|
int ssh_mbedcry_rand(bignum rnd, int bits, int top, int bottom);
|
||||||
|
int ssh_mbedcry_is_bit_set(bignum num, size_t pos);
|
||||||
|
|
||||||
|
#define bignum_new() ssh_mbedcry_bn_new()
|
||||||
|
#define bignum_safe_free(num) do { \
|
||||||
|
if ((num) != NULL) { \
|
||||||
|
ssh_mbedcry_bn_free(num); \
|
||||||
|
(num)=NULL; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
#define bignum_set_word(bn, n) mbedtls_mpi_lset(bn, n) /* TODO fix
|
||||||
|
overflow/underflow */
|
||||||
|
#define bignum_bin2bn(data, datalen, bn) mbedtls_mpi_read_binary(bn, data, \
|
||||||
|
datalen)
|
||||||
|
#define bignum_bn2dec(num) ssh_mbedcry_bn2num(num, 10)
|
||||||
|
#define bignum_dec2bn(data, bn) mbedtls_mpi_read_string(bn, 10, data)
|
||||||
|
#define bignum_bn2hex(num) ssh_mbedcry_bn2num(num, 16)
|
||||||
|
#define bignum_rand(rnd, bits) ssh_mbedcry_rand((rnd), (bits), 0, 1)
|
||||||
|
#define bignum_mod_exp(dest, generator, exp, modulo, ctx) \
|
||||||
|
mbedtls_mpi_exp_mod(dest, generator, exp, modulo, NULL)
|
||||||
|
#define bignum_num_bytes(num) mbedtls_mpi_size(num)
|
||||||
|
#define bignum_num_bits(num) mbedtls_mpi_bitlen(num)
|
||||||
|
#define bignum_is_bit_set(num, bit) ssh_mbedcry_is_bit_set(num, bit)
|
||||||
|
#define bignum_bn2bin(num, ptr) mbedtls_mpi_write_binary(num, ptr, \
|
||||||
|
mbedtls_mpi_size(num))
|
||||||
|
#define bignum_cmp(num1, num2) mbedtls_mpi_cmp_mpi(num1, num2)
|
||||||
|
|
||||||
|
mbedtls_ctr_drbg_context *ssh_get_mbedtls_ctr_drbg_context(void);
|
||||||
|
|
||||||
|
int ssh_mbedtls_random(void *where, int len, int strong);
|
||||||
|
|
||||||
|
ssh_string make_ecpoint_string(const mbedtls_ecp_group *g, const
|
||||||
|
mbedtls_ecp_point *p);
|
||||||
|
|
||||||
|
#endif /* HAVE_LIBMBEDCRYPTO */
|
||||||
|
#endif /* LIBMBEDCRYPTO_H_ */
|
||||||
@@ -58,6 +58,7 @@
|
|||||||
#else /* _MSC_VER */
|
#else /* _MSC_VER */
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <sys/types.h>
|
||||||
#endif /* _MSC_VER */
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -77,8 +78,8 @@
|
|||||||
|
|
||||||
/* libssh version */
|
/* libssh version */
|
||||||
#define LIBSSH_VERSION_MAJOR 0
|
#define LIBSSH_VERSION_MAJOR 0
|
||||||
#define LIBSSH_VERSION_MINOR 7
|
#define LIBSSH_VERSION_MINOR 8
|
||||||
#define LIBSSH_VERSION_MICRO 0
|
#define LIBSSH_VERSION_MICRO 8
|
||||||
|
|
||||||
#define LIBSSH_VERSION_INT SSH_VERSION_INT(LIBSSH_VERSION_MAJOR, \
|
#define LIBSSH_VERSION_INT SSH_VERSION_INT(LIBSSH_VERSION_MAJOR, \
|
||||||
LIBSSH_VERSION_MINOR, \
|
LIBSSH_VERSION_MINOR, \
|
||||||
@@ -122,6 +123,7 @@ typedef struct ssh_scp_struct* ssh_scp;
|
|||||||
typedef struct ssh_session_struct* ssh_session;
|
typedef struct ssh_session_struct* ssh_session;
|
||||||
typedef struct ssh_string_struct* ssh_string;
|
typedef struct ssh_string_struct* ssh_string;
|
||||||
typedef struct ssh_event_struct* ssh_event;
|
typedef struct ssh_event_struct* ssh_event;
|
||||||
|
typedef struct ssh_connector_struct * ssh_connector;
|
||||||
typedef void* ssh_gssapi_creds;
|
typedef void* ssh_gssapi_creds;
|
||||||
|
|
||||||
/* Socket type */
|
/* Socket type */
|
||||||
@@ -188,7 +190,8 @@ enum ssh_channel_type_e {
|
|||||||
SSH_CHANNEL_SESSION,
|
SSH_CHANNEL_SESSION,
|
||||||
SSH_CHANNEL_DIRECT_TCPIP,
|
SSH_CHANNEL_DIRECT_TCPIP,
|
||||||
SSH_CHANNEL_FORWARDED_TCPIP,
|
SSH_CHANNEL_FORWARDED_TCPIP,
|
||||||
SSH_CHANNEL_X11
|
SSH_CHANNEL_X11,
|
||||||
|
SSH_CHANNEL_AUTH_AGENT
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ssh_channel_requests_e {
|
enum ssh_channel_requests_e {
|
||||||
@@ -206,6 +209,7 @@ enum ssh_global_requests_e {
|
|||||||
SSH_GLOBAL_REQUEST_UNKNOWN=0,
|
SSH_GLOBAL_REQUEST_UNKNOWN=0,
|
||||||
SSH_GLOBAL_REQUEST_TCPIP_FORWARD,
|
SSH_GLOBAL_REQUEST_TCPIP_FORWARD,
|
||||||
SSH_GLOBAL_REQUEST_CANCEL_TCPIP_FORWARD,
|
SSH_GLOBAL_REQUEST_CANCEL_TCPIP_FORWARD,
|
||||||
|
SSH_GLOBAL_REQUEST_KEEPALIVE
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ssh_publickey_state_e {
|
enum ssh_publickey_state_e {
|
||||||
@@ -234,6 +238,43 @@ enum ssh_server_known_e {
|
|||||||
SSH_SERVER_FILE_NOT_FOUND
|
SSH_SERVER_FILE_NOT_FOUND
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ssh_known_hosts_e {
|
||||||
|
/**
|
||||||
|
* There had been an error checking the host.
|
||||||
|
*/
|
||||||
|
SSH_KNOWN_HOSTS_ERROR = -2,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The known host file does not exist. The host is thus unknown. File will
|
||||||
|
* be created if host key is accepted.
|
||||||
|
*/
|
||||||
|
SSH_KNOWN_HOSTS_NOT_FOUND = -1,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The server is unknown. User should confirm the public key hash is
|
||||||
|
* correct.
|
||||||
|
*/
|
||||||
|
SSH_KNOWN_HOSTS_UNKNOWN = 0,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The server is known and has not changed.
|
||||||
|
*/
|
||||||
|
SSH_KNOWN_HOSTS_OK,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The server key has changed. Either you are under attack or the
|
||||||
|
* administrator changed the key. You HAVE to warn the user about a
|
||||||
|
* possible attack.
|
||||||
|
*/
|
||||||
|
SSH_KNOWN_HOSTS_CHANGED,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The server gave use a key of a type while we had an other type recorded.
|
||||||
|
* It is a possible attack.
|
||||||
|
*/
|
||||||
|
SSH_KNOWN_HOSTS_OTHER,
|
||||||
|
};
|
||||||
|
|
||||||
#ifndef MD5_DIGEST_LEN
|
#ifndef MD5_DIGEST_LEN
|
||||||
#define MD5_DIGEST_LEN 16
|
#define MD5_DIGEST_LEN 16
|
||||||
#endif
|
#endif
|
||||||
@@ -253,7 +294,9 @@ enum ssh_keytypes_e{
|
|||||||
SSH_KEYTYPE_RSA,
|
SSH_KEYTYPE_RSA,
|
||||||
SSH_KEYTYPE_RSA1,
|
SSH_KEYTYPE_RSA1,
|
||||||
SSH_KEYTYPE_ECDSA,
|
SSH_KEYTYPE_ECDSA,
|
||||||
SSH_KEYTYPE_ED25519
|
SSH_KEYTYPE_ED25519,
|
||||||
|
SSH_KEYTYPE_DSS_CERT01,
|
||||||
|
SSH_KEYTYPE_RSA_CERT01
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ssh_keycmp_e {
|
enum ssh_keycmp_e {
|
||||||
@@ -261,6 +304,16 @@ enum ssh_keycmp_e {
|
|||||||
SSH_KEY_CMP_PRIVATE
|
SSH_KEY_CMP_PRIVATE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define SSH_ADDRSTRLEN 46
|
||||||
|
|
||||||
|
struct ssh_knownhosts_entry {
|
||||||
|
char *hostname;
|
||||||
|
char *unparsed;
|
||||||
|
ssh_key publickey;
|
||||||
|
char *comment;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Error return codes */
|
/* Error return codes */
|
||||||
#define SSH_OK 0 /* No error */
|
#define SSH_OK 0 /* No error */
|
||||||
#define SSH_ERROR -1 /* Error of some kind */
|
#define SSH_ERROR -1 /* Error of some kind */
|
||||||
@@ -345,6 +398,13 @@ enum ssh_options_e {
|
|||||||
SSH_OPTIONS_GSSAPI_DELEGATE_CREDENTIALS,
|
SSH_OPTIONS_GSSAPI_DELEGATE_CREDENTIALS,
|
||||||
SSH_OPTIONS_HMAC_C_S,
|
SSH_OPTIONS_HMAC_C_S,
|
||||||
SSH_OPTIONS_HMAC_S_C,
|
SSH_OPTIONS_HMAC_S_C,
|
||||||
|
SSH_OPTIONS_PASSWORD_AUTH,
|
||||||
|
SSH_OPTIONS_PUBKEY_AUTH,
|
||||||
|
SSH_OPTIONS_KBDINT_AUTH,
|
||||||
|
SSH_OPTIONS_GSSAPI_AUTH,
|
||||||
|
SSH_OPTIONS_GLOBAL_KNOWNHOSTS,
|
||||||
|
SSH_OPTIONS_NODELAY,
|
||||||
|
SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -368,6 +428,15 @@ enum ssh_scp_request_types {
|
|||||||
SSH_SCP_REQUEST_WARNING
|
SSH_SCP_REQUEST_WARNING
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ssh_connector_flags_e {
|
||||||
|
/** Only the standard stream of the channel */
|
||||||
|
SSH_CONNECTOR_STDOUT = 1,
|
||||||
|
/** Only the exception stream of the channel */
|
||||||
|
SSH_CONNECTOR_STDERR = 2,
|
||||||
|
/** Merge both standard and exception streams */
|
||||||
|
SSH_CONNECTOR_BOTH = 3
|
||||||
|
};
|
||||||
|
|
||||||
LIBSSH_API int ssh_blocking_flush(ssh_session session, int timeout);
|
LIBSSH_API int ssh_blocking_flush(ssh_session session, int timeout);
|
||||||
LIBSSH_API ssh_channel ssh_channel_accept_x11(ssh_channel channel, int timeout_ms);
|
LIBSSH_API ssh_channel ssh_channel_accept_x11(ssh_channel channel, int timeout_ms);
|
||||||
LIBSSH_API int ssh_channel_change_pty_size(ssh_channel channel,int cols,int rows);
|
LIBSSH_API int ssh_channel_change_pty_size(ssh_channel channel,int cols,int rows);
|
||||||
@@ -397,10 +466,12 @@ LIBSSH_API int ssh_channel_request_pty_size(ssh_channel channel, const char *ter
|
|||||||
int cols, int rows);
|
int cols, int rows);
|
||||||
LIBSSH_API int ssh_channel_request_shell(ssh_channel channel);
|
LIBSSH_API int ssh_channel_request_shell(ssh_channel channel);
|
||||||
LIBSSH_API int ssh_channel_request_send_signal(ssh_channel channel, const char *signum);
|
LIBSSH_API int ssh_channel_request_send_signal(ssh_channel channel, const char *signum);
|
||||||
|
LIBSSH_API int ssh_channel_request_send_break(ssh_channel channel, uint32_t length);
|
||||||
LIBSSH_API int ssh_channel_request_sftp(ssh_channel channel);
|
LIBSSH_API int ssh_channel_request_sftp(ssh_channel channel);
|
||||||
LIBSSH_API int ssh_channel_request_subsystem(ssh_channel channel, const char *subsystem);
|
LIBSSH_API int ssh_channel_request_subsystem(ssh_channel channel, const char *subsystem);
|
||||||
LIBSSH_API int ssh_channel_request_x11(ssh_channel channel, int single_connection, const char *protocol,
|
LIBSSH_API int ssh_channel_request_x11(ssh_channel channel, int single_connection, const char *protocol,
|
||||||
const char *cookie, int screen_number);
|
const char *cookie, int screen_number);
|
||||||
|
LIBSSH_API int ssh_channel_request_auth_agent(ssh_channel channel);
|
||||||
LIBSSH_API int ssh_channel_send_eof(ssh_channel channel);
|
LIBSSH_API int ssh_channel_send_eof(ssh_channel channel);
|
||||||
LIBSSH_API int ssh_channel_select(ssh_channel *readchans, ssh_channel *writechans, ssh_channel *exceptchans, struct
|
LIBSSH_API int ssh_channel_select(ssh_channel *readchans, ssh_channel *writechans, ssh_channel *exceptchans, struct
|
||||||
timeval * timeout);
|
timeval * timeout);
|
||||||
@@ -408,11 +479,26 @@ LIBSSH_API void ssh_channel_set_blocking(ssh_channel channel, int blocking);
|
|||||||
LIBSSH_API void ssh_channel_set_counter(ssh_channel channel,
|
LIBSSH_API void ssh_channel_set_counter(ssh_channel channel,
|
||||||
ssh_counter counter);
|
ssh_counter counter);
|
||||||
LIBSSH_API int ssh_channel_write(ssh_channel channel, const void *data, uint32_t len);
|
LIBSSH_API int ssh_channel_write(ssh_channel channel, const void *data, uint32_t len);
|
||||||
|
LIBSSH_API int ssh_channel_write_stderr(ssh_channel channel,
|
||||||
|
const void *data,
|
||||||
|
uint32_t len);
|
||||||
LIBSSH_API uint32_t ssh_channel_window_size(ssh_channel channel);
|
LIBSSH_API uint32_t ssh_channel_window_size(ssh_channel channel);
|
||||||
|
|
||||||
LIBSSH_API char *ssh_basename (const char *path);
|
LIBSSH_API char *ssh_basename (const char *path);
|
||||||
LIBSSH_API void ssh_clean_pubkey_hash(unsigned char **hash);
|
LIBSSH_API void ssh_clean_pubkey_hash(unsigned char **hash);
|
||||||
LIBSSH_API int ssh_connect(ssh_session session);
|
LIBSSH_API int ssh_connect(ssh_session session);
|
||||||
|
|
||||||
|
LIBSSH_API ssh_connector ssh_connector_new(ssh_session session);
|
||||||
|
LIBSSH_API void ssh_connector_free(ssh_connector connector);
|
||||||
|
LIBSSH_API int ssh_connector_set_in_channel(ssh_connector connector,
|
||||||
|
ssh_channel channel,
|
||||||
|
enum ssh_connector_flags_e flags);
|
||||||
|
LIBSSH_API int ssh_connector_set_out_channel(ssh_connector connector,
|
||||||
|
ssh_channel channel,
|
||||||
|
enum ssh_connector_flags_e flags);
|
||||||
|
LIBSSH_API void ssh_connector_set_in_fd(ssh_connector connector, socket_t fd);
|
||||||
|
LIBSSH_API void ssh_connector_set_out_fd(ssh_connector connector, socket_t fd);
|
||||||
|
|
||||||
LIBSSH_API const char *ssh_copyright(void);
|
LIBSSH_API const char *ssh_copyright(void);
|
||||||
LIBSSH_API void ssh_disconnect(ssh_session session);
|
LIBSSH_API void ssh_disconnect(ssh_session session);
|
||||||
LIBSSH_API char *ssh_dirname (const char *path);
|
LIBSSH_API char *ssh_dirname (const char *path);
|
||||||
@@ -439,11 +525,12 @@ LIBSSH_API char *ssh_get_hexa(const unsigned char *what, size_t len);
|
|||||||
LIBSSH_API char *ssh_get_issue_banner(ssh_session session);
|
LIBSSH_API char *ssh_get_issue_banner(ssh_session session);
|
||||||
LIBSSH_API int ssh_get_openssh_version(ssh_session session);
|
LIBSSH_API int ssh_get_openssh_version(ssh_session session);
|
||||||
|
|
||||||
LIBSSH_API int ssh_get_publickey(ssh_session session, ssh_key *key);
|
LIBSSH_API int ssh_get_server_publickey(ssh_session session, ssh_key *key);
|
||||||
|
|
||||||
enum ssh_publickey_hash_type {
|
enum ssh_publickey_hash_type {
|
||||||
SSH_PUBLICKEY_HASH_SHA1,
|
SSH_PUBLICKEY_HASH_SHA1,
|
||||||
SSH_PUBLICKEY_HASH_MD5
|
SSH_PUBLICKEY_HASH_MD5,
|
||||||
|
SSH_PUBLICKEY_HASH_SHA256
|
||||||
};
|
};
|
||||||
LIBSSH_API int ssh_get_publickey_hash(const ssh_key key,
|
LIBSSH_API int ssh_get_publickey_hash(const ssh_key key,
|
||||||
enum ssh_publickey_hash_type type,
|
enum ssh_publickey_hash_type type,
|
||||||
@@ -455,6 +542,7 @@ SSH_DEPRECATED LIBSSH_API int ssh_get_pubkey_hash(ssh_session session, unsigned
|
|||||||
SSH_DEPRECATED LIBSSH_API ssh_channel ssh_forward_accept(ssh_session session, int timeout_ms);
|
SSH_DEPRECATED LIBSSH_API ssh_channel ssh_forward_accept(ssh_session session, int timeout_ms);
|
||||||
SSH_DEPRECATED LIBSSH_API int ssh_forward_cancel(ssh_session session, const char *address, int port);
|
SSH_DEPRECATED LIBSSH_API int ssh_forward_cancel(ssh_session session, const char *address, int port);
|
||||||
SSH_DEPRECATED LIBSSH_API int ssh_forward_listen(ssh_session session, const char *address, int port, int *bound_port);
|
SSH_DEPRECATED LIBSSH_API int ssh_forward_listen(ssh_session session, const char *address, int port, int *bound_port);
|
||||||
|
SSH_DEPRECATED LIBSSH_API int ssh_get_publickey(ssh_session session, ssh_key *key);
|
||||||
|
|
||||||
|
|
||||||
LIBSSH_API int ssh_get_random(void *where,int len,int strong);
|
LIBSSH_API int ssh_get_random(void *where,int len,int strong);
|
||||||
@@ -466,6 +554,29 @@ LIBSSH_API int ssh_is_blocking(ssh_session session);
|
|||||||
LIBSSH_API int ssh_is_connected(ssh_session session);
|
LIBSSH_API int ssh_is_connected(ssh_session session);
|
||||||
LIBSSH_API int ssh_is_server_known(ssh_session session);
|
LIBSSH_API int ssh_is_server_known(ssh_session session);
|
||||||
|
|
||||||
|
/* KNOWN HOSTS */
|
||||||
|
LIBSSH_API void ssh_knownhosts_entry_free(struct ssh_knownhosts_entry *entry);
|
||||||
|
#define SSH_KNOWNHOSTS_ENTRY_FREE(e) do { \
|
||||||
|
if ((e) != NULL) { \
|
||||||
|
ssh_knownhosts_entry_free(e); \
|
||||||
|
e = NULL; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
LIBSSH_API int ssh_known_hosts_parse_line(const char *host,
|
||||||
|
const char *line,
|
||||||
|
struct ssh_knownhosts_entry **entry);
|
||||||
|
LIBSSH_API enum ssh_known_hosts_e ssh_session_has_known_hosts_entry(ssh_session session);
|
||||||
|
|
||||||
|
LIBSSH_API int ssh_session_export_known_hosts_entry(ssh_session session,
|
||||||
|
char **pentry_string);
|
||||||
|
LIBSSH_API int ssh_session_update_known_hosts(ssh_session session);
|
||||||
|
|
||||||
|
LIBSSH_API enum ssh_known_hosts_e
|
||||||
|
ssh_session_get_known_hosts_entry(ssh_session session,
|
||||||
|
struct ssh_knownhosts_entry **pentry);
|
||||||
|
LIBSSH_API enum ssh_known_hosts_e ssh_session_is_known_server(ssh_session session);
|
||||||
|
|
||||||
/* LOGGING */
|
/* LOGGING */
|
||||||
LIBSSH_API int ssh_set_log_level(int level);
|
LIBSSH_API int ssh_set_log_level(int level);
|
||||||
LIBSSH_API int ssh_get_log_level(void);
|
LIBSSH_API int ssh_get_log_level(void);
|
||||||
@@ -519,6 +630,8 @@ typedef int (*ssh_auth_callback) (const char *prompt, char *buf, size_t len,
|
|||||||
int echo, int verify, void *userdata);
|
int echo, int verify, void *userdata);
|
||||||
|
|
||||||
LIBSSH_API ssh_key ssh_key_new(void);
|
LIBSSH_API ssh_key ssh_key_new(void);
|
||||||
|
#define SSH_KEY_FREE(x) \
|
||||||
|
do { if ((x) != NULL) { ssh_key_free(x); x = NULL; } } while(0)
|
||||||
LIBSSH_API void ssh_key_free (ssh_key key);
|
LIBSSH_API void ssh_key_free (ssh_key key);
|
||||||
LIBSSH_API enum ssh_keytypes_e ssh_key_type(const ssh_key key);
|
LIBSSH_API enum ssh_keytypes_e ssh_key_type(const ssh_key key);
|
||||||
LIBSSH_API const char *ssh_key_type_to_char(enum ssh_keytypes_e type);
|
LIBSSH_API const char *ssh_key_type_to_char(enum ssh_keytypes_e type);
|
||||||
@@ -536,6 +649,11 @@ LIBSSH_API int ssh_pki_import_privkey_base64(const char *b64_key,
|
|||||||
ssh_auth_callback auth_fn,
|
ssh_auth_callback auth_fn,
|
||||||
void *auth_data,
|
void *auth_data,
|
||||||
ssh_key *pkey);
|
ssh_key *pkey);
|
||||||
|
LIBSSH_API int ssh_pki_export_privkey_base64(const ssh_key privkey,
|
||||||
|
const char *passphrase,
|
||||||
|
ssh_auth_callback auth_fn,
|
||||||
|
void *auth_data,
|
||||||
|
char **b64_key);
|
||||||
LIBSSH_API int ssh_pki_import_privkey_file(const char *filename,
|
LIBSSH_API int ssh_pki_import_privkey_file(const char *filename,
|
||||||
const char *passphrase,
|
const char *passphrase,
|
||||||
ssh_auth_callback auth_fn,
|
ssh_auth_callback auth_fn,
|
||||||
@@ -547,12 +665,21 @@ LIBSSH_API int ssh_pki_export_privkey_file(const ssh_key privkey,
|
|||||||
void *auth_data,
|
void *auth_data,
|
||||||
const char *filename);
|
const char *filename);
|
||||||
|
|
||||||
|
LIBSSH_API int ssh_pki_copy_cert_to_privkey(const ssh_key cert_key,
|
||||||
|
ssh_key privkey);
|
||||||
|
|
||||||
LIBSSH_API int ssh_pki_import_pubkey_base64(const char *b64_key,
|
LIBSSH_API int ssh_pki_import_pubkey_base64(const char *b64_key,
|
||||||
enum ssh_keytypes_e type,
|
enum ssh_keytypes_e type,
|
||||||
ssh_key *pkey);
|
ssh_key *pkey);
|
||||||
LIBSSH_API int ssh_pki_import_pubkey_file(const char *filename,
|
LIBSSH_API int ssh_pki_import_pubkey_file(const char *filename,
|
||||||
ssh_key *pkey);
|
ssh_key *pkey);
|
||||||
|
|
||||||
|
LIBSSH_API int ssh_pki_import_cert_base64(const char *b64_cert,
|
||||||
|
enum ssh_keytypes_e type,
|
||||||
|
ssh_key *pkey);
|
||||||
|
LIBSSH_API int ssh_pki_import_cert_file(const char *filename,
|
||||||
|
ssh_key *pkey);
|
||||||
|
|
||||||
LIBSSH_API int ssh_pki_export_privkey_to_pubkey(const ssh_key privkey,
|
LIBSSH_API int ssh_pki_export_privkey_to_pubkey(const ssh_key privkey,
|
||||||
ssh_key *pkey);
|
ssh_key *pkey);
|
||||||
LIBSSH_API int ssh_pki_export_pubkey_base64(const ssh_key key,
|
LIBSSH_API int ssh_pki_export_pubkey_base64(const ssh_key key,
|
||||||
@@ -562,6 +689,10 @@ LIBSSH_API int ssh_pki_export_pubkey_file(const ssh_key key,
|
|||||||
|
|
||||||
LIBSSH_API const char *ssh_pki_key_ecdsa_name(const ssh_key key);
|
LIBSSH_API const char *ssh_pki_key_ecdsa_name(const ssh_key key);
|
||||||
|
|
||||||
|
LIBSSH_API char *ssh_get_fingerprint_hash(enum ssh_publickey_hash_type type,
|
||||||
|
unsigned char *hash,
|
||||||
|
size_t len);
|
||||||
|
LIBSSH_API void ssh_print_hash(enum ssh_publickey_hash_type type, unsigned char *hash, size_t len);
|
||||||
LIBSSH_API void ssh_print_hexa(const char *descr, const unsigned char *what, size_t len);
|
LIBSSH_API void ssh_print_hexa(const char *descr, const unsigned char *what, size_t len);
|
||||||
LIBSSH_API int ssh_send_ignore (ssh_session session, const char *data);
|
LIBSSH_API int ssh_send_ignore (ssh_session session, const char *data);
|
||||||
LIBSSH_API int ssh_send_debug (ssh_session session, const char *message, int always_display);
|
LIBSSH_API int ssh_send_debug (ssh_session session, const char *message, int always_display);
|
||||||
@@ -588,6 +719,7 @@ LIBSSH_API int ssh_select(ssh_channel *channels, ssh_channel *outchannels, socke
|
|||||||
fd_set *readfds, struct timeval *timeout);
|
fd_set *readfds, struct timeval *timeout);
|
||||||
LIBSSH_API int ssh_service_request(ssh_session session, const char *service);
|
LIBSSH_API int ssh_service_request(ssh_session session, const char *service);
|
||||||
LIBSSH_API int ssh_set_agent_channel(ssh_session session, ssh_channel channel);
|
LIBSSH_API int ssh_set_agent_channel(ssh_session session, ssh_channel channel);
|
||||||
|
LIBSSH_API int ssh_set_agent_socket(ssh_session session, socket_t fd);
|
||||||
LIBSSH_API void ssh_set_blocking(ssh_session session, int blocking);
|
LIBSSH_API void ssh_set_blocking(ssh_session session, int blocking);
|
||||||
LIBSSH_API void ssh_set_counters(ssh_session session, ssh_counter scounter,
|
LIBSSH_API void ssh_set_counters(ssh_session session, ssh_counter scounter,
|
||||||
ssh_counter rcounter);
|
ssh_counter rcounter);
|
||||||
@@ -629,17 +761,22 @@ LIBSSH_API int ssh_userauth_kbdint_setanswer(ssh_session session, unsigned int i
|
|||||||
LIBSSH_API int ssh_userauth_gssapi(ssh_session session);
|
LIBSSH_API int ssh_userauth_gssapi(ssh_session session);
|
||||||
LIBSSH_API const char *ssh_version(int req_version);
|
LIBSSH_API const char *ssh_version(int req_version);
|
||||||
LIBSSH_API int ssh_write_knownhost(ssh_session session);
|
LIBSSH_API int ssh_write_knownhost(ssh_session session);
|
||||||
|
LIBSSH_API char *ssh_dump_knownhost(ssh_session session);
|
||||||
|
|
||||||
LIBSSH_API void ssh_string_burn(ssh_string str);
|
LIBSSH_API void ssh_string_burn(ssh_string str);
|
||||||
LIBSSH_API ssh_string ssh_string_copy(ssh_string str);
|
LIBSSH_API ssh_string ssh_string_copy(ssh_string str);
|
||||||
LIBSSH_API void *ssh_string_data(ssh_string str);
|
LIBSSH_API void *ssh_string_data(ssh_string str);
|
||||||
LIBSSH_API int ssh_string_fill(ssh_string str, const void *data, size_t len);
|
LIBSSH_API int ssh_string_fill(ssh_string str, const void *data, size_t len);
|
||||||
|
#define SSH_STRING_FREE(x) \
|
||||||
|
do { if ((x) != NULL) { ssh_string_free(x); x = NULL; } } while(0)
|
||||||
LIBSSH_API void ssh_string_free(ssh_string str);
|
LIBSSH_API void ssh_string_free(ssh_string str);
|
||||||
LIBSSH_API ssh_string ssh_string_from_char(const char *what);
|
LIBSSH_API ssh_string ssh_string_from_char(const char *what);
|
||||||
LIBSSH_API size_t ssh_string_len(ssh_string str);
|
LIBSSH_API size_t ssh_string_len(ssh_string str);
|
||||||
LIBSSH_API ssh_string ssh_string_new(size_t size);
|
LIBSSH_API ssh_string ssh_string_new(size_t size);
|
||||||
LIBSSH_API const char *ssh_string_get_char(ssh_string str);
|
LIBSSH_API const char *ssh_string_get_char(ssh_string str);
|
||||||
LIBSSH_API char *ssh_string_to_char(ssh_string str);
|
LIBSSH_API char *ssh_string_to_char(ssh_string str);
|
||||||
|
#define SSH_STRING_FREE_CHAR(x) \
|
||||||
|
do { if ((x) != NULL) { ssh_string_free_char(x); x = NULL; } } while(0)
|
||||||
LIBSSH_API void ssh_string_free_char(char *s);
|
LIBSSH_API void ssh_string_free_char(char *s);
|
||||||
|
|
||||||
LIBSSH_API int ssh_getpass(const char *prompt, char *buf, size_t len, int echo,
|
LIBSSH_API int ssh_getpass(const char *prompt, char *buf, size_t len, int echo,
|
||||||
@@ -652,9 +789,11 @@ LIBSSH_API ssh_event ssh_event_new(void);
|
|||||||
LIBSSH_API int ssh_event_add_fd(ssh_event event, socket_t fd, short events,
|
LIBSSH_API int ssh_event_add_fd(ssh_event event, socket_t fd, short events,
|
||||||
ssh_event_callback cb, void *userdata);
|
ssh_event_callback cb, void *userdata);
|
||||||
LIBSSH_API int ssh_event_add_session(ssh_event event, ssh_session session);
|
LIBSSH_API int ssh_event_add_session(ssh_event event, ssh_session session);
|
||||||
|
LIBSSH_API int ssh_event_add_connector(ssh_event event, ssh_connector connector);
|
||||||
LIBSSH_API int ssh_event_dopoll(ssh_event event, int timeout);
|
LIBSSH_API int ssh_event_dopoll(ssh_event event, int timeout);
|
||||||
LIBSSH_API int ssh_event_remove_fd(ssh_event event, socket_t fd);
|
LIBSSH_API int ssh_event_remove_fd(ssh_event event, socket_t fd);
|
||||||
LIBSSH_API int ssh_event_remove_session(ssh_event event, ssh_session session);
|
LIBSSH_API int ssh_event_remove_session(ssh_event event, ssh_session session);
|
||||||
|
LIBSSH_API int ssh_event_remove_connector(ssh_event event, ssh_connector connector);
|
||||||
LIBSSH_API void ssh_event_free(ssh_event event);
|
LIBSSH_API void ssh_event_free(ssh_event event);
|
||||||
LIBSSH_API const char* ssh_get_clientbanner(ssh_session session);
|
LIBSSH_API const char* ssh_get_clientbanner(ssh_session session);
|
||||||
LIBSSH_API const char* ssh_get_serverbanner(ssh_session session);
|
LIBSSH_API const char* ssh_get_serverbanner(ssh_session session);
|
||||||
@@ -664,6 +803,16 @@ LIBSSH_API const char* ssh_get_cipher_out(ssh_session session);
|
|||||||
LIBSSH_API const char* ssh_get_hmac_in(ssh_session session);
|
LIBSSH_API const char* ssh_get_hmac_in(ssh_session session);
|
||||||
LIBSSH_API const char* ssh_get_hmac_out(ssh_session session);
|
LIBSSH_API const char* ssh_get_hmac_out(ssh_session session);
|
||||||
|
|
||||||
|
LIBSSH_API ssh_buffer ssh_buffer_new(void);
|
||||||
|
LIBSSH_API void ssh_buffer_free(ssh_buffer buffer);
|
||||||
|
#define SSH_BUFFER_FREE(x) \
|
||||||
|
do { if ((x) != NULL) { ssh_buffer_free(x); x = NULL; } } while(0)
|
||||||
|
LIBSSH_API int ssh_buffer_reinit(ssh_buffer buffer);
|
||||||
|
LIBSSH_API int ssh_buffer_add_data(ssh_buffer buffer, const void *data, uint32_t len);
|
||||||
|
LIBSSH_API uint32_t ssh_buffer_get_data(ssh_buffer buffer, void *data, uint32_t requestedlen);
|
||||||
|
LIBSSH_API void *ssh_buffer_get(ssh_buffer buffer);
|
||||||
|
LIBSSH_API uint32_t ssh_buffer_get_len(ssh_buffer buffer);
|
||||||
|
|
||||||
#ifndef LIBSSH_LEGACY_0_4
|
#ifndef LIBSSH_LEGACY_0_4
|
||||||
#include "libssh/legacy.h"
|
#include "libssh/legacy.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -672,4 +821,3 @@ LIBSSH_API const char* ssh_get_hmac_out(ssh_session session);
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* _LIBSSH_H */
|
#endif /* _LIBSSH_H */
|
||||||
/* vim: set ts=2 sw=2 et cindent: */
|
|
||||||
|
|||||||
@@ -194,6 +194,62 @@ public:
|
|||||||
ssh_throw(ret);
|
ssh_throw(ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Authenticate through the "keyboard-interactive" method.
|
||||||
|
*
|
||||||
|
* @param[in] username The username to authenticate. You can specify NULL if
|
||||||
|
* ssh_option_set_username() has been used. You cannot
|
||||||
|
* try two different logins in a row.
|
||||||
|
*
|
||||||
|
* @param[in] submethods Undocumented. Set it to NULL.
|
||||||
|
*
|
||||||
|
* @throws SshException on error
|
||||||
|
*
|
||||||
|
* @returns SSH_AUTH_SUCCESS, SSH_AUTH_PARTIAL, SSH_AUTH_DENIED,
|
||||||
|
* SSH_AUTH_ERROR, SSH_AUTH_INFO, SSH_AUTH_AGAIN
|
||||||
|
*
|
||||||
|
* @see ssh_userauth_kbdint
|
||||||
|
*/
|
||||||
|
int userauthKbdint(const char* username, const char* submethods){
|
||||||
|
int ret=ssh_userauth_kbdint(c_session,NULL,NULL);
|
||||||
|
ssh_throw(ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @brief Get the number of prompts (questions) the server has given.
|
||||||
|
* @returns The number of prompts.
|
||||||
|
* @see ssh_userauth_kbdint_getnprompts
|
||||||
|
*/
|
||||||
|
int userauthKbdintGetNPrompts(){
|
||||||
|
return ssh_userauth_kbdint_getnprompts(c_session);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the answer for a question from a message block.
|
||||||
|
*
|
||||||
|
* @param[in] index The index number of the prompt.
|
||||||
|
* @param[in] answer The answer to give to the server. The answer MUST be
|
||||||
|
* encoded UTF-8. It is up to the server how to interpret
|
||||||
|
* the value and validate it. However, if you read the
|
||||||
|
* answer in some other encoding, you MUST convert it to
|
||||||
|
* UTF-8.
|
||||||
|
*
|
||||||
|
* @throws SshException on error
|
||||||
|
*
|
||||||
|
* @returns 0 on success, < 0 on error
|
||||||
|
*
|
||||||
|
* @see ssh_userauth_kbdint_setanswer
|
||||||
|
*/
|
||||||
|
int userauthKbdintSetAnswer(unsigned int index, const char *answer)
|
||||||
|
{
|
||||||
|
int ret = ssh_userauth_kbdint_setanswer(c_session, index, answer);
|
||||||
|
ssh_throw(ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @brief Authenticates using the password method.
|
/** @brief Authenticates using the password method.
|
||||||
* @param[in] password password to use for authentication
|
* @param[in] password password to use for authentication
|
||||||
* @throws SshException on error
|
* @throws SshException on error
|
||||||
@@ -228,8 +284,7 @@ public:
|
|||||||
ssh_throw(ret);
|
ssh_throw(ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
int userauthPrivatekeyFile(const char *filename,
|
|
||||||
const char *passphrase);
|
|
||||||
/** @brief Returns the available authentication methods from the server
|
/** @brief Returns the available authentication methods from the server
|
||||||
* @throws SshException on error
|
* @throws SshException on error
|
||||||
* @returns Bitfield of available methods.
|
* @returns Bitfield of available methods.
|
||||||
@@ -280,9 +335,12 @@ public:
|
|||||||
* @see ssh_get_issue_banner
|
* @see ssh_get_issue_banner
|
||||||
*/
|
*/
|
||||||
std::string getIssueBanner(){
|
std::string getIssueBanner(){
|
||||||
char *banner=ssh_get_issue_banner(c_session);
|
char *banner = ssh_get_issue_banner(c_session);
|
||||||
std::string ret= std::string(banner);
|
std::string ret = "";
|
||||||
::free(banner);
|
if (banner != NULL) {
|
||||||
|
ret = std::string(banner);
|
||||||
|
::free(banner);
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
/** @brief returns the OpenSSH version (server) if possible
|
/** @brief returns the OpenSSH version (server) if possible
|
||||||
@@ -303,12 +361,12 @@ public:
|
|||||||
* @throws SshException on error
|
* @throws SshException on error
|
||||||
* @returns Integer value depending on the knowledge of the
|
* @returns Integer value depending on the knowledge of the
|
||||||
* server key
|
* server key
|
||||||
* @see ssh_is_server_known
|
* @see ssh_session_update_known_hosts
|
||||||
*/
|
*/
|
||||||
int isServerKnown(){
|
int isServerKnown(){
|
||||||
int ret=ssh_is_server_known(c_session);
|
int state = ssh_session_is_known_server(c_session);
|
||||||
ssh_throw(ret);
|
ssh_throw(state);
|
||||||
return ret;
|
return state;
|
||||||
}
|
}
|
||||||
void log(int priority, const char *format, ...){
|
void log(int priority, const char *format, ...){
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
@@ -378,11 +436,14 @@ public:
|
|||||||
return_throwable;
|
return_throwable;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
ssh_session c_session;
|
|
||||||
ssh_session getCSession(){
|
ssh_session getCSession(){
|
||||||
return c_session;
|
return c_session;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ssh_session c_session;
|
||||||
|
|
||||||
|
private:
|
||||||
/* No copy constructor, no = operator */
|
/* No copy constructor, no = operator */
|
||||||
Session(const Session &);
|
Session(const Session &);
|
||||||
Session& operator=(const Session &);
|
Session& operator=(const Session &);
|
||||||
@@ -395,9 +456,9 @@ private:
|
|||||||
class Channel {
|
class Channel {
|
||||||
friend class Session;
|
friend class Session;
|
||||||
public:
|
public:
|
||||||
Channel(Session &session){
|
Channel(Session &ssh_session){
|
||||||
channel=ssh_channel_new(session.getCSession());
|
channel = ssh_channel_new(ssh_session.getCSession());
|
||||||
this->session=&session;
|
this->session = &ssh_session;
|
||||||
}
|
}
|
||||||
~Channel(){
|
~Channel(){
|
||||||
ssh_channel_free(channel);
|
ssh_channel_free(channel);
|
||||||
@@ -481,12 +542,12 @@ public:
|
|||||||
ssh_throw(err);
|
ssh_throw(err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
int read(void *dest, size_t count, bool is_stderr){
|
int read(void *dest, size_t count){
|
||||||
int err;
|
int err;
|
||||||
/* handle int overflow */
|
/* handle int overflow */
|
||||||
if(count > 0x7fffffff)
|
if(count > 0x7fffffff)
|
||||||
count = 0x7fffffff;
|
count = 0x7fffffff;
|
||||||
err=ssh_channel_read_timeout(channel,dest,count,is_stderr,-1);
|
err=ssh_channel_read_timeout(channel,dest,count,false,-1);
|
||||||
ssh_throw(err);
|
ssh_throw(err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -584,16 +645,24 @@ public:
|
|||||||
ssh_throw(ret);
|
ssh_throw(ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
private:
|
|
||||||
ssh_session getCSession(){
|
ssh_session getCSession(){
|
||||||
return session->getCSession();
|
return session->getCSession();
|
||||||
}
|
}
|
||||||
Channel (Session &session, ssh_channel c_channel){
|
|
||||||
this->channel=c_channel;
|
ssh_channel getCChannel() {
|
||||||
this->session=&session;
|
return channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
Session *session;
|
Session *session;
|
||||||
ssh_channel channel;
|
ssh_channel channel;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Channel (Session &ssh_session, ssh_channel c_channel){
|
||||||
|
this->channel=c_channel;
|
||||||
|
this->session = &ssh_session;
|
||||||
|
}
|
||||||
/* No copy and no = operator */
|
/* No copy and no = operator */
|
||||||
Channel(const Channel &);
|
Channel(const Channel &);
|
||||||
Channel &operator=(const Channel &);
|
Channel &operator=(const Channel &);
|
||||||
|
|||||||
@@ -29,19 +29,10 @@ int ssh_file_readaccess_ok(const char *file);
|
|||||||
|
|
||||||
char *ssh_path_expand_tilde(const char *d);
|
char *ssh_path_expand_tilde(const char *d);
|
||||||
char *ssh_path_expand_escape(ssh_session session, const char *s);
|
char *ssh_path_expand_escape(ssh_session session, const char *s);
|
||||||
int ssh_analyze_banner(ssh_session session, int server, int *ssh1, int *ssh2);
|
int ssh_analyze_banner(ssh_session session, int server);
|
||||||
int ssh_is_ipaddr_v4(const char *str);
|
int ssh_is_ipaddr_v4(const char *str);
|
||||||
int ssh_is_ipaddr(const char *str);
|
int ssh_is_ipaddr(const char *str);
|
||||||
|
|
||||||
#ifndef HAVE_NTOHLL
|
|
||||||
/* macro for byte ordering */
|
|
||||||
uint64_t ntohll(uint64_t);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_HTONLL
|
|
||||||
#define htonll(x) ntohll((x))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* list processing */
|
/* list processing */
|
||||||
|
|
||||||
struct ssh_list {
|
struct ssh_list {
|
||||||
@@ -59,10 +50,17 @@ struct ssh_timestamp {
|
|||||||
long useconds;
|
long useconds;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ssh_quote_state_e {
|
||||||
|
NO_QUOTE,
|
||||||
|
SINGLE_QUOTE,
|
||||||
|
DOUBLE_QUOTE
|
||||||
|
};
|
||||||
|
|
||||||
struct ssh_list *ssh_list_new(void);
|
struct ssh_list *ssh_list_new(void);
|
||||||
void ssh_list_free(struct ssh_list *list);
|
void ssh_list_free(struct ssh_list *list);
|
||||||
struct ssh_iterator *ssh_list_get_iterator(const struct ssh_list *list);
|
struct ssh_iterator *ssh_list_get_iterator(const struct ssh_list *list);
|
||||||
struct ssh_iterator *ssh_list_find(const struct ssh_list *list, void *value);
|
struct ssh_iterator *ssh_list_find(const struct ssh_list *list, void *value);
|
||||||
|
size_t ssh_list_count(const struct ssh_list *list);
|
||||||
int ssh_list_append(struct ssh_list *list, const void *data);
|
int ssh_list_append(struct ssh_list *list, const void *data);
|
||||||
int ssh_list_prepend(struct ssh_list *list, const void *data);
|
int ssh_list_prepend(struct ssh_list *list, const void *data);
|
||||||
void ssh_list_remove(struct ssh_list *list, struct ssh_iterator *iterator);
|
void ssh_list_remove(struct ssh_list *list, struct ssh_iterator *iterator);
|
||||||
@@ -89,4 +87,6 @@ int ssh_timeout_update(struct ssh_timestamp *ts, int timeout);
|
|||||||
|
|
||||||
int ssh_match_group(const char *group, const char *object);
|
int ssh_match_group(const char *group, const char *object);
|
||||||
|
|
||||||
|
int ssh_quote_file_name(const char *file_name, char *buf, size_t buf_len);
|
||||||
|
|
||||||
#endif /* MISC_H_ */
|
#endif /* MISC_H_ */
|
||||||
|
|||||||
@@ -22,7 +22,9 @@
|
|||||||
#define _OPTIONS_H
|
#define _OPTIONS_H
|
||||||
|
|
||||||
int ssh_config_parse_file(ssh_session session, const char *filename);
|
int ssh_config_parse_file(ssh_session session, const char *filename);
|
||||||
int ssh_options_set_algo(ssh_session session, int algo, const char *list);
|
int ssh_options_set_algo(ssh_session session,
|
||||||
|
enum ssh_kex_types_e algo,
|
||||||
|
const char *list);
|
||||||
int ssh_options_apply(ssh_session session);
|
int ssh_options_apply(ssh_session session);
|
||||||
|
|
||||||
#endif /* _OPTIONS_H */
|
#endif /* _OPTIONS_H */
|
||||||
|
|||||||
@@ -43,18 +43,13 @@ enum ssh_packet_state_e {
|
|||||||
PACKET_STATE_PROCESSING
|
PACKET_STATE_PROCESSING
|
||||||
};
|
};
|
||||||
|
|
||||||
int packet_send(ssh_session session);
|
enum ssh_packet_filter_result_e {
|
||||||
|
SSH_PACKET_UNKNOWN,
|
||||||
|
SSH_PACKET_ALLOWED,
|
||||||
|
SSH_PACKET_DENIED
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef WITH_SSH1
|
int ssh_packet_send(ssh_session session);
|
||||||
int packet_send1(ssh_session session) ;
|
|
||||||
void ssh_packet_set_default_callbacks1(ssh_session session);
|
|
||||||
|
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_disconnect1);
|
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_smsg_success1);
|
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_smsg_failure1);
|
|
||||||
int ssh_packet_socket_callback1(const void *data, size_t receivedlen, void *user);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_unimplemented);
|
SSH_PACKET_CALLBACK(ssh_packet_unimplemented);
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_disconnect_callback);
|
SSH_PACKET_CALLBACK(ssh_packet_disconnect_callback);
|
||||||
@@ -62,6 +57,7 @@ SSH_PACKET_CALLBACK(ssh_packet_ignore_callback);
|
|||||||
SSH_PACKET_CALLBACK(ssh_packet_dh_reply);
|
SSH_PACKET_CALLBACK(ssh_packet_dh_reply);
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_newkeys);
|
SSH_PACKET_CALLBACK(ssh_packet_newkeys);
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_service_accept);
|
SSH_PACKET_CALLBACK(ssh_packet_service_accept);
|
||||||
|
SSH_PACKET_CALLBACK(ssh_packet_ext_info);
|
||||||
|
|
||||||
#ifdef WITH_SERVER
|
#ifdef WITH_SERVER
|
||||||
SSH_PACKET_CALLBACK(ssh_packet_kexdh_init);
|
SSH_PACKET_CALLBACK(ssh_packet_kexdh_init);
|
||||||
@@ -78,12 +74,13 @@ void ssh_packet_set_default_callbacks(ssh_session session);
|
|||||||
void ssh_packet_process(ssh_session session, uint8_t type);
|
void ssh_packet_process(ssh_session session, uint8_t type);
|
||||||
|
|
||||||
/* PACKET CRYPT */
|
/* PACKET CRYPT */
|
||||||
uint32_t packet_decrypt_len(ssh_session session, char *crypted);
|
uint32_t ssh_packet_decrypt_len(ssh_session session, uint8_t *destination, uint8_t *source);
|
||||||
int packet_decrypt(ssh_session session, void *packet, unsigned int len);
|
int ssh_packet_decrypt(ssh_session session, uint8_t *destination, uint8_t *source,
|
||||||
unsigned char *packet_encrypt(ssh_session session,
|
size_t start, size_t encrypted_size);
|
||||||
void *packet,
|
unsigned char *ssh_packet_encrypt(ssh_session session,
|
||||||
unsigned int len);
|
void *packet,
|
||||||
int packet_hmac_verify(ssh_session session,ssh_buffer buffer,
|
unsigned int len);
|
||||||
unsigned char *mac, enum ssh_hmac_e type);
|
int ssh_packet_hmac_verify(ssh_session session,ssh_buffer buffer,
|
||||||
|
unsigned char *mac, enum ssh_hmac_e type);
|
||||||
|
|
||||||
#endif /* PACKET_H_ */
|
#endif /* PACKET_H_ */
|
||||||
|
|||||||
@@ -43,4 +43,3 @@ int ssh_pcap_context_write(ssh_pcap_context,enum ssh_pcap_direction direction, v
|
|||||||
|
|
||||||
#endif /* WITH_PCAP */
|
#endif /* WITH_PCAP */
|
||||||
#endif /* PCAP_H_ */
|
#endif /* PCAP_H_ */
|
||||||
/* vim: set ts=2 sw=2 et cindent: */
|
|
||||||
|
|||||||