Compare commits
163 Commits
libssh-0.8
...
libssh-0.7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c20b360c96 | ||
|
|
5e061962c5 | ||
|
|
f1d57223db | ||
|
|
b9033ad56a | ||
|
|
e5ff7aa410 | ||
|
|
3837a0547f | ||
|
|
7985acb768 | ||
|
|
acd6a1ca8a | ||
|
|
ddea46f890 | ||
|
|
e5f0e711b0 | ||
|
|
e765c1400a | ||
|
|
7a7c0a54bc | ||
|
|
9c62d6dfcd | ||
|
|
f3f140e65f | ||
|
|
c977a97093 | ||
|
|
743a34ad9f | ||
|
|
0f9e6598ef | ||
|
|
f8007d7147 | ||
|
|
3d70d4f08d | ||
|
|
bade29d3d5 | ||
|
|
399ff6bbde | ||
|
|
c0d9aeda18 | ||
|
|
82b2d31c29 | ||
|
|
74102dfd7a | ||
|
|
d678f6a9ea | ||
|
|
00b8e6d1f0 | ||
|
|
aeb859e130 | ||
|
|
b393f7e5e9 | ||
|
|
2004617fd0 | ||
|
|
c5fe7c5a72 | ||
|
|
fec4dc4eff | ||
|
|
3d0c9cc6b5 | ||
|
|
4d6048ef88 | ||
|
|
3d2d777e26 | ||
|
|
8520adf609 | ||
|
|
c0be59f876 | ||
|
|
2983b21996 | ||
|
|
88ae595583 | ||
|
|
a228c3f728 | ||
|
|
53ed121a9c | ||
|
|
5a1ebdec9d | ||
|
|
bf2a33b21e | ||
|
|
130194aa0e | ||
|
|
1ebfd3834a | ||
|
|
1eeeace975 | ||
|
|
73ebcb3ab8 | ||
|
|
bd7b509278 | ||
|
|
652acbeb21 | ||
|
|
96e04d4691 | ||
|
|
7113074ae4 | ||
|
|
2db325eb74 | ||
|
|
9937d0b552 | ||
|
|
ae3e2a19c8 | ||
|
|
3567524fb2 | ||
|
|
4814c188eb | ||
|
|
a317188cb7 | ||
|
|
1d4151e51f | ||
|
|
c228fa7631 | ||
|
|
9658d36087 | ||
|
|
bbaa3dc869 | ||
|
|
4f10d6cd57 | ||
|
|
2209fcace3 | ||
|
|
a1847660a3 | ||
|
|
e2b48dc662 | ||
|
|
1a5b6ac472 | ||
|
|
0dd7a963a9 | ||
|
|
1642cec280 | ||
|
|
2f1c6668e7 | ||
|
|
fbeecf388c | ||
|
|
7933756b5a | ||
|
|
837e367d2d | ||
|
|
f81c3ada9c | ||
|
|
83663895f4 | ||
|
|
239d0f75b5 | ||
|
|
d88cc720fb | ||
|
|
ee13becf9c | ||
|
|
95b2dbbeca | ||
|
|
02c0a3b99b | ||
|
|
419731a189 | ||
|
|
2ac987bce9 | ||
|
|
0588cbf9d4 | ||
|
|
a7cce77550 | ||
|
|
5e63b40cde | ||
|
|
7b8b5eb4ea | ||
|
|
8dc3d883b8 | ||
|
|
24a3f7020c | ||
|
|
f74d5d5df4 | ||
|
|
7a21187fb9 | ||
|
|
439d3039e3 | ||
|
|
61cbf160a0 | ||
|
|
ce029c0735 | ||
|
|
8a2deeb3cc | ||
|
|
40164c348e | ||
|
|
9d7f873fd3 | ||
|
|
c5d320811b | ||
|
|
410f722ae5 | ||
|
|
8155b3c0a0 | ||
|
|
6836ffa103 | ||
|
|
b62b822100 | ||
|
|
849f5db5d1 | ||
|
|
a6493efcae | ||
|
|
1b0bf852be | ||
|
|
2b3185ec29 | ||
|
|
d63547b18a | ||
|
|
6697f85b50 | ||
|
|
67fe6f56ea | ||
|
|
b5ce15eefa | ||
|
|
a3688ada1a | ||
|
|
219d0bba42 | ||
|
|
bf3d8f3ad4 | ||
|
|
04a5d5bd74 | ||
|
|
2957aaf9f0 | ||
|
|
8360139506 | ||
|
|
0bf78b0b8b | ||
|
|
faca78f547 | ||
|
|
7da587ba6c | ||
|
|
c7aa51240d | ||
|
|
cdf7690e03 | ||
|
|
7b19719022 | ||
|
|
f8d0026c65 | ||
|
|
6b608e70ee | ||
|
|
a69a1af568 | ||
|
|
32b72555ee | ||
|
|
32af6a2390 | ||
|
|
b470dd943f | ||
|
|
69ca977aed | ||
|
|
728a6349b7 | ||
|
|
ec32174abc | ||
|
|
2172cd234a | ||
|
|
0425ac9ad0 | ||
|
|
367558bb21 | ||
|
|
186e7b5ca4 | ||
|
|
2197704693 | ||
|
|
229eb8715d | ||
|
|
1b18a06f8c | ||
|
|
91b513798e | ||
|
|
25234e510a | ||
|
|
d16eac5704 | ||
|
|
46bff47975 | ||
|
|
f718b50b3f | ||
|
|
58b7d0f5d2 | ||
|
|
30d4581be5 | ||
|
|
83387f957f | ||
|
|
f3620bbbad | ||
|
|
b45933d30d | ||
|
|
1613ed556d | ||
|
|
8f5b7b65eb | ||
|
|
053f72c671 | ||
|
|
63a8f333b8 | ||
|
|
57fd8e3187 | ||
|
|
03972b16c9 | ||
|
|
ac7ed82585 | ||
|
|
196c2e9c1f | ||
|
|
1accbcb98b | ||
|
|
342ae10f08 | ||
|
|
eb98a780ed | ||
|
|
64233fa3bb | ||
|
|
cbf5cf4ac3 | ||
|
|
a3f3f9cb76 | ||
|
|
5aeae08be0 | ||
|
|
64a658acaa | ||
|
|
361940a5d7 | ||
|
|
2721cbc8ee |
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"phabricator.uri" : "https://bugs.libssh.org/",
|
|
||||||
"history.immutable": true
|
|
||||||
}
|
|
||||||
13
.clang_complete
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
-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
|
||||||
361
.gitlab-ci.yml
@@ -1,361 +0,0 @@
|
|||||||
variables:
|
|
||||||
BUILD_IMAGES_PROJECT: libssh/build-images
|
|
||||||
FEDORA_BUILD: buildenv-fedora
|
|
||||||
CENTOS7_BUILD: buildenv-centos7
|
|
||||||
TUMBLEWEED_BUILD: buildenv-tumbleweed
|
|
||||||
MINGW_BUILD: buildenv-mingw
|
|
||||||
DEBIAN_CROSS_BUILD: buildenv-debian-cross
|
|
||||||
|
|
||||||
# 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/
|
|
||||||
|
|
||||||
.Debian.cross.template: &Debian_cross_template
|
|
||||||
stage: test
|
|
||||||
image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$DEBIAN_CROSS_BUILD
|
|
||||||
script:
|
|
||||||
- build=$(dpkg-architecture -qDEB_HOST_GNU_TYPE)
|
|
||||||
- host="${CI_JOB_NAME#*.cross.}"
|
|
||||||
- mkdir -p obj && cd obj && cmake
|
|
||||||
-DCMAKE_C_COMPILER="$(which $host-gcc)"
|
|
||||||
-DCMAKE_CXX_COMPILER="$(which $host-g++)"
|
|
||||||
-DCMAKE_BUILD_TYPE=Debug
|
|
||||||
-DUNIT_TESTING=ON -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON
|
|
||||||
-DWITH_PCAP=ON .. && make -j$(nproc)
|
|
||||||
- ctest --output-on-failure -j$(nproc)
|
|
||||||
tags:
|
|
||||||
- shared
|
|
||||||
except:
|
|
||||||
- tags
|
|
||||||
artifacts:
|
|
||||||
expire_in: 1 week
|
|
||||||
when: on_failure
|
|
||||||
paths:
|
|
||||||
- obj/
|
|
||||||
|
|
||||||
Debian.cross.mips-linux-gnu:
|
|
||||||
<<: *Debian_cross_template
|
|
||||||
141
CMakeLists.txt
@@ -1,20 +1,17 @@
|
|||||||
cmake_minimum_required(VERSION 3.3.0)
|
project(libssh C)
|
||||||
cmake_policy(SET CMP0048 NEW)
|
|
||||||
|
|
||||||
# Specify search path for CMake modules to be loaded by include()
|
# Required cmake version
|
||||||
# and find_package()
|
cmake_minimum_required(VERSION 2.8.5)
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules")
|
|
||||||
|
|
||||||
# Add defaults for cmake
|
# global needed variables
|
||||||
# Those need to be set before the project() call.
|
|
||||||
include(DefineCMakeDefaults)
|
|
||||||
include(DefineCompilerFlags)
|
|
||||||
|
|
||||||
project(libssh VERSION 0.8.3 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 "6")
|
||||||
|
|
||||||
|
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
|
||||||
@@ -22,19 +19,22 @@ set(APPLICATION_NAME ${PROJECT_NAME})
|
|||||||
# 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.7.0")
|
set(LIBRARY_VERSION "4.4.3")
|
||||||
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_CURRENT_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.")
|
||||||
@@ -49,27 +49,18 @@ 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)
|
||||||
find_package(MbedTLS)
|
message(FATAL_ERROR "Could not find OpenSSL or GCrypt")
|
||||||
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)
|
||||||
@@ -83,17 +74,6 @@ 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)
|
||||||
@@ -109,15 +89,30 @@ configure_file(libssh.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libssh.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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (LIBSSH_THREADS)
|
||||||
|
configure_file(libssh_threads.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libssh_threads.pc)
|
||||||
|
install(
|
||||||
|
FILES
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/libssh.pc
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/libssh_threads.pc
|
||||||
|
DESTINATION
|
||||||
|
${LIB_INSTALL_DIR}/pkgconfig
|
||||||
|
COMPONENT
|
||||||
|
pkgconfig
|
||||||
|
)
|
||||||
|
endif (LIBSSH_THREADS)
|
||||||
endif (UNIX)
|
endif (UNIX)
|
||||||
|
|
||||||
# cmake config files
|
# 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)
|
configure_file(${PROJECT_NAME}-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake @ONLY)
|
||||||
configure_file(${PROJECT_NAME}-config-version.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake @ONLY)
|
configure_file(${PROJECT_NAME}-config-version.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake @ONLY)
|
||||||
@@ -139,94 +134,32 @@ if (WITH_EXAMPLES)
|
|||||||
add_subdirectory(examples)
|
add_subdirectory(examples)
|
||||||
endif (WITH_EXAMPLES)
|
endif (WITH_EXAMPLES)
|
||||||
|
|
||||||
if (UNIT_TESTING)
|
if (WITH_TESTING)
|
||||||
find_package(CMocka REQUIRED)
|
find_package(CMocka REQUIRED)
|
||||||
include(AddCMockaTest)
|
include(AddCMockaTest)
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
endif (UNIT_TESTING)
|
endif (WITH_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: ${UNIT_TESTING}")
|
message(STATUS "Unit testing: ${WITH_TESTING}")
|
||||||
message(STATUS "Client code testing: ${CLIENT_TESTING}")
|
message(STATUS "Client code Unit testing: ${WITH_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 "********************************************")
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,27 @@
|
|||||||
### GENERAL SETTINGS
|
# For help take a look at:
|
||||||
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
|
# http://www.cmake.org/Wiki/CMake:CPackConfiguration
|
||||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The SSH Library")
|
|
||||||
|
### general settings
|
||||||
|
set(CPACK_PACKAGE_NAME ${APPLICATION_NAME})
|
||||||
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The SSH library")
|
||||||
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README")
|
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_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_CURRENT_SOURCE_DIR}/COPYING")
|
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING")
|
||||||
|
|
||||||
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
|
|
||||||
|
|
||||||
# SOURCE GENERATOR
|
### versions
|
||||||
|
set(CPACK_PACKAGE_VERSION_MAJOR ${APPLICATION_VERSION_MAJOR})
|
||||||
|
set(CPACK_PACKAGE_VERSION_MINOR ${APPLICATION_VERSION_MINOR})
|
||||||
|
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 "TXZ")
|
set(CPACK_SOURCE_GENERATOR "TXZ")
|
||||||
set(CPACK_SOURCE_IGNORE_FILES "~$;[.]swp$;/[.]git/;.gitignore;/build*;/obj*;tags;cscope.*")
|
set(CPACK_SOURCE_IGNORE_FILES "~$;[.]swp$;/[.]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")
|
||||||
|
|
||||||
@@ -38,6 +46,7 @@ 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")
|
||||||
|
|
||||||
|
|||||||
49
ChangeLog
@@ -1,51 +1,12 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
==========
|
==========
|
||||||
|
|
||||||
version 0.8.3 (released 2018-09-21)
|
version 0.7.6 (released 2018-10-16)
|
||||||
* Added support for rsa-sha2
|
* Fixed CVE-2018-10933
|
||||||
* 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 OpenSSL 1.1
|
||||||
* Added support for chacha20-poly1305 cipher
|
* Added SHA256 support for ssh_get_publickey_hash()
|
||||||
* Added crypto backend for mbedtls crypto library
|
* Fixed config parsing
|
||||||
* Added ECDSA support with gcrypt backend
|
* Fixed random memory corruption when importing pubkeys
|
||||||
* 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)
|
version 0.7.5 (released 2017-04-13)
|
||||||
* Fixed a memory allocation issue with buffers
|
* Fixed a memory allocation issue with buffers
|
||||||
|
|||||||
@@ -1,102 +0,0 @@
|
|||||||
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)
|
|
||||||
@@ -4,11 +4,11 @@ include(CheckSymbolExists)
|
|||||||
include(CheckFunctionExists)
|
include(CheckFunctionExists)
|
||||||
include(CheckLibraryExists)
|
include(CheckLibraryExists)
|
||||||
include(CheckTypeSize)
|
include(CheckTypeSize)
|
||||||
include(CheckStructHasMember)
|
include(CheckCXXSourceCompiles)
|
||||||
include(TestBigEndian)
|
include(TestBigEndian)
|
||||||
|
|
||||||
set(PACKAGE ${PROJECT_NAME})
|
set(PACKAGE ${APPLICATION_NAME})
|
||||||
set(VERSION ${PROJECT_VERSION})
|
set(VERSION ${APPLICATION_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}")
|
||||||
@@ -42,32 +42,24 @@ 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)
|
||||||
unset(CMAKE_REQUIRED_FLAGS)
|
set(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(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")
|
||||||
@@ -100,39 +92,16 @@ if (OPENSSL_FOUND)
|
|||||||
set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
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_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||||
set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
|
set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
|
||||||
check_function_exists(CRYPTO_ctr128_encrypt HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT)
|
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()
|
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 AND NOT WITH_MBEDTLS)
|
if (NOT WITH_GCRYPT)
|
||||||
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)
|
||||||
@@ -140,25 +109,13 @@ if (NOT WITH_GCRYPT AND NOT WITH_MBEDTLS)
|
|||||||
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 ()
|
endif (NOT WITH_GCRYPT)
|
||||||
|
|
||||||
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(strndup HAVE_STRNDUP)
|
|
||||||
check_function_exists(strtoull HAVE_STRTOULL)
|
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)
|
if (NOT WIN32)
|
||||||
check_function_exists(vsnprintf HAVE_VSNPRINTF)
|
check_function_exists(vsnprintf HAVE_VSNPRINTF)
|
||||||
@@ -183,14 +140,12 @@ 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)
|
||||||
unset(CMAKE_REQUIRED_LIBRARIES)
|
set(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)
|
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)
|
||||||
@@ -207,13 +162,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(_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} socket)
|
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_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(_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} nsl)
|
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} nsl)
|
||||||
endif (HAVE_LIBNSL)
|
endif (HAVE_LIBNSL)
|
||||||
|
|
||||||
# librt
|
# librt
|
||||||
@@ -222,7 +177,7 @@ 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(_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} rt)
|
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_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)
|
||||||
@@ -230,7 +185,7 @@ if (UNIX)
|
|||||||
check_function_exists(__strtoull HAVE___STRTOULL)
|
check_function_exists(__strtoull HAVE___STRTOULL)
|
||||||
endif (UNIX)
|
endif (UNIX)
|
||||||
|
|
||||||
set(LIBSSH_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} CACHE INTERNAL "libssh required system libraries")
|
set(LIBSSH_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} CACHE INTERNAL "libssh required system libraries")
|
||||||
|
|
||||||
# LIBRARIES
|
# LIBRARIES
|
||||||
if (OPENSSL_FOUND)
|
if (OPENSSL_FOUND)
|
||||||
@@ -240,16 +195,11 @@ 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)
|
||||||
@@ -269,58 +219,6 @@ 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)
|
|
||||||
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>
|
||||||
|
|
||||||
@@ -328,7 +226,7 @@ int main(void)
|
|||||||
{
|
{
|
||||||
char buf[] = \"This is some content\";
|
char buf[] = \"This is some content\";
|
||||||
|
|
||||||
memset(buf, '\\\\0', sizeof(buf)); __asm__ volatile(\"\" : : \"g\"(&buf) : \"memory\");
|
memset(buf, '\\\\0', sizeof(buf)); __asm__ volatile(\"\" : : \"r\"(&buf) : \"memory\");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}" HAVE_GCC_VOLATILE_MEMORY_PROTECTION)
|
}" HAVE_GCC_VOLATILE_MEMORY_PROTECTION)
|
||||||
@@ -359,40 +257,11 @@ 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,49 +1,33 @@
|
|||||||
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(UNIT_TESTING "Build with unit tests" OFF)
|
option(WITH_TESTING "Build with unit tests" OFF)
|
||||||
option(CLIENT_TESTING "Build with client tests; requires openssh" OFF)
|
option(WITH_CLIENT_TESTING "Build with client tests; requires a running sshd" 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(UNIT_TESTING ON)
|
set(WITH_TESTING ON)
|
||||||
set(CLIENT_TESTING ON)
|
endif(WITH_BENCHMARKS)
|
||||||
endif()
|
|
||||||
|
|
||||||
if (WITH_STATIC_LIB)
|
if (WITH_TESTING)
|
||||||
set(BUILD_STATIC_LIB ON)
|
set(WITH_STATIC_LIB ON)
|
||||||
endif (WITH_STATIC_LIB)
|
endif (WITH_TESTING)
|
||||||
|
|
||||||
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,10 +14,6 @@ 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.
|
||||||
@@ -35,27 +31,13 @@ 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 -DUNIT_TESTING=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
|
cmake -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.
|
||||||
|
|||||||
@@ -287,27 +287,6 @@ 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
|
||||||
---------
|
---------
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
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
@@ -1,44 +0,0 @@
|
|||||||
[](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
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
Please checkout the libssh source code using git. Change the code and then
|
Simple, just make the code change, and email it as either a "diff -u"
|
||||||
use "git format-patch" to create a patch. The patch should be signed (see
|
change, or as a "git format-patch" change against the original source
|
||||||
below) and send it to libssh@libssh.org, or attach it to a bug report at
|
code 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
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
#
|
|
||||||
# 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_cmocka_test(test_name test_source linklib1 ... linklibN)
|
# - ADD_CHECK_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-2018 Andreas Schneider <asn@cryptomilk.org>
|
# Copyright (c) 2007-2010 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,18 +9,22 @@
|
|||||||
enable_testing()
|
enable_testing()
|
||||||
include(CTest)
|
include(CTest)
|
||||||
|
|
||||||
if (CMAKE_CROSSCOMPILING)
|
if(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW)
|
||||||
if (WIN32)
|
# Profiling
|
||||||
find_program(WINE_EXECUTABLE
|
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")
|
||||||
NAMES wine)
|
set(CMAKE_SHARED_LINKER_FLAGS_PROFILING " -fprofile-arcs -ftest-coverage" CACHE STRING "Profiling Linker Flags")
|
||||||
set(TARGET_SYSTEM_EMULATOR ${WINE_EXECUTABLE})
|
set(CMAKE_MODULE_LINKER_FLAGS_PROFILING " -fprofile-arcs -ftest-coverage" CACHE STRING "Profiling Linker Flags")
|
||||||
endif()
|
set(CMAKE_EXEC_LINKER_FLAGS_PROFILING " -fprofile-arcs -ftest-coverage" CACHE STRING "Profiling Linker Flags")
|
||||||
endif()
|
|
||||||
|
|
||||||
function(ADD_CMOCKA_TEST _testName _testSource)
|
# Address Sanitizer
|
||||||
|
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,15 +15,12 @@
|
|||||||
# 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)
|
||||||
|
|
||||||
macro(CHECK_C_COMPILER_FLAG_SSP _FLAG _RESULT)
|
function(CHECK_C_COMPILER_FLAG_SSP _FLAG _RESULT)
|
||||||
set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
|
set(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
|
||||||
set(CMAKE_REQUIRED_FLAGS "${_FLAG}")
|
set(CMAKE_REQUIRED_DEFINITIONS "${_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}")
|
||||||
set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
|
endfunction(CHECK_C_COMPILER_FLAG_SSP)
|
||||||
endmacro(CHECK_C_COMPILER_FLAG_SSP)
|
|
||||||
|
|||||||
@@ -14,5 +14,17 @@ 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)
|
||||||
|
|||||||
@@ -1,25 +1,84 @@
|
|||||||
if (UNIX AND NOT WIN32)
|
# define system dependent compiler flags
|
||||||
# Activate with: -DCMAKE_BUILD_TYPE=Profiling
|
|
||||||
set(CMAKE_C_FLAGS_PROFILING "-g -O0 -fprofile-arcs -ftest-coverage"
|
include(CheckCCompilerFlag)
|
||||||
CACHE STRING "Flags used by the C compiler during PROFILING builds.")
|
include(CheckCCompilerFlagSSP)
|
||||||
set(CMAKE_CXX_FLAGS_PROFILING "-g -O0 -fprofile-arcs -ftest-coverage"
|
|
||||||
CACHE STRING "Flags used by the CXX compiler during PROFILING builds.")
|
if (UNIX AND NOT WIN32)
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS_PROFILING "-fprofile-arcs -ftest-coverage"
|
#
|
||||||
CACHE STRING "Flags used by the linker during the creation of shared libraries during PROFILING builds.")
|
# Define GNUCC compiler flags
|
||||||
set(CMAKE_MODULE_LINKER_FLAGS_PROFILING "-fprofile-arcs -ftest-coverage"
|
#
|
||||||
CACHE STRING "Flags used by the linker during the creation of shared libraries during PROFILING builds.")
|
if (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)")
|
||||||
set(CMAKE_EXEC_LINKER_FLAGS_PROFILING "-fprofile-arcs -ftest-coverage"
|
|
||||||
CACHE STRING "Flags used by the linker during PROFILING builds.")
|
# add -Wconversion ?
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -pedantic -pedantic-errors")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wshadow -Wmissing-prototypes -Wdeclaration-after-statement")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused -Wfloat-equal -Wpointer-arith -Wwrite-strings -Wformat-security")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
|
||||||
|
|
||||||
|
# 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()
|
|
||||||
|
|||||||
@@ -1,92 +0,0 @@
|
|||||||
#
|
|
||||||
# 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}")
|
|
||||||
@@ -1,486 +0,0 @@
|
|||||||
#
|
|
||||||
# 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,66 +1,60 @@
|
|||||||
# - Try to find ARGP
|
# - Try to find Argp
|
||||||
# Once done this will define
|
# Once done this will define
|
||||||
#
|
#
|
||||||
# ARGP_ROOT_DIR - Set this variable to the root installation of ARGP
|
# ARGP_FOUND - system has Argp
|
||||||
|
# ARGP_INCLUDE_DIRS - the Argp include directory
|
||||||
|
# ARGP_LIBRARIES - Link these to use Argp
|
||||||
|
# ARGP_DEFINITIONS - Compiler switches required for using Argp
|
||||||
#
|
#
|
||||||
# Read-Only variables:
|
# Copyright (c) 2010 Andreas Schneider <asn@cryptomilk.org>
|
||||||
# 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
|
||||||
# Copyright (c) 2011-2016 Andreas Schneider <asn@cryptomilk.org>
|
# BSD license.
|
||||||
#
|
# 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
|
|
||||||
)
|
|
||||||
|
|
||||||
set(_ARGP_ROOT_PATHS
|
if (ARGP_LIBRARIES AND ARGP_INCLUDE_DIRS)
|
||||||
"$ENV{PROGRAMFILES}/argp"
|
# in cache already
|
||||||
)
|
set(ARGP_FOUND TRUE)
|
||||||
|
else (ARGP_LIBRARIES AND ARGP_INCLUDE_DIRS)
|
||||||
|
|
||||||
find_path(ARGP_ROOT_DIR
|
find_path(ARGP_INCLUDE_DIR
|
||||||
NAMES
|
NAMES
|
||||||
include/argp.h
|
argp.h
|
||||||
HINTS
|
|
||||||
${_ARGP_ROOT_HINTS}
|
|
||||||
PATHS
|
PATHS
|
||||||
${_ARGP_ROOT_PATHS}
|
/usr/include
|
||||||
)
|
/usr/local/include
|
||||||
mark_as_advanced(ARGP_ROOT_DIR)
|
/opt/local/include
|
||||||
|
/sw/include
|
||||||
find_path(ARGP_INCLUDE_DIR
|
|
||||||
NAMES
|
|
||||||
argp.h
|
|
||||||
PATHS
|
|
||||||
${ARGP_ROOT_DIR}/include
|
|
||||||
)
|
|
||||||
|
|
||||||
find_library(ARGP_LIBRARY
|
|
||||||
NAMES
|
|
||||||
argp
|
|
||||||
PATHS
|
|
||||||
${ARGP_ROOT_DIR}/lib
|
|
||||||
)
|
|
||||||
|
|
||||||
if (ARGP_LIBRARY)
|
|
||||||
set(ARGP_LIBRARIES
|
|
||||||
${ARGP_LIBRARIES}
|
|
||||||
${ARGP_LIBRARY}
|
|
||||||
)
|
)
|
||||||
endif (ARGP_LIBRARY)
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
find_library(ARGP_LIBRARY
|
||||||
find_package_handle_standard_args(ARGP DEFAULT_MSG ARGP_LIBRARIES ARGP_INCLUDE_DIR)
|
NAMES
|
||||||
|
argp
|
||||||
|
PATHS
|
||||||
|
/usr/lib
|
||||||
|
/usr/local/lib
|
||||||
|
/opt/local/lib
|
||||||
|
/sw/lib
|
||||||
|
)
|
||||||
|
|
||||||
|
set(ARGP_INCLUDE_DIRS
|
||||||
|
${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)
|
|
||||||
|
|||||||
@@ -52,9 +52,9 @@ find_library(GCRYPT_LIBRARY
|
|||||||
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,8 +54,7 @@ if (UNIX)
|
|||||||
OUTPUT_VARIABLE
|
OUTPUT_VARIABLE
|
||||||
_GSSAPI_VENDOR_STRING)
|
_GSSAPI_VENDOR_STRING)
|
||||||
|
|
||||||
if ((_GSSAPI_VENDOR_STRING MATCHES ".*Massachusetts.*") OR (_GSSAPI_VENDOR_STRING
|
if (_GSSAPI_VENDOR_STRING MATCHES ".*Massachusetts.*")
|
||||||
MATCHES ".*MITKerberosShim.*"))
|
|
||||||
set(GSSAPI_FLAVOR_MIT TRUE)
|
set(GSSAPI_FLAVOR_MIT TRUE)
|
||||||
else()
|
else()
|
||||||
execute_process(
|
execute_process(
|
||||||
|
|||||||
@@ -1,104 +0,0 @@
|
|||||||
# - 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,16 +21,17 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(_x86 "(x86)")
|
set(_NSIS_ROOT_HINTS
|
||||||
|
"[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}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,118 +0,0 @@
|
|||||||
#
|
|
||||||
# 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()
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
#
|
|
||||||
# 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}")
|
|
||||||
140
cmake/Modules/UseDoxygen.cmake
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
# - 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()
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
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 "${PROJECT_NAME}"
|
#cmakedefine PACKAGE "${APPLICATION_NAME}"
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#cmakedefine VERSION "${PROJECT_VERSION}"
|
#cmakedefine VERSION "${APPLICATION_VERSION}"
|
||||||
|
|
||||||
#cmakedefine LOCALEDIR "${LOCALE_INSTALL_DIR}"
|
#cmakedefine LOCALEDIR "${LOCALE_INSTALL_DIR}"
|
||||||
#cmakedefine DATADIR "${DATADIR}"
|
#cmakedefine DATADIR "${DATADIR}"
|
||||||
@@ -20,9 +20,6 @@
|
|||||||
/* 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
|
||||||
|
|
||||||
@@ -38,21 +35,12 @@
|
|||||||
/* 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
|
||||||
|
|
||||||
@@ -86,29 +74,11 @@
|
|||||||
/* 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. */
|
/* Define to 1 if you have the `CRYPTO_ctr128_encrypt' function. */
|
||||||
#cmakedefine HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT 1
|
#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
|
||||||
|
|
||||||
@@ -133,9 +103,6 @@
|
|||||||
/* 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
|
||||||
|
|
||||||
@@ -166,18 +133,6 @@
|
|||||||
/* 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). */
|
||||||
@@ -186,9 +141,6 @@
|
|||||||
/* 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
|
||||||
|
|
||||||
@@ -197,19 +149,12 @@
|
|||||||
#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
|
||||||
|
|
||||||
@@ -219,15 +164,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,46 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Build the documentation
|
# Build the documentation
|
||||||
#
|
#
|
||||||
if (${CMAKE_VERSION} VERSION_GREATER "3.8.99")
|
include(UseDoxygen OPTIONAL)
|
||||||
|
|
||||||
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
Normal file
@@ -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_pki_import_pubkey_file().
|
- Retrieve the public key with ssh_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.
|
||||||
@@ -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 || rc == SSH_AUTH_ERROR) {
|
if (rc != SSH_AUTH_SUCCESS) {
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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_session_is_known_server()
|
- The first way (recommended) is to use the ssh_is_server_known()
|
||||||
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,89 +185,74 @@ examples/ directory:
|
|||||||
|
|
||||||
int verify_knownhost(ssh_session session)
|
int verify_knownhost(ssh_session session)
|
||||||
{
|
{
|
||||||
enum ssh_known_hosts_e state;
|
int state, hlen;
|
||||||
unsigned char *hash = NULL;
|
unsigned char *hash = NULL;
|
||||||
ssh_key srv_pubkey = NULL;
|
char *hexa;
|
||||||
size_t hlen;
|
char buf[10];
|
||||||
char buf[10];
|
|
||||||
char *hexa;
|
|
||||||
char *p;
|
|
||||||
int cmp;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
rc = ssh_get_server_publickey(session, &srv_pubkey);
|
state = ssh_is_server_known(session);
|
||||||
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)
|
||||||
rc = ssh_get_publickey_hash(srv_pubkey,
|
{
|
||||||
SSH_PUBLICKEY_HASH_SHA1,
|
free(hash);
|
||||||
&hash,
|
|
||||||
&hlen);
|
|
||||||
ssh_key_free(srv_pubkey);
|
|
||||||
if (rc < 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (ssh_write_knownhost(session) < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error %s\n", strerror(errno));
|
||||||
|
free(hash);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
state = ssh_session_is_known_server(session);
|
case SSH_SERVER_ERROR:
|
||||||
switch (state) {
|
fprintf(stderr, "Error %s", ssh_get_error(session));
|
||||||
case SSH_KNOWN_HOSTS_OK:
|
free(hash);
|
||||||
/* OK */
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
free(hash);
|
||||||
case SSH_KNOWN_HOSTS_CHANGED:
|
return 0;
|
||||||
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
|
||||||
|
|
||||||
@@ -275,10 +260,9 @@ 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_server_publickey
|
@see ssh_get_pubkey_hash
|
||||||
@see ssh_get_publickey_hash
|
@see ssh_is_server_known
|
||||||
@see ssh_session_is_known_server
|
@see ssh_write_knownhost
|
||||||
@see ssh_session_update_known_hosts
|
|
||||||
|
|
||||||
|
|
||||||
@subsection auth Authenticating the user
|
@subsection auth Authenticating the user
|
||||||
|
|||||||
@@ -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, curve25519-sha256@libssh.org, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521</i>, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1
|
- <strong>Key Exchange Methods</strong>: <i>curve25519-sha256@libssh.org, ecdh-sha2-nistp256</i>, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1
|
||||||
- <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>Hostkey Types</strong>: <i>ecdsa-sha2-nistp256</i>, ssh-dss, ssh-rsa
|
||||||
- <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>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>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, hmac-sha2-256, hmac-sha2-384, hmac-sha2-512, hmac-md5, none
|
- <strong>MAC hashes</strong>: hmac-sha1, none
|
||||||
- <strong>Authentication</strong>: none, password, public-key, keyboard-interactive, <i>gssapi-with-mic</i>
|
- <strong>Authentication</strong>: none, password, public-key, hostbased, 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), <i>OpenSSH Extensions</i>
|
- <strong>Subsystems</strong>: sftp(version 3), publickey(version 2), <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
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
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.
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
# 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).
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
<!-- 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 -->
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 6.5 KiB |
@@ -1,77 +0,0 @@
|
|||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.4 KiB |
@@ -1,83 +0,0 @@
|
|||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 4.1 KiB |
@@ -1,73 +0,0 @@
|
|||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.8 KiB |
@@ -1,73 +0,0 @@
|
|||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.8 KiB |
@@ -1,73 +0,0 @@
|
|||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -1,73 +0,0 @@
|
|||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -1,120 +0,0 @@
|
|||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 483 B |
|
Before Width: | Height: | Size: 488 B |
@@ -1,32 +0,0 @@
|
|||||||
// 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);
|
|
||||||
@@ -3,15 +3,14 @@
|
|||||||
@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 :
|
||||||
- Your system must support libpthread or, in Windows environment,
|
- Threading must be initialized during the initialization of libssh. This
|
||||||
CriticalSection based mutex control.
|
initialization must be done outside of any threading context.
|
||||||
- Since version 0.8.0, threads initialization is called automatically in the
|
- If pthreads is being used by your application (or your framework's backend),
|
||||||
library constructor if libssh is dynamically linked. This means it is no
|
you must link with libssh_threads dynamic library and initialize
|
||||||
longer necessary to call ssh_init()/ssh_finalize().
|
threading with the ssh_threads_pthreads threading object.
|
||||||
- If libssh is statically linked, threading must be initialized by calling
|
- If an other threading library is being used by your application, you must
|
||||||
ssh_init() before using any of libssh provided functions. This initialization
|
implement all the methods of the ssh_threads_callbacks_struct structure
|
||||||
must be done outside of any threading context. Don't forget to call
|
and initialize libssh with it.
|
||||||
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
|
||||||
@@ -20,33 +19,48 @@ libssh may be used in multithreaded applications, but under several conditions :
|
|||||||
|
|
||||||
@subsection threads_init Initialization of threads
|
@subsection threads_init Initialization of threads
|
||||||
|
|
||||||
Since version 0.8.0, it is no longer necessary to call ssh_init()/ssh_finalize()
|
To initialize threading, you must first select the threading model you want to
|
||||||
if libssh is dynamically linked.
|
use, using ssh_threads_set_callbacks(), then call ssh_init().
|
||||||
|
|
||||||
If libssh is statically linked, call ssh_init() before using any of libssh
|
@code
|
||||||
provided functions.
|
#include <libssh/callbacks.h>
|
||||||
|
...
|
||||||
|
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
|
||||||
|
|
||||||
Since version 0.8.0, libpthread is the default threads library used by libssh.
|
If your application is using libpthread, you may simply use the libpthread
|
||||||
|
threading backend:
|
||||||
|
|
||||||
To use libpthread, simply link it to you application.
|
@code
|
||||||
|
#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
|
||||||
|
|
||||||
Since version 0.8.0, libssh does not support custom threading libraries.
|
You must find your way in the ssh_threads_callbacks_struct structure. You must
|
||||||
The change makes sense since the newer versions for libcrypto (OpenSSL) and
|
implement the following methods :
|
||||||
libgcrypt don't support custom threading libraries.
|
- mutex_lock
|
||||||
|
- mutex_unlock
|
||||||
The default used threading library is libpthread.
|
- mutex_init
|
||||||
Alternatively, in Windows environment, CriticalSection based mutex control can
|
- mutex_destroy
|
||||||
be used.
|
- thread_id
|
||||||
|
|
||||||
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,63 +11,52 @@ include_directories(
|
|||||||
${CMAKE_BINARY_DIR}
|
${CMAKE_BINARY_DIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
if (ARGP_INCLUDE_DIR)
|
if (BSD OR SOLARIS OR OSX)
|
||||||
include_directories(${ARGP_INCLUDE_DIR})
|
find_package(Argp)
|
||||||
endif()
|
endif (BSD OR SOLARIS OR OSX)
|
||||||
|
|
||||||
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(ssh-client ssh_client.c ${examples_SRCS})
|
add_executable(samplessh sample.c ${examples_SRCS})
|
||||||
target_compile_options(ssh-client PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
target_link_libraries(samplessh ${LIBSSH_SHARED_LIBRARY})
|
||||||
target_link_libraries(ssh-client ${LIBSSH_SHARED_LIBRARY})
|
|
||||||
|
|
||||||
if (WITH_SERVER AND (ARGP_LIBRARY OR HAVE_ARGP_H))
|
if (WITH_SERVER)
|
||||||
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_compile_options(ssh_server_fork PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
target_link_libraries(ssh_server_fork ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARIES} util)
|
||||||
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_compile_options(samplesshd-cb PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
target_link_libraries(samplesshd-cb ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARIES})
|
||||||
target_link_libraries(samplesshd-cb ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY})
|
|
||||||
|
|
||||||
add_executable(proxy proxy.c)
|
add_executable(proxy proxy.c)
|
||||||
target_compile_options(proxy PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
target_link_libraries(proxy ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARIES})
|
||||||
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_compile_options(samplesshd-kbdint PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
|
target_link_libraries(samplesshd-kbdint ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARIES})
|
||||||
target_link_libraries(samplesshd-kbdint ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARY})
|
|
||||||
|
|
||||||
endif()
|
endif (WITH_SERVER)
|
||||||
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,8 +24,7 @@ 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);
|
||||||
@@ -100,80 +99,78 @@ 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 rc;
|
int method;
|
||||||
int method;
|
char password[128] = {0};
|
||||||
char password[128] = {0};
|
char *banner;
|
||||||
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,14 +17,11 @@ 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"
|
||||||
|
|
||||||
@@ -33,20 +30,23 @@ clients must be made or how a client should react.
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int verify_knownhost(ssh_session session){
|
int verify_knownhost(ssh_session session){
|
||||||
enum ssh_known_hosts_e state;
|
char *hexa;
|
||||||
|
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;
|
||||||
|
|
||||||
rc = ssh_get_server_publickey(session, &srv_pubkey);
|
state=ssh_is_server_known(session);
|
||||||
|
|
||||||
|
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_SHA256,
|
SSH_PUBLICKEY_HASH_SHA1,
|
||||||
&hash,
|
&hash,
|
||||||
&hlen);
|
&hlen);
|
||||||
ssh_key_free(srv_pubkey);
|
ssh_key_free(srv_pubkey);
|
||||||
@@ -54,33 +54,30 @@ int verify_knownhost(ssh_session session){
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
state = ssh_session_is_known_server(session);
|
|
||||||
|
|
||||||
switch(state){
|
switch(state){
|
||||||
case SSH_KNOWN_HOSTS_OK:
|
case SSH_SERVER_KNOWN_OK:
|
||||||
break; /* ok */
|
break; /* ok */
|
||||||
case SSH_KNOWN_HOSTS_CHANGED:
|
case SSH_SERVER_KNOWN_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_hash(SSH_PUBLICKEY_HASH_SHA256, hash, hlen);
|
ssh_print_hexa("Public key hash",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_KNOWN_HOSTS_OTHER:
|
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,"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_KNOWN_HOSTS_NOT_FOUND:
|
case SSH_SERVER_FILE_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:
|
||||||
fprintf(stderr,
|
hexa = ssh_get_hexa(hash, hlen);
|
||||||
"The server is unknown. Do you trust the host key (yes/no)?\n");
|
fprintf(stderr,"The server is unknown. Do you trust the host key ?\n");
|
||||||
ssh_print_hash(SSH_PUBLICKEY_HASH_SHA256, hash, hlen);
|
fprintf(stderr, "Public key hash: %s\n", hexa);
|
||||||
|
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;
|
||||||
@@ -103,7 +100,7 @@ int verify_knownhost(ssh_session session){
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case SSH_KNOWN_HOSTS_ERROR:
|
case SSH_SERVER_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;
|
||||||
|
|||||||
523
examples/sample.c
Normal file
@@ -0,0 +1,523 @@
|
|||||||
|
/* 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,259 +33,236 @@ static int verbosity;
|
|||||||
static char *destination;
|
static char *destination;
|
||||||
|
|
||||||
#define DATALEN 65536
|
#define DATALEN 65536
|
||||||
|
static void do_sftp(ssh_session session){
|
||||||
static void do_sftp(ssh_session session) {
|
sftp_session sftp=sftp_new(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));
|
||||||
goto end;
|
return;
|
||||||
}
|
}
|
||||||
|
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));
|
||||||
goto end;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
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));
|
||||||
fprintf(stderr, "Could not create link (%s)\n",
|
return;
|
||||||
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));
|
||||||
goto end;
|
return;
|
||||||
}
|
}
|
||||||
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));
|
||||||
goto end;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
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));
|
||||||
goto end;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
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));
|
||||||
goto end;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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 */
|
||||||
/* when file = NULL, an error has occured OR the directory listing is end of
|
if(!sftp_dir_eof(dir)){
|
||||||
* file */
|
|
||||||
if (!sftp_dir_eof(dir)) {
|
|
||||||
fprintf(stderr, "Error: %s\n", ssh_get_error(session));
|
fprintf(stderr, "Error: %s\n", ssh_get_error(session));
|
||||||
goto end;
|
return;
|
||||||
}
|
}
|
||||||
|
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));
|
||||||
goto end;
|
return;
|
||||||
}
|
}
|
||||||
/* 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
|
/* the small buffer size was intended to stress the library. of course, you can use a buffer till 20kbytes without problem */
|
||||||
* 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));
|
||||||
goto end;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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));
|
||||||
sftp_close(fichier);
|
return;
|
||||||
goto end;
|
|
||||||
}
|
}
|
||||||
|
while((len=sftp_read(fichier,data,4096)) > 0){
|
||||||
while ((len = sftp_read(fichier, data, 4096)) > 0) {
|
if(sftp_write(to,data,len)!=len){
|
||||||
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));
|
||||||
sftp_close(to);
|
return;
|
||||||
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){
|
||||||
for (i = 0; i < 1000; ++i) {
|
len=sftp_write(to,data,DATALEN);
|
||||||
len = sftp_write(to, data, DATALEN);
|
printf("wrote %d bytes\n",len);
|
||||||
printf("wrote %d bytes\n", len);
|
if(len != DATALEN){
|
||||||
if (len != DATALEN) {
|
printf("chunk %d : %d (%s)\n",i,len,ssh_get_error(session));
|
||||||
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){
|
||||||
while ((i = getopt(argc, argv, "v")) != -1) {
|
switch(i){
|
||||||
switch(i) {
|
case 'v':
|
||||||
case 'v':
|
verbosity++;
|
||||||
verbosity++;
|
break;
|
||||||
break;
|
default:
|
||||||
default:
|
fprintf(stderr,"unknown option %c\n",optopt);
|
||||||
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)
|
||||||
if (opts(argc, argv) < 0) {
|
return EXIT_FAILURE;
|
||||||
return EXIT_FAILURE;
|
session=connect_ssh(destination,NULL,verbosity);
|
||||||
}
|
if(session == NULL)
|
||||||
|
return EXIT_FAILURE;
|
||||||
session = connect_ssh(destination, NULL, verbosity);
|
do_sftp(session);
|
||||||
if (session == NULL) {
|
ssh_disconnect(session);
|
||||||
return EXIT_FAILURE;
|
ssh_free(session);
|
||||||
}
|
return 0;
|
||||||
|
|
||||||
do_sftp(session);
|
|
||||||
ssh_disconnect(session);
|
|
||||||
ssh_free(session);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -22,12 +22,9 @@ program.
|
|||||||
#include <libssh/libssh.h>
|
#include <libssh/libssh.h>
|
||||||
#include "examples_common.h"
|
#include "examples_common.h"
|
||||||
|
|
||||||
static int verbosity = 0;
|
int verbosity=0;
|
||||||
static const char *createcommand =
|
const char *createcommand="rm -fr /tmp/libssh_tests && mkdir /tmp/libssh_tests && cd /tmp/libssh_tests && date > a && date > b && mkdir c && date > d";
|
||||||
"rm -fr /tmp/libssh_tests && mkdir /tmp/libssh_tests && "
|
char *host=NULL;
|
||||||
"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 0x100000000UL
|
#define LIMIT 0x100000000
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
ssh_session session;
|
ssh_session session;
|
||||||
|
|||||||
@@ -1,407 +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(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,7 +621,6 @@ 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;
|
||||||
@@ -632,17 +631,8 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ssh_init();
|
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,8 +43,7 @@ const char *port="22";
|
|||||||
char *pcap_file=NULL;
|
char *pcap_file=NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void usage(void)
|
static void usage(){
|
||||||
{
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,13 @@ 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,9 +66,6 @@
|
|||||||
#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;
|
||||||
@@ -84,16 +81,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 *ssh_agent_new(struct ssh_session_struct *session);
|
struct ssh_agent_struct *agent_new(struct ssh_session_struct *session);
|
||||||
|
|
||||||
void ssh_agent_close(struct ssh_agent_struct *agent);
|
void 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 ssh_agent_free(struct ssh_agent_struct *agent);
|
void agent_free(struct ssh_agent_struct *agent);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Check if the ssh agent is running.
|
* @brief Check if the ssh agent is running.
|
||||||
@@ -102,7 +99,7 @@ void ssh_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 ssh_agent_is_running(struct ssh_session_struct *session);
|
int 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);
|
||||||
|
|
||||||
@@ -118,3 +115,4 @@ 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,6 +49,20 @@ 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
|
||||||
@@ -76,6 +90,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
|
||||||
@@ -90,6 +112,8 @@ 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,12 +23,11 @@
|
|||||||
|
|
||||||
#include "libssh/libcrypto.h"
|
#include "libssh/libcrypto.h"
|
||||||
#include "libssh/libgcrypt.h"
|
#include "libssh/libgcrypt.h"
|
||||||
#include "libssh/libmbedcrypto.h"
|
|
||||||
|
|
||||||
bignum ssh_make_string_bn(ssh_string string);
|
bignum make_string_bn(ssh_string string);
|
||||||
void ssh_make_string_bn_inplace(ssh_string string, bignum bnout);
|
void make_string_bn_inplace(ssh_string string, bignum bnout);
|
||||||
ssh_string ssh_make_bignum_string(bignum num);
|
ssh_string make_bignum_string(bignum num);
|
||||||
void ssh_print_bignum(const char *which, const bignum num);
|
void ssh_print_bignum(const char *which,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 */
|
||||||
} ssh_blf_ctx;
|
} 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(ssh_blf_ctx *, uint32_t *, uint32_t *);
|
void Blowfish_encipher(blf_ctx *, uint32_t *, uint32_t *);
|
||||||
void Blowfish_decipher(ssh_blf_ctx *, uint32_t *, uint32_t *);
|
void Blowfish_decipher(blf_ctx *, uint32_t *, uint32_t *);
|
||||||
void Blowfish_initstate(ssh_blf_ctx *);
|
void Blowfish_initstate(blf_ctx *);
|
||||||
void Blowfish_expand0state(ssh_blf_ctx *, const uint8_t *, uint16_t);
|
void Blowfish_expand0state(blf_ctx *, const uint8_t *, uint16_t);
|
||||||
void Blowfish_expandstate
|
void Blowfish_expandstate
|
||||||
(ssh_blf_ctx *, const uint8_t *, uint16_t, const uint8_t *, uint16_t);
|
(blf_ctx *, const uint8_t *, uint16_t, const uint8_t *, uint16_t);
|
||||||
|
|
||||||
/* Standard Blowfish */
|
/* Standard Blowfish */
|
||||||
|
|
||||||
void ssh_blf_key(ssh_blf_ctx *, const uint8_t *, uint16_t);
|
void blf_key(blf_ctx *, const uint8_t *, uint16_t);
|
||||||
void ssh_blf_enc(ssh_blf_ctx *, uint32_t *, uint16_t);
|
void blf_enc(blf_ctx *, uint32_t *, uint16_t);
|
||||||
void ssh_blf_dec(ssh_blf_ctx *, uint32_t *, uint16_t);
|
void blf_dec(blf_ctx *, uint32_t *, uint16_t);
|
||||||
|
|
||||||
void ssh_blf_ecb_encrypt(ssh_blf_ctx *, uint8_t *, uint32_t);
|
void blf_ecb_encrypt(blf_ctx *, uint8_t *, uint32_t);
|
||||||
void ssh_blf_ecb_decrypt(ssh_blf_ctx *, uint8_t *, uint32_t);
|
void blf_ecb_decrypt(blf_ctx *, uint8_t *, uint32_t);
|
||||||
|
|
||||||
void ssh_blf_cbc_encrypt(ssh_blf_ctx *, uint8_t *, uint8_t *, uint32_t);
|
void blf_cbc_encrypt(blf_ctx *, uint8_t *, uint8_t *, uint32_t);
|
||||||
void ssh_blf_cbc_decrypt(ssh_blf_ctx *, uint8_t *, uint8_t *, uint32_t);
|
void blf_cbc_decrypt(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,20 +24,37 @@
|
|||||||
#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 ssh_buffer_add_ssh_string(ssh_buffer buffer, ssh_string string);
|
int buffer_add_ssh_string(ssh_buffer buffer, ssh_string string);
|
||||||
int ssh_buffer_add_u8(ssh_buffer buffer, uint8_t data);
|
int buffer_add_u8(ssh_buffer buffer, uint8_t data);
|
||||||
int ssh_buffer_add_u16(ssh_buffer buffer, uint16_t data);
|
int buffer_add_u16(ssh_buffer buffer, uint16_t data);
|
||||||
int ssh_buffer_add_u32(ssh_buffer buffer, uint32_t data);
|
int buffer_add_u32(ssh_buffer buffer, uint32_t data);
|
||||||
int ssh_buffer_add_u64(ssh_buffer buffer, uint64_t data);
|
int 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);
|
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,
|
||||||
@@ -59,19 +76,27 @@ 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 ssh_buffer_prepend_data(ssh_buffer buffer, const void *data, uint32_t len);
|
int buffer_prepend_data(ssh_buffer buffer, const void *data, uint32_t len);
|
||||||
int ssh_buffer_add_buffer(ssh_buffer buffer, ssh_buffer source);
|
int 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 ssh_buffer_get_u8(ssh_buffer buffer, uint8_t *data);
|
int buffer_get_u8(ssh_buffer buffer, uint8_t *data);
|
||||||
int ssh_buffer_get_u32(ssh_buffer buffer, uint32_t *data);
|
int buffer_get_u32(ssh_buffer buffer, uint32_t *data);
|
||||||
int ssh_buffer_get_u64(ssh_buffer buffer, uint64_t *data);
|
int buffer_get_u64(ssh_buffer buffer, uint64_t *data);
|
||||||
|
|
||||||
/* ssh_buffer_get_ssh_string() is an exception. if the String read is too large or invalid, it will answer NULL. */
|
uint32_t buffer_get_data(ssh_buffer buffer, void *data, uint32_t requestedlen);
|
||||||
ssh_string ssh_buffer_get_ssh_string(ssh_buffer buffer);
|
/* buffer_get_ssh_string() is an exception. if the String read is too large or invalid, it will answer NULL. */
|
||||||
|
ssh_string buffer_get_ssh_string(ssh_buffer buffer);
|
||||||
/* ssh_buffer_pass_bytes acts as if len bytes have been read (used for padding) */
|
/* gets a string out of a SSH-1 mpint */
|
||||||
uint32_t ssh_buffer_pass_bytes_end(ssh_buffer buffer, uint32_t len);
|
ssh_string buffer_get_mpint(ssh_buffer buffer);
|
||||||
uint32_t ssh_buffer_pass_bytes(ssh_buffer buffer, uint32_t len);
|
/* buffer_pass_bytes acts as if len bytes have been read (used for padding) */
|
||||||
|
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,18 +124,6 @@ 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.
|
||||||
*/
|
*/
|
||||||
@@ -166,9 +154,6 @@ 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;
|
||||||
|
|
||||||
@@ -435,69 +420,6 @@ 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)
|
||||||
@@ -757,22 +679,6 @@ 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. */
|
||||||
@@ -837,10 +743,6 @@ 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;
|
||||||
@@ -865,46 +767,10 @@ 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
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
/* $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 */
|
|
||||||
@@ -71,10 +71,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;
|
||||||
struct ssh_list *callbacks; /* list of ssh_channel_callbacks */
|
ssh_channel_callbacks callbacks;
|
||||||
|
|
||||||
/* counters */
|
/* counters */
|
||||||
ssh_counter counter;
|
ssh_counter counter;
|
||||||
};
|
};
|
||||||
@@ -99,5 +99,20 @@ 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
|
||||||
|
SSH_PACKET_CALLBACK(ssh_packet_data1);
|
||||||
|
SSH_PACKET_CALLBACK(ssh_packet_close1);
|
||||||
|
SSH_PACKET_CALLBACK(ssh_packet_exist_status1);
|
||||||
|
|
||||||
|
/* 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,42 +55,14 @@ 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
|
||||||
@@ -113,7 +85,8 @@ 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_key server_pubkey;
|
ssh_string 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 */
|
||||||
@@ -131,24 +104,14 @@ 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 */
|
||||||
enum ssh_cipher_e ciphertype;
|
unsigned int keylen; /* length of the key structure */
|
||||||
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
|
||||||
struct ssh_3des_key_schedule *des3_key;
|
void *key; /* a key buffer allocated for the algo */
|
||||||
struct ssh_aes_key_schedule *aes_key;
|
void *IV;
|
||||||
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);
|
||||||
@@ -156,15 +119,7 @@ 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);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct ssh_cipher_struct *ssh_get_chacha20poly1305_cipher(void);
|
/* vim: set ts=2 sw=2 et cindent: */
|
||||||
|
|
||||||
#endif /* _CRYPTO_H_ */
|
#endif /* _CRYPTO_H_ */
|
||||||
|
|||||||
@@ -25,37 +25,27 @@
|
|||||||
|
|
||||||
#include "libssh/crypto.h"
|
#include "libssh/crypto.h"
|
||||||
|
|
||||||
int ssh_dh_generate_e(ssh_session session);
|
int dh_generate_e(ssh_session session);
|
||||||
int ssh_dh_generate_f(ssh_session session);
|
int dh_generate_f(ssh_session session);
|
||||||
int ssh_dh_generate_x(ssh_session session);
|
int dh_generate_x(ssh_session session);
|
||||||
int ssh_dh_generate_y(ssh_session session);
|
int dh_generate_y(ssh_session session);
|
||||||
|
|
||||||
int ssh_dh_init(void);
|
int ssh_crypto_init(void);
|
||||||
void ssh_dh_finalize(void);
|
void ssh_crypto_finalize(void);
|
||||||
|
|
||||||
ssh_string ssh_dh_get_e(ssh_session session);
|
ssh_string dh_get_e(ssh_session session);
|
||||||
ssh_string ssh_dh_get_f(ssh_session session);
|
ssh_string dh_get_f(ssh_session session);
|
||||||
int ssh_dh_import_f(ssh_session session,ssh_string f_string);
|
int dh_import_f(ssh_session session,ssh_string f_string);
|
||||||
int ssh_dh_import_e(ssh_session session, ssh_string e_string);
|
int dh_import_e(ssh_session session, ssh_string e_string);
|
||||||
|
void dh_import_pubkey(ssh_session session,ssh_string pubkey_string);
|
||||||
int ssh_dh_import_pubkey_blob(ssh_session session, ssh_string pubkey_blob);
|
int dh_build_k(ssh_session session);
|
||||||
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);
|
||||||
|
|
||||||
ssh_key ssh_dh_get_current_server_publickey(ssh_session session);
|
int make_sessionid(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 ssh_hashbufin_add_cookie(ssh_session session, unsigned char *cookie);
|
int hashbufin_add_cookie(ssh_session session, unsigned char *cookie);
|
||||||
int ssh_hashbufout_add_cookie(ssh_session session);
|
int hashbufout_add_cookie(ssh_session session);
|
||||||
int ssh_generate_session_keys(ssh_session session);
|
int generate_session_keys(ssh_session session);
|
||||||
|
|
||||||
#endif /* DH_H_ */
|
#endif /* DH_H_ */
|
||||||
|
|||||||
@@ -33,20 +33,8 @@
|
|||||||
#endif /* HAVE_OPENSSL_ECDH_H */
|
#endif /* HAVE_OPENSSL_ECDH_H */
|
||||||
#endif /* HAVE_LIBCRYPTO */
|
#endif /* HAVE_LIBCRYPTO */
|
||||||
|
|
||||||
#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);
|
|
||||||
|
|
||||||
/* Backend-specific functions. */
|
|
||||||
int ssh_client_ecdh_init(ssh_session session);
|
int ssh_client_ecdh_init(ssh_session session);
|
||||||
int ecdh_build_k(ssh_session session);
|
int ssh_client_ecdh_reply(ssh_session session, ssh_buffer packet);
|
||||||
|
|
||||||
#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);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ typedef struct
|
|||||||
fe25519 t;
|
fe25519 t;
|
||||||
} ge25519;
|
} ge25519;
|
||||||
|
|
||||||
extern const ge25519 ge25519_base;
|
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,18 +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 ssh_set_client_kex(ssh_session session);
|
int set_client_kex(ssh_session session);
|
||||||
int ssh_kex_select_methods(ssh_session session);
|
int ssh_kex_select_methods(ssh_session session);
|
||||||
int ssh_verify_existing_algo(enum ssh_kex_types_e algo, const char *name);
|
int verify_existing_algo(int algo, const char *name);
|
||||||
char *ssh_keep_known_algos(enum ssh_kex_types_e algo, const char *list);
|
char **space_tokenize(const char *chain);
|
||||||
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);
|
||||||
|
|
||||||
#endif /* KEX_H_ */
|
#endif /* KEX_H_ */
|
||||||
|
|||||||
@@ -34,9 +34,6 @@ 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
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -48,9 +45,6 @@ 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,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef SSH_KNOWNHOSTS_H_
|
#ifndef KNOWNHOSTS_H_
|
||||||
#define SSH_KNOWNHOSTS_H_
|
#define KNOWNHOSTS_H_
|
||||||
|
|
||||||
struct ssh_list *ssh_known_hosts_get_algorithms(ssh_session session);
|
char **ssh_knownhosts_algorithms(ssh_session session);
|
||||||
|
|
||||||
#endif /* SSH_KNOWNHOSTS_H_ */
|
#endif /* KNOWNHOSTS_H_ */
|
||||||
|
|||||||
@@ -30,13 +30,15 @@
|
|||||||
#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 EVP_MD_CTX* SHACTX;
|
typedef SHA_CTX* SHACTX;
|
||||||
typedef EVP_MD_CTX* SHA256CTX;
|
typedef SHA256_CTX* SHA256CTX;
|
||||||
typedef EVP_MD_CTX* SHA384CTX;
|
typedef SHA512_CTX* SHA384CTX;
|
||||||
typedef EVP_MD_CTX* SHA512CTX;
|
typedef SHA512_CTX* SHA512CTX;
|
||||||
typedef EVP_MD_CTX* MD5CTX;
|
typedef MD5_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;
|
||||||
@@ -67,18 +69,13 @@ 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_safe_free(num) do { \
|
#define bignum_free(num) BN_clear_free(num)
|
||||||
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) BN_rand(rnd, bits, 0, 1)
|
#define bignum_rand(rnd, bits, top, bottom) BN_rand(rnd,bits,top,bottom)
|
||||||
#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)
|
||||||
@@ -88,6 +85,20 @@ 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 gcry_md_hd_t EVPCTX;
|
typedef void *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,26 +51,16 @@ typedef gcry_md_hd_t 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 ssh_gcry_dec2bn(bignum *bn, const char *data);
|
int my_gcry_dec2bn(bignum *bn, const char *data);
|
||||||
char *ssh_gcry_bn2dec(bignum bn);
|
char *my_gcry_bn2dec(bignum bn);
|
||||||
|
|
||||||
#define bignum_new() gcry_mpi_new(0)
|
#define bignum_new() gcry_mpi_new(0)
|
||||||
#define bignum_safe_free(num) do { \
|
#define bignum_free(num) gcry_mpi_release(num)
|
||||||
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) ssh_gcry_bn2dec(num)
|
#define bignum_bn2dec(num) my_gcry_bn2dec(num)
|
||||||
#define bignum_dec2bn(num, data) ssh_gcry_dec2bn(data, num)
|
#define bignum_dec2bn(num, data) my_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)
|
||||||
@@ -81,16 +71,8 @@ char *ssh_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_ */
|
||||||
|
|||||||
@@ -1,112 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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_ */
|
|
||||||
@@ -78,8 +78,8 @@
|
|||||||
|
|
||||||
/* libssh version */
|
/* libssh version */
|
||||||
#define LIBSSH_VERSION_MAJOR 0
|
#define LIBSSH_VERSION_MAJOR 0
|
||||||
#define LIBSSH_VERSION_MINOR 8
|
#define LIBSSH_VERSION_MINOR 7
|
||||||
#define LIBSSH_VERSION_MICRO 3
|
#define LIBSSH_VERSION_MICRO 6
|
||||||
|
|
||||||
#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, \
|
||||||
@@ -123,7 +123,6 @@ 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 */
|
||||||
@@ -190,8 +189,7 @@ 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 {
|
||||||
@@ -209,7 +207,6 @@ 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 {
|
||||||
@@ -238,43 +235,6 @@ 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
|
||||||
@@ -294,9 +254,7 @@ 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 {
|
||||||
@@ -304,16 +262,6 @@ 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 */
|
||||||
@@ -398,13 +346,6 @@ 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 {
|
||||||
@@ -428,15 +369,6 @@ 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);
|
||||||
@@ -466,12 +398,10 @@ 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);
|
||||||
@@ -479,26 +409,11 @@ 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);
|
||||||
@@ -525,7 +440,7 @@ 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_server_publickey(ssh_session session, ssh_key *key);
|
LIBSSH_API int ssh_get_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,
|
||||||
@@ -542,7 +457,6 @@ 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);
|
||||||
@@ -554,29 +468,6 @@ 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);
|
||||||
@@ -647,11 +538,6 @@ 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,
|
||||||
@@ -663,21 +549,12 @@ 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,
|
||||||
@@ -759,22 +636,17 @@ 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,
|
||||||
@@ -787,11 +659,9 @@ 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);
|
||||||
@@ -801,16 +671,6 @@ 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
|
||||||
@@ -819,3 +679,4 @@ LIBSSH_API uint32_t ssh_buffer_get_len(ssh_buffer buffer);
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* _LIBSSH_H */
|
#endif /* _LIBSSH_H */
|
||||||
|
/* vim: set ts=2 sw=2 et cindent: */
|
||||||
|
|||||||
@@ -194,62 +194,6 @@ 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
|
||||||
@@ -284,7 +228,8 @@ 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.
|
||||||
@@ -335,12 +280,9 @@ 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 ret= std::string(banner);
|
||||||
if (banner != NULL) {
|
::free(banner);
|
||||||
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
|
||||||
@@ -361,12 +303,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_session_update_known_hosts
|
* @see ssh_is_server_known
|
||||||
*/
|
*/
|
||||||
int isServerKnown(){
|
int isServerKnown(){
|
||||||
int state = ssh_session_is_known_server(c_session);
|
int ret=ssh_is_server_known(c_session);
|
||||||
ssh_throw(state);
|
ssh_throw(ret);
|
||||||
return state;
|
return ret;
|
||||||
}
|
}
|
||||||
void log(int priority, const char *format, ...){
|
void log(int priority, const char *format, ...){
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
@@ -436,14 +378,11 @@ 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 &);
|
||||||
@@ -456,9 +395,9 @@ private:
|
|||||||
class Channel {
|
class Channel {
|
||||||
friend class Session;
|
friend class Session;
|
||||||
public:
|
public:
|
||||||
Channel(Session &ssh_session){
|
Channel(Session &session){
|
||||||
channel = ssh_channel_new(ssh_session.getCSession());
|
channel=ssh_channel_new(session.getCSession());
|
||||||
this->session = &ssh_session;
|
this->session=&session;
|
||||||
}
|
}
|
||||||
~Channel(){
|
~Channel(){
|
||||||
ssh_channel_free(channel);
|
ssh_channel_free(channel);
|
||||||
@@ -542,12 +481,12 @@ public:
|
|||||||
ssh_throw(err);
|
ssh_throw(err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
int read(void *dest, size_t count){
|
int read(void *dest, size_t count, bool is_stderr){
|
||||||
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,false,-1);
|
err=ssh_channel_read_timeout(channel,dest,count,is_stderr,-1);
|
||||||
ssh_throw(err);
|
ssh_throw(err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -645,24 +584,16 @@ 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){
|
||||||
ssh_channel getCChannel() {
|
this->channel=c_channel;
|
||||||
return channel;
|
this->session=&session;
|
||||||
}
|
}
|
||||||
|
|
||||||
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,7 +29,7 @@ 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 ssh_analyze_banner(ssh_session session, int server, int *ssh1, int *ssh2);
|
||||||
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);
|
||||||
|
|
||||||
@@ -54,7 +54,6 @@ 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);
|
||||||
|
|||||||
@@ -22,9 +22,7 @@
|
|||||||
#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 ssh_options_set_algo(ssh_session session, int algo, const char *list);
|
||||||
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,7 +43,24 @@ enum ssh_packet_state_e {
|
|||||||
PACKET_STATE_PROCESSING
|
PACKET_STATE_PROCESSING
|
||||||
};
|
};
|
||||||
|
|
||||||
int ssh_packet_send(ssh_session session);
|
enum ssh_packet_filter_result_e {
|
||||||
|
SSH_PACKET_UNKNOWN,
|
||||||
|
SSH_PACKET_ALLOWED,
|
||||||
|
SSH_PACKET_DENIED
|
||||||
|
};
|
||||||
|
|
||||||
|
int packet_send(ssh_session session);
|
||||||
|
|
||||||
|
#ifdef WITH_SSH1
|
||||||
|
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);
|
||||||
@@ -51,7 +68,6 @@ 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);
|
||||||
@@ -68,13 +84,12 @@ 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 ssh_packet_decrypt_len(ssh_session session, uint8_t *destination, uint8_t *source);
|
uint32_t packet_decrypt_len(ssh_session session, char *crypted);
|
||||||
int ssh_packet_decrypt(ssh_session session, uint8_t *destination, uint8_t *source,
|
int packet_decrypt(ssh_session session, void *packet, unsigned int len);
|
||||||
size_t start, size_t encrypted_size);
|
unsigned char *packet_encrypt(ssh_session session,
|
||||||
unsigned char *ssh_packet_encrypt(ssh_session session,
|
void *packet,
|
||||||
void *packet,
|
unsigned int len);
|
||||||
unsigned int len);
|
int packet_hmac_verify(ssh_session session,ssh_buffer buffer,
|
||||||
int ssh_packet_hmac_verify(ssh_session session,ssh_buffer buffer,
|
unsigned char *mac, enum ssh_hmac_e type);
|
||||||
unsigned char *mac, enum ssh_hmac_e type);
|
|
||||||
|
|
||||||
#endif /* PACKET_H_ */
|
#endif /* PACKET_H_ */
|
||||||
|
|||||||
@@ -43,3 +43,4 @@ 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: */
|
||||||
|
|||||||
@@ -47,11 +47,7 @@ struct ssh_key_struct {
|
|||||||
#ifdef HAVE_LIBGCRYPT
|
#ifdef HAVE_LIBGCRYPT
|
||||||
gcry_sexp_t dsa;
|
gcry_sexp_t dsa;
|
||||||
gcry_sexp_t rsa;
|
gcry_sexp_t rsa;
|
||||||
gcry_sexp_t ecdsa;
|
void *ecdsa;
|
||||||
#elif HAVE_LIBMBEDCRYPTO
|
|
||||||
mbedtls_pk_context *rsa;
|
|
||||||
mbedtls_ecdsa_context *ecdsa;
|
|
||||||
void *dsa;
|
|
||||||
#elif HAVE_LIBCRYPTO
|
#elif HAVE_LIBCRYPTO
|
||||||
DSA *dsa;
|
DSA *dsa;
|
||||||
RSA *rsa;
|
RSA *rsa;
|
||||||
@@ -64,17 +60,15 @@ struct ssh_key_struct {
|
|||||||
ed25519_pubkey *ed25519_pubkey;
|
ed25519_pubkey *ed25519_pubkey;
|
||||||
ed25519_privkey *ed25519_privkey;
|
ed25519_privkey *ed25519_privkey;
|
||||||
void *cert;
|
void *cert;
|
||||||
enum ssh_keytypes_e cert_type;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ssh_signature_struct {
|
struct ssh_signature_struct {
|
||||||
enum ssh_keytypes_e type;
|
enum ssh_keytypes_e type;
|
||||||
enum ssh_digest_e hash_type;
|
|
||||||
const char *type_c;
|
const char *type_c;
|
||||||
#ifdef HAVE_LIBGCRYPT
|
#ifdef HAVE_LIBGCRYPT
|
||||||
gcry_sexp_t dsa_sig;
|
gcry_sexp_t dsa_sig;
|
||||||
gcry_sexp_t rsa_sig;
|
gcry_sexp_t rsa_sig;
|
||||||
gcry_sexp_t ecdsa_sig;
|
void *ecdsa_sig;
|
||||||
#elif defined HAVE_LIBCRYPTO
|
#elif defined HAVE_LIBCRYPTO
|
||||||
DSA_SIG *dsa_sig;
|
DSA_SIG *dsa_sig;
|
||||||
ssh_string rsa_sig;
|
ssh_string rsa_sig;
|
||||||
@@ -83,9 +77,6 @@ struct ssh_signature_struct {
|
|||||||
# else
|
# else
|
||||||
void *ecdsa_sig;
|
void *ecdsa_sig;
|
||||||
# endif
|
# endif
|
||||||
#elif defined HAVE_LIBMBEDCRYPTO
|
|
||||||
ssh_string rsa_sig;
|
|
||||||
struct mbedtls_ecdsa_sig ecdsa_sig;
|
|
||||||
#endif
|
#endif
|
||||||
ed25519_signature *ed25519_sig;
|
ed25519_signature *ed25519_sig;
|
||||||
};
|
};
|
||||||
@@ -96,11 +87,6 @@ typedef struct ssh_signature_struct *ssh_signature;
|
|||||||
ssh_key ssh_key_dup(const ssh_key key);
|
ssh_key ssh_key_dup(const ssh_key key);
|
||||||
void ssh_key_clean (ssh_key key);
|
void ssh_key_clean (ssh_key key);
|
||||||
|
|
||||||
const char *
|
|
||||||
ssh_key_get_signature_algorithm(ssh_session session,
|
|
||||||
enum ssh_keytypes_e type);
|
|
||||||
enum ssh_keytypes_e ssh_key_type_from_signature_name(const char *name);
|
|
||||||
|
|
||||||
/* SSH Signature Functions */
|
/* SSH Signature Functions */
|
||||||
ssh_signature ssh_signature_new(void);
|
ssh_signature ssh_signature_new(void);
|
||||||
void ssh_signature_free(ssh_signature sign);
|
void ssh_signature_free(ssh_signature sign);
|
||||||
@@ -121,10 +107,10 @@ int ssh_pki_export_pubkey_blob(const ssh_key key,
|
|||||||
ssh_string *pblob);
|
ssh_string *pblob);
|
||||||
int ssh_pki_import_pubkey_blob(const ssh_string key_blob,
|
int ssh_pki_import_pubkey_blob(const ssh_string key_blob,
|
||||||
ssh_key *pkey);
|
ssh_key *pkey);
|
||||||
|
int ssh_pki_export_pubkey_rsa1(const ssh_key key,
|
||||||
int ssh_pki_import_cert_blob(const ssh_string cert_blob,
|
const char *host,
|
||||||
ssh_key *pkey);
|
char *rsa1,
|
||||||
|
size_t rsa1_len);
|
||||||
|
|
||||||
/* SSH Signing Functions */
|
/* SSH Signing Functions */
|
||||||
ssh_string ssh_pki_do_sign(ssh_session session, ssh_buffer sigbuf,
|
ssh_string ssh_pki_do_sign(ssh_session session, ssh_buffer sigbuf,
|
||||||
@@ -139,5 +125,4 @@ ssh_string ssh_srv_pki_do_sign_sessionid(ssh_session session,
|
|||||||
ssh_public_key ssh_pki_convert_key_to_publickey(const ssh_key key);
|
ssh_public_key ssh_pki_convert_key_to_publickey(const ssh_key key);
|
||||||
ssh_private_key ssh_pki_convert_key_to_privatekey(const ssh_key key);
|
ssh_private_key ssh_pki_convert_key_to_privatekey(const ssh_key key);
|
||||||
|
|
||||||
int ssh_key_algorithm_allowed(ssh_session session, const char *type);
|
|
||||||
#endif /* PKI_H_ */
|
#endif /* PKI_H_ */
|
||||||
|
|||||||
@@ -43,12 +43,13 @@ int bcrypt_pbkdf(const char *pass,
|
|||||||
/* Magic defined in OpenSSH/PROTOCOL.key */
|
/* Magic defined in OpenSSH/PROTOCOL.key */
|
||||||
#define OPENSSH_AUTH_MAGIC "openssh-key-v1"
|
#define OPENSSH_AUTH_MAGIC "openssh-key-v1"
|
||||||
|
|
||||||
|
#define ssh_pki_log(...) \
|
||||||
|
_ssh_log(SSH_LOG_FUNCTIONS, __func__, __VA_ARGS__)
|
||||||
|
void _ssh_pki_log(const char *function,
|
||||||
|
const char *format, ...) PRINTF_ATTRIBUTE(2, 3);
|
||||||
|
|
||||||
int pki_key_ecdsa_nid_from_name(const char *name);
|
int pki_key_ecdsa_nid_from_name(const char *name);
|
||||||
const char *pki_key_ecdsa_nid_to_name(int nid);
|
const char *pki_key_ecdsa_nid_to_name(int nid);
|
||||||
const char *ssh_key_signature_to_char(enum ssh_keytypes_e type,
|
|
||||||
enum ssh_digest_e hash_type);
|
|
||||||
enum ssh_digest_e ssh_key_type_to_hash(ssh_session session,
|
|
||||||
enum ssh_keytypes_e type);
|
|
||||||
|
|
||||||
/* SSH Key Functions */
|
/* SSH Key Functions */
|
||||||
ssh_key pki_key_dup(const ssh_key key, int demote);
|
ssh_key pki_key_dup(const ssh_key key, int demote);
|
||||||
@@ -72,9 +73,6 @@ ssh_string pki_private_key_to_pem(const ssh_key key,
|
|||||||
const char *passphrase,
|
const char *passphrase,
|
||||||
ssh_auth_callback auth_fn,
|
ssh_auth_callback auth_fn,
|
||||||
void *auth_data);
|
void *auth_data);
|
||||||
int pki_import_privkey_buffer(enum ssh_keytypes_e type,
|
|
||||||
ssh_buffer buffer,
|
|
||||||
ssh_key *pkey);
|
|
||||||
|
|
||||||
/* SSH Public Key Functions */
|
/* SSH Public Key Functions */
|
||||||
int pki_pubkey_build_dss(ssh_key key,
|
int pki_pubkey_build_dss(ssh_key key,
|
||||||
@@ -87,33 +85,16 @@ int pki_pubkey_build_rsa(ssh_key key,
|
|||||||
ssh_string n);
|
ssh_string n);
|
||||||
int pki_pubkey_build_ecdsa(ssh_key key, int nid, ssh_string e);
|
int pki_pubkey_build_ecdsa(ssh_key key, int nid, ssh_string e);
|
||||||
ssh_string pki_publickey_to_blob(const ssh_key key);
|
ssh_string pki_publickey_to_blob(const ssh_key key);
|
||||||
|
int pki_export_pubkey_rsa1(const ssh_key key,
|
||||||
/* SSH Private Key Functions */
|
const char *host,
|
||||||
int pki_privkey_build_dss(ssh_key key,
|
char *rsa1,
|
||||||
ssh_string p,
|
size_t rsa1_len);
|
||||||
ssh_string q,
|
|
||||||
ssh_string g,
|
|
||||||
ssh_string pubkey,
|
|
||||||
ssh_string privkey);
|
|
||||||
int pki_privkey_build_rsa(ssh_key key,
|
|
||||||
ssh_string n,
|
|
||||||
ssh_string e,
|
|
||||||
ssh_string d,
|
|
||||||
ssh_string iqmp,
|
|
||||||
ssh_string p,
|
|
||||||
ssh_string q);
|
|
||||||
int pki_privkey_build_ecdsa(ssh_key key,
|
|
||||||
int nid,
|
|
||||||
ssh_string e,
|
|
||||||
ssh_string exp);
|
|
||||||
ssh_string pki_publickey_to_blob(const ssh_key key);
|
|
||||||
|
|
||||||
/* SSH Signature Functions */
|
/* SSH Signature Functions */
|
||||||
ssh_string pki_signature_to_blob(const ssh_signature sign);
|
ssh_string pki_signature_to_blob(const ssh_signature sign);
|
||||||
ssh_signature pki_signature_from_blob(const ssh_key pubkey,
|
ssh_signature pki_signature_from_blob(const ssh_key pubkey,
|
||||||
const ssh_string sig_blob,
|
const ssh_string sig_blob,
|
||||||
enum ssh_keytypes_e type,
|
enum ssh_keytypes_e type);
|
||||||
enum ssh_digest_e hash_type);
|
|
||||||
int pki_signature_verify(ssh_session session,
|
int pki_signature_verify(ssh_session session,
|
||||||
const ssh_signature sig,
|
const ssh_signature sig,
|
||||||
const ssh_key key,
|
const ssh_key key,
|
||||||
@@ -121,18 +102,12 @@ int pki_signature_verify(ssh_session session,
|
|||||||
size_t hlen);
|
size_t hlen);
|
||||||
|
|
||||||
/* SSH Signing Functions */
|
/* SSH Signing Functions */
|
||||||
#define pki_do_sign(key, hash, hlen) \
|
ssh_signature pki_do_sign(const ssh_key privkey,
|
||||||
pki_do_sign_hash(key, hash, hlen, SSH_DIGEST_AUTO)
|
const unsigned char *hash,
|
||||||
ssh_signature pki_do_sign_hash(const ssh_key privkey,
|
size_t hlen);
|
||||||
const unsigned char *hash,
|
ssh_signature pki_do_sign_sessionid(const ssh_key key,
|
||||||
size_t hlen,
|
const unsigned char *hash,
|
||||||
enum ssh_digest_e hash_type);
|
size_t hlen);
|
||||||
#define pki_do_sign_sessionid(key, hash, hlen) \
|
|
||||||
pki_do_sign_sessionid_hash(key, hash, hlen, SSH_DIGEST_AUTO)
|
|
||||||
ssh_signature pki_do_sign_sessionid_hash(const ssh_key key,
|
|
||||||
const unsigned char *hash,
|
|
||||||
size_t hlen,
|
|
||||||
enum ssh_digest_e hash_type);
|
|
||||||
int pki_ed25519_sign(const ssh_key privkey, ssh_signature sig,
|
int pki_ed25519_sign(const ssh_key privkey, ssh_signature sig,
|
||||||
const unsigned char *hash, size_t hlen);
|
const unsigned char *hash, size_t hlen);
|
||||||
int pki_ed25519_verify(const ssh_key pubkey, ssh_signature sig,
|
int pki_ed25519_verify(const ssh_key pubkey, ssh_signature sig,
|
||||||
@@ -144,12 +119,8 @@ int pki_ed25519_key_dup(ssh_key new, const ssh_key key);
|
|||||||
int pki_ed25519_public_key_to_blob(ssh_buffer buffer, ssh_key key);
|
int pki_ed25519_public_key_to_blob(ssh_buffer buffer, ssh_key key);
|
||||||
ssh_string pki_ed25519_sig_to_blob(ssh_signature sig);
|
ssh_string pki_ed25519_sig_to_blob(ssh_signature sig);
|
||||||
int pki_ed25519_sig_from_blob(ssh_signature sig, ssh_string sig_blob);
|
int pki_ed25519_sig_from_blob(ssh_signature sig, ssh_string sig_blob);
|
||||||
int pki_privkey_build_ed25519(ssh_key key,
|
|
||||||
ssh_string pubkey,
|
|
||||||
ssh_string privkey);
|
|
||||||
|
|
||||||
/* PKI Container OpenSSH */
|
/* PKI Container OpenSSH */
|
||||||
ssh_key ssh_pki_openssh_pubkey_import(const char *text_key);
|
|
||||||
ssh_key ssh_pki_openssh_privkey_import(const char *text_key,
|
ssh_key ssh_pki_openssh_privkey_import(const char *text_key,
|
||||||
const char *passphrase, ssh_auth_callback auth_fn, void *auth_data);
|
const char *passphrase, ssh_auth_callback auth_fn, void *auth_data);
|
||||||
ssh_string ssh_pki_openssh_privkey_export(const ssh_key privkey,
|
ssh_string ssh_pki_openssh_privkey_export(const ssh_key privkey,
|
||||||
|
|||||||
@@ -155,7 +155,5 @@ int ssh_poll_ctx_add_socket (ssh_poll_ctx ctx, struct ssh_socket_struct *s);
|
|||||||
void ssh_poll_ctx_remove(ssh_poll_ctx ctx, ssh_poll_handle p);
|
void ssh_poll_ctx_remove(ssh_poll_ctx ctx, ssh_poll_handle p);
|
||||||
int ssh_poll_ctx_dopoll(ssh_poll_ctx ctx, int timeout);
|
int ssh_poll_ctx_dopoll(ssh_poll_ctx ctx, int timeout);
|
||||||
ssh_poll_ctx ssh_poll_get_default_ctx(ssh_session session);
|
ssh_poll_ctx ssh_poll_get_default_ctx(ssh_session session);
|
||||||
int ssh_event_add_poll(ssh_event event, ssh_poll_handle p);
|
|
||||||
void ssh_event_remove_poll(ssh_event event, ssh_poll_handle p);
|
|
||||||
|
|
||||||
#endif /* POLL_H_ */
|
#endif /* POLL_H_ */
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
/*
|
|
||||||
* Public Domain poly1305 from Andrew Moon
|
|
||||||
* poly1305-donna-unrolled.c from https://github.com/floodyberry/poly1305-donna
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef POLY1305_H
|
|
||||||
#define POLY1305_H
|
|
||||||
|
|
||||||
#define POLY1305_KEYLEN 32
|
|
||||||
#define POLY1305_TAGLEN 16
|
|
||||||
|
|
||||||
void poly1305_auth(uint8_t out[POLY1305_TAGLEN], const uint8_t *m, size_t inlen,
|
|
||||||
const uint8_t key[POLY1305_KEYLEN])
|
|
||||||
#ifdef HAVE_GCC_BOUNDED_ATTRIBUTE
|
|
||||||
__attribute__((__bounded__(__minbytes__, 1, POLY1305_TAGLEN)))
|
|
||||||
__attribute__((__bounded__(__buffer__, 2, 3)))
|
|
||||||
__attribute__((__bounded__(__minbytes__, 4, POLY1305_KEYLEN)))
|
|
||||||
#endif
|
|
||||||
;
|
|
||||||
|
|
||||||
#endif /* POLY1305_H */
|
|
||||||
@@ -29,8 +29,7 @@
|
|||||||
#ifndef _LIBSSH_PRIV_H
|
#ifndef _LIBSSH_PRIV_H
|
||||||
#define _LIBSSH_PRIV_H
|
#define _LIBSSH_PRIV_H
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include "config.h"
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#if !defined(HAVE_STRTOULL)
|
#if !defined(HAVE_STRTOULL)
|
||||||
# if defined(HAVE___STRTOULL)
|
# if defined(HAVE___STRTOULL)
|
||||||
@@ -44,18 +43,10 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif /* !defined(HAVE_STRTOULL) */
|
#endif /* !defined(HAVE_STRTOULL) */
|
||||||
|
|
||||||
#if !defined(HAVE_STRNDUP)
|
|
||||||
char *strndup(const char *s, size_t n);
|
|
||||||
#endif /* ! HAVE_STRNDUP */
|
|
||||||
|
|
||||||
#ifdef HAVE_BYTESWAP_H
|
#ifdef HAVE_BYTESWAP_H
|
||||||
#include <byteswap.h>
|
#include <byteswap.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_ARPA_INET_H
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef bswap_32
|
#ifndef bswap_32
|
||||||
#define bswap_32(x) \
|
#define bswap_32(x) \
|
||||||
((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
|
((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
|
||||||
@@ -154,11 +145,12 @@ int gettimeofday(struct timeval *__p, void *__t);
|
|||||||
#ifndef ERROR_BUFFERLEN
|
#ifndef ERROR_BUFFERLEN
|
||||||
#define ERROR_BUFFERLEN 1024
|
#define ERROR_BUFFERLEN 1024
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef CLIENTBANNER1
|
||||||
#ifndef CLIENT_BANNER_SSH2
|
#define CLIENTBANNER1 "SSH-1.5-libssh_" SSH_STRINGIFY(LIBSSH_VERSION)
|
||||||
#define CLIENT_BANNER_SSH2 "SSH-2.0-libssh_" SSH_STRINGIFY(LIBSSH_VERSION)
|
#endif
|
||||||
#endif /* CLIENT_BANNER_SSH2 */
|
#ifndef CLIENTBANNER2
|
||||||
|
#define CLIENTBANNER2 "SSH-2.0-libssh_" SSH_STRINGIFY(LIBSSH_VERSION)
|
||||||
|
#endif
|
||||||
#ifndef KBDINT_MAX_PROMPT
|
#ifndef KBDINT_MAX_PROMPT
|
||||||
#define KBDINT_MAX_PROMPT 256 /* more than openssh's :) */
|
#define KBDINT_MAX_PROMPT 256 /* more than openssh's :) */
|
||||||
#endif
|
#endif
|
||||||
@@ -193,6 +185,10 @@ int gettimeofday(struct timeval *__p, void *__t);
|
|||||||
# define LIBSSH_MEM_PROTECTION
|
# define LIBSSH_MEM_PROTECTION
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/* forward declarations */
|
/* forward declarations */
|
||||||
struct ssh_common_struct;
|
struct ssh_common_struct;
|
||||||
struct ssh_kex_struct;
|
struct ssh_kex_struct;
|
||||||
@@ -236,7 +232,6 @@ void _ssh_set_error_oom(void *error, const char *function);
|
|||||||
_ssh_set_error_invalid(error, __func__)
|
_ssh_set_error_invalid(error, __func__)
|
||||||
void _ssh_set_error_invalid(void *error, const char *function);
|
void _ssh_set_error_invalid(void *error, const char *function);
|
||||||
|
|
||||||
void ssh_reset_error(void *error);
|
|
||||||
|
|
||||||
/* server.c */
|
/* server.c */
|
||||||
#ifdef WITH_SERVER
|
#ifdef WITH_SERVER
|
||||||
@@ -262,22 +257,12 @@ int compress_buffer(ssh_session session,ssh_buffer buf);
|
|||||||
int decompress_buffer(ssh_session session,ssh_buffer buf, size_t maxlen);
|
int decompress_buffer(ssh_session session,ssh_buffer buf, size_t maxlen);
|
||||||
|
|
||||||
/* match.c */
|
/* match.c */
|
||||||
int match_pattern_list(const char *string, const char *pattern,
|
|
||||||
unsigned int len, int dolower);
|
|
||||||
int match_hostname(const char *host, const char *pattern, unsigned int len);
|
int match_hostname(const char *host, const char *pattern, unsigned int len);
|
||||||
|
|
||||||
/* connector.c */
|
|
||||||
int ssh_connector_set_event(ssh_connector connector, ssh_event event);
|
|
||||||
int ssh_connector_remove_event(ssh_connector connector);
|
|
||||||
|
|
||||||
#ifndef MIN
|
#ifndef MIN
|
||||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MAX
|
|
||||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Free memory space */
|
/** Free memory space */
|
||||||
#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0)
|
#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0)
|
||||||
|
|
||||||
@@ -290,9 +275,33 @@ int ssh_connector_remove_event(ssh_connector connector);
|
|||||||
/** Get the size of an array */
|
/** Get the size of an array */
|
||||||
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
|
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
|
||||||
|
|
||||||
#ifndef HAVE_EXPLICIT_BZERO
|
/*
|
||||||
void explicit_bzero(void *s, size_t n);
|
* See http://llvm.org/bugs/show_bug.cgi?id=15495
|
||||||
#endif /* !HAVE_EXPLICIT_BZERO */
|
*/
|
||||||
|
#if defined(HAVE_GCC_VOLATILE_MEMORY_PROTECTION)
|
||||||
|
/** Overwrite a string with '\0' */
|
||||||
|
# define BURN_STRING(x) do { \
|
||||||
|
if ((x) != NULL) \
|
||||||
|
memset((x), '\0', strlen((x))); __asm__ volatile("" : : "r"(&(x)) : "memory"); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/** Overwrite the buffer with '\0' */
|
||||||
|
# define BURN_BUFFER(x, size) do { \
|
||||||
|
if ((x) != NULL) \
|
||||||
|
memset((x), '\0', (size)); __asm__ volatile("" : : "r"(&(x)) : "memory"); \
|
||||||
|
} while(0)
|
||||||
|
#else /* HAVE_GCC_VOLATILE_MEMORY_PROTECTION */
|
||||||
|
/** Overwrite a string with '\0' */
|
||||||
|
# define BURN_STRING(x) do { \
|
||||||
|
if ((x) != NULL) memset((x), '\0', strlen((x))); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/** Overwrite the buffer with '\0' */
|
||||||
|
# define BURN_BUFFER(x, size) do { \
|
||||||
|
if ((x) != NULL) \
|
||||||
|
memset((x), '\0', (size)); \
|
||||||
|
} while(0)
|
||||||
|
#endif /* HAVE_GCC_VOLATILE_MEMORY_PROTECTION */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a hack to fix warnings. The idea is to use this everywhere that we
|
* This is a hack to fix warnings. The idea is to use this everywhere that we
|
||||||
@@ -370,14 +379,7 @@ void explicit_bzero(void *s, size_t n);
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef FALL_THROUGH
|
|
||||||
# ifdef HAVE_FALLTHROUGH_ATTRIBUTE
|
|
||||||
# define FALL_THROUGH __attribute__ ((fallthrough))
|
|
||||||
# else /* HAVE_FALLTHROUGH_ATTRIBUTE */
|
|
||||||
# define FALL_THROUGH
|
|
||||||
# endif /* HAVE_FALLTHROUGH_ATTRIBUTE */
|
|
||||||
#endif /* FALL_THROUGH */
|
|
||||||
|
|
||||||
void ssh_agent_state_free(void *data);
|
void ssh_agent_state_free(void *data);
|
||||||
|
|
||||||
#endif /* _LIBSSH_PRIV_H */
|
#endif /* _LIBSSH_PRIV_H */
|
||||||
|
/* vim: set ts=4 sw=4 et cindent: */
|
||||||
|
|||||||
@@ -45,8 +45,7 @@ enum ssh_bind_options_e {
|
|||||||
SSH_BIND_OPTIONS_BANNER,
|
SSH_BIND_OPTIONS_BANNER,
|
||||||
SSH_BIND_OPTIONS_LOG_VERBOSITY,
|
SSH_BIND_OPTIONS_LOG_VERBOSITY,
|
||||||
SSH_BIND_OPTIONS_LOG_VERBOSITY_STR,
|
SSH_BIND_OPTIONS_LOG_VERBOSITY_STR,
|
||||||
SSH_BIND_OPTIONS_ECDSAKEY,
|
SSH_BIND_OPTIONS_ECDSAKEY
|
||||||
SSH_BIND_OPTIONS_IMPORT_KEY
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct ssh_bind_struct* ssh_bind;
|
typedef struct ssh_bind_struct* ssh_bind;
|
||||||
@@ -187,24 +186,6 @@ LIBSSH_API ssh_gssapi_creds ssh_gssapi_get_creds(ssh_session session);
|
|||||||
*/
|
*/
|
||||||
LIBSSH_API int ssh_handle_key_exchange(ssh_session session);
|
LIBSSH_API int ssh_handle_key_exchange(ssh_session session);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialize the set of key exchange, hostkey, ciphers, MACs, and
|
|
||||||
* compression algorithms for the given ssh_session.
|
|
||||||
*
|
|
||||||
* The selection of algorithms and keys used are determined by the
|
|
||||||
* options that are currently set in the given ssh_session structure.
|
|
||||||
* May only be called before the initial key exchange has begun.
|
|
||||||
*
|
|
||||||
* @param session The session structure to initialize.
|
|
||||||
*
|
|
||||||
* @see ssh_handle_key_exchange
|
|
||||||
* @see ssh_options_set
|
|
||||||
*
|
|
||||||
* @return SSH_OK if initialization succeeds.
|
|
||||||
*/
|
|
||||||
|
|
||||||
LIBSSH_API int ssh_server_init_kex(ssh_session session);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Free a ssh servers bind.
|
* @brief Free a ssh servers bind.
|
||||||
*
|
*
|
||||||
@@ -212,23 +193,6 @@ LIBSSH_API int ssh_server_init_kex(ssh_session session);
|
|||||||
*/
|
*/
|
||||||
LIBSSH_API void ssh_bind_free(ssh_bind ssh_bind_o);
|
LIBSSH_API void ssh_bind_free(ssh_bind ssh_bind_o);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set the acceptable authentication methods to be sent to the client.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param[in] session The server session
|
|
||||||
*
|
|
||||||
* @param[in] auth_methods The authentication methods we will support, which
|
|
||||||
* can be bitwise-or'd.
|
|
||||||
*
|
|
||||||
* Supported methods are:
|
|
||||||
*
|
|
||||||
* SSH_AUTH_METHOD_PASSWORD
|
|
||||||
* SSH_AUTH_METHOD_PUBLICKEY
|
|
||||||
* SSH_AUTH_METHOD_HOSTBASED
|
|
||||||
* SSH_AUTH_METHOD_INTERACTIVE
|
|
||||||
* SSH_AUTH_METHOD_GSSAPI_MIC
|
|
||||||
*/
|
|
||||||
LIBSSH_API void ssh_set_auth_methods(ssh_session session, int auth_methods);
|
LIBSSH_API void ssh_set_auth_methods(ssh_session session, int auth_methods);
|
||||||
|
|
||||||
/**********************************************************
|
/**********************************************************
|
||||||
@@ -352,6 +316,9 @@ LIBSSH_API int ssh_channel_request_send_exit_signal(ssh_channel channel,
|
|||||||
int core,
|
int core,
|
||||||
const char *errmsg,
|
const char *errmsg,
|
||||||
const char *lang);
|
const char *lang);
|
||||||
|
LIBSSH_API int ssh_channel_write_stderr(ssh_channel channel,
|
||||||
|
const void *data,
|
||||||
|
uint32_t len);
|
||||||
|
|
||||||
LIBSSH_API int ssh_send_keepalive(ssh_session session);
|
LIBSSH_API int ssh_send_keepalive(ssh_session session);
|
||||||
|
|
||||||
|
|||||||
@@ -79,19 +79,6 @@ enum ssh_pending_call_e {
|
|||||||
/* Don't block at all */
|
/* Don't block at all */
|
||||||
#define SSH_TIMEOUT_NONBLOCKING 0
|
#define SSH_TIMEOUT_NONBLOCKING 0
|
||||||
|
|
||||||
/* options flags */
|
|
||||||
/* Authentication with *** allowed */
|
|
||||||
#define SSH_OPT_FLAG_PASSWORD_AUTH 0x1
|
|
||||||
#define SSH_OPT_FLAG_PUBKEY_AUTH 0x2
|
|
||||||
#define SSH_OPT_FLAG_KBDINT_AUTH 0x4
|
|
||||||
#define SSH_OPT_FLAG_GSSAPI_AUTH 0x8
|
|
||||||
|
|
||||||
/* extensions flags */
|
|
||||||
/* server-sig-algs extension */
|
|
||||||
#define SSH_EXT_SIG_RSA_SHA256 0x01
|
|
||||||
#define SSH_EXT_SIG_RSA_SHA512 0x02
|
|
||||||
#define SSH_EXT_ALL SSH_EXT_SIG_RSA_SHA256 | SSH_EXT_SIG_RSA_SHA512
|
|
||||||
|
|
||||||
/* members that are common to ssh_session and ssh_bind */
|
/* members that are common to ssh_session and ssh_bind */
|
||||||
struct ssh_common_struct {
|
struct ssh_common_struct {
|
||||||
struct error_struct error;
|
struct error_struct error;
|
||||||
@@ -120,9 +107,6 @@ struct ssh_session_struct {
|
|||||||
/* session flags (SSH_SESSION_FLAG_*) */
|
/* session flags (SSH_SESSION_FLAG_*) */
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
/* Extensions negotiated using RFC 8308 */
|
|
||||||
uint32_t extensions;
|
|
||||||
|
|
||||||
ssh_string banner; /* that's the issue banner from
|
ssh_string banner; /* that's the issue banner from
|
||||||
the server */
|
the server */
|
||||||
char *discon_msg; /* disconnect message from
|
char *discon_msg; /* disconnect message from
|
||||||
@@ -137,16 +121,11 @@ struct ssh_session_struct {
|
|||||||
enum ssh_session_state_e session_state;
|
enum ssh_session_state_e session_state;
|
||||||
int packet_state;
|
int packet_state;
|
||||||
enum ssh_dh_state_e dh_handshake_state;
|
enum ssh_dh_state_e dh_handshake_state;
|
||||||
|
enum ssh_auth_service_state_e auth_service_state;
|
||||||
|
enum ssh_auth_state_e auth_state;
|
||||||
enum ssh_channel_request_state_e global_req_state;
|
enum ssh_channel_request_state_e global_req_state;
|
||||||
struct ssh_agent_state_struct *agent_state;
|
struct ssh_agent_state_struct *agent_state;
|
||||||
|
struct ssh_auth_auto_state_struct *auth_auto_state;
|
||||||
struct {
|
|
||||||
struct ssh_auth_auto_state_struct *auto_state;
|
|
||||||
enum ssh_auth_service_state_e service_state;
|
|
||||||
enum ssh_auth_state_e state;
|
|
||||||
uint32_t supported_methods;
|
|
||||||
uint32_t current_method;
|
|
||||||
} auth;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RFC 4253, 7.1: if the first_kex_packet_follows flag was set in
|
* RFC 4253, 7.1: if the first_kex_packet_follows flag was set in
|
||||||
@@ -171,7 +150,7 @@ struct ssh_session_struct {
|
|||||||
/* keyb interactive data */
|
/* keyb interactive data */
|
||||||
struct ssh_kbdint_struct *kbdint;
|
struct ssh_kbdint_struct *kbdint;
|
||||||
struct ssh_gssapi_struct *gssapi;
|
struct ssh_gssapi_struct *gssapi;
|
||||||
|
int version; /* 1 or 2 */
|
||||||
/* server host keys */
|
/* server host keys */
|
||||||
struct {
|
struct {
|
||||||
ssh_key rsa_key;
|
ssh_key rsa_key;
|
||||||
@@ -181,8 +160,8 @@ struct ssh_session_struct {
|
|||||||
/* The type of host key wanted by client */
|
/* The type of host key wanted by client */
|
||||||
enum ssh_keytypes_e hostkey;
|
enum ssh_keytypes_e hostkey;
|
||||||
} srv;
|
} srv;
|
||||||
|
|
||||||
/* auths accepted by server */
|
/* auths accepted by server */
|
||||||
|
int auth_methods;
|
||||||
struct ssh_list *ssh_message_list; /* list of delayed SSH messages */
|
struct ssh_list *ssh_message_list; /* list of delayed SSH messages */
|
||||||
int (*ssh_message_callback)( struct ssh_session_struct *session, ssh_message msg, void *userdata);
|
int (*ssh_message_callback)( struct ssh_session_struct *session, ssh_message msg, void *userdata);
|
||||||
void *ssh_message_callback_data;
|
void *ssh_message_callback_data;
|
||||||
@@ -203,9 +182,7 @@ struct ssh_session_struct {
|
|||||||
char *bindaddr; /* bind the client to an ip addr */
|
char *bindaddr; /* bind the client to an ip addr */
|
||||||
char *sshdir;
|
char *sshdir;
|
||||||
char *knownhosts;
|
char *knownhosts;
|
||||||
char *global_knownhosts;
|
|
||||||
char *wanted_methods[10];
|
char *wanted_methods[10];
|
||||||
char *pubkey_accepted_types;
|
|
||||||
char *ProxyCommand;
|
char *ProxyCommand;
|
||||||
char *custombanner;
|
char *custombanner;
|
||||||
unsigned long timeout; /* seconds */
|
unsigned long timeout; /* seconds */
|
||||||
@@ -213,12 +190,12 @@ struct ssh_session_struct {
|
|||||||
unsigned int port;
|
unsigned int port;
|
||||||
socket_t fd;
|
socket_t fd;
|
||||||
int StrictHostKeyChecking;
|
int StrictHostKeyChecking;
|
||||||
|
int ssh2;
|
||||||
|
int ssh1;
|
||||||
char compressionlevel;
|
char compressionlevel;
|
||||||
char *gss_server_identity;
|
char *gss_server_identity;
|
||||||
char *gss_client_identity;
|
char *gss_client_identity;
|
||||||
int gss_delegate_creds;
|
int gss_delegate_creds;
|
||||||
int flags;
|
|
||||||
int nodelay;
|
|
||||||
} opts;
|
} opts;
|
||||||
/* counters */
|
/* counters */
|
||||||
ssh_counter socket_counter;
|
ssh_counter socket_counter;
|
||||||
|
|||||||
@@ -84,7 +84,6 @@ struct sftp_session_struct {
|
|||||||
int errnum;
|
int errnum;
|
||||||
void **handles;
|
void **handles;
|
||||||
sftp_ext ext;
|
sftp_ext ext;
|
||||||
sftp_packet read_packet;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sftp_packet_struct {
|
struct sftp_packet_struct {
|
||||||
@@ -135,7 +134,6 @@ struct sftp_client_message_struct {
|
|||||||
ssh_string data; /* can be newpath of rename() */
|
ssh_string data; /* can be newpath of rename() */
|
||||||
ssh_buffer complete_message; /* complete message in case of retransmission*/
|
ssh_buffer complete_message; /* complete message in case of retransmission*/
|
||||||
char *str_data; /* cstring version of data */
|
char *str_data; /* cstring version of data */
|
||||||
char *submessage; /* for extended messages */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sftp_request_queue_struct {
|
struct sftp_request_queue_struct {
|
||||||
@@ -790,22 +788,6 @@ LIBSSH_API sftp_statvfs_t sftp_fstatvfs(sftp_file file);
|
|||||||
*/
|
*/
|
||||||
LIBSSH_API void sftp_statvfs_free(sftp_statvfs_t statvfs_o);
|
LIBSSH_API void sftp_statvfs_free(sftp_statvfs_t statvfs_o);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Synchronize a file's in-core state with storage device
|
|
||||||
*
|
|
||||||
* This calls the "fsync@openssh.com" extention. You should check if the
|
|
||||||
* extensions is supported using:
|
|
||||||
*
|
|
||||||
* @code
|
|
||||||
* int supported = sftp_extension_supported(sftp, "fsync@openssh.com", "1");
|
|
||||||
* @endcode
|
|
||||||
*
|
|
||||||
* @param file The opened sftp file handle to sync
|
|
||||||
*
|
|
||||||
* @return 0 on success, < 0 on error with ssh and sftp error set.
|
|
||||||
*/
|
|
||||||
LIBSSH_API int sftp_fsync(sftp_file file);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Canonicalize a sftp path.
|
* @brief Canonicalize a sftp path.
|
||||||
*
|
*
|
||||||
@@ -864,20 +846,19 @@ LIBSSH_API const char *sftp_client_message_get_filename(sftp_client_message msg)
|
|||||||
LIBSSH_API void sftp_client_message_set_filename(sftp_client_message msg, const char *newname);
|
LIBSSH_API void sftp_client_message_set_filename(sftp_client_message msg, const char *newname);
|
||||||
LIBSSH_API const char *sftp_client_message_get_data(sftp_client_message msg);
|
LIBSSH_API const char *sftp_client_message_get_data(sftp_client_message msg);
|
||||||
LIBSSH_API uint32_t sftp_client_message_get_flags(sftp_client_message msg);
|
LIBSSH_API uint32_t sftp_client_message_get_flags(sftp_client_message msg);
|
||||||
LIBSSH_API const char *sftp_client_message_get_submessage(sftp_client_message msg);
|
|
||||||
LIBSSH_API int sftp_send_client_message(sftp_session sftp, sftp_client_message msg);
|
LIBSSH_API int sftp_send_client_message(sftp_session sftp, sftp_client_message msg);
|
||||||
LIBSSH_API int sftp_reply_name(sftp_client_message msg, const char *name,
|
int sftp_reply_name(sftp_client_message msg, const char *name,
|
||||||
sftp_attributes attr);
|
sftp_attributes attr);
|
||||||
LIBSSH_API int sftp_reply_handle(sftp_client_message msg, ssh_string handle);
|
int sftp_reply_handle(sftp_client_message msg, ssh_string handle);
|
||||||
LIBSSH_API ssh_string sftp_handle_alloc(sftp_session sftp, void *info);
|
ssh_string sftp_handle_alloc(sftp_session sftp, void *info);
|
||||||
LIBSSH_API int sftp_reply_attr(sftp_client_message msg, sftp_attributes attr);
|
int sftp_reply_attr(sftp_client_message msg, sftp_attributes attr);
|
||||||
LIBSSH_API void *sftp_handle(sftp_session sftp, ssh_string handle);
|
void *sftp_handle(sftp_session sftp, ssh_string handle);
|
||||||
LIBSSH_API int sftp_reply_status(sftp_client_message msg, uint32_t status, const char *message);
|
int sftp_reply_status(sftp_client_message msg, uint32_t status, const char *message);
|
||||||
LIBSSH_API int sftp_reply_names_add(sftp_client_message msg, const char *file,
|
int sftp_reply_names_add(sftp_client_message msg, const char *file,
|
||||||
const char *longname, sftp_attributes attr);
|
const char *longname, sftp_attributes attr);
|
||||||
LIBSSH_API int sftp_reply_names(sftp_client_message msg);
|
int sftp_reply_names(sftp_client_message msg);
|
||||||
LIBSSH_API int sftp_reply_data(sftp_client_message msg, const void *data, int len);
|
int sftp_reply_data(sftp_client_message msg, const void *data, int len);
|
||||||
LIBSSH_API void sftp_handle_remove(sftp_session sftp, void *handle);
|
void sftp_handle_remove(sftp_session sftp, void *handle);
|
||||||
|
|
||||||
/* SFTP commands and constants */
|
/* SFTP commands and constants */
|
||||||
#define SSH_FXP_INIT 1
|
#define SSH_FXP_INIT 1
|
||||||
@@ -981,16 +962,6 @@ LIBSSH_API void sftp_handle_remove(sftp_session sftp, void *handle);
|
|||||||
#define SSH_FXF_EXCL 0x20
|
#define SSH_FXF_EXCL 0x20
|
||||||
#define SSH_FXF_TEXT 0x40
|
#define SSH_FXF_TEXT 0x40
|
||||||
|
|
||||||
/* file type flags */
|
|
||||||
#define SSH_S_IFMT 00170000
|
|
||||||
#define SSH_S_IFSOCK 0140000
|
|
||||||
#define SSH_S_IFLNK 0120000
|
|
||||||
#define SSH_S_IFREG 0100000
|
|
||||||
#define SSH_S_IFBLK 0060000
|
|
||||||
#define SSH_S_IFDIR 0040000
|
|
||||||
#define SSH_S_IFCHR 0020000
|
|
||||||
#define SSH_S_IFIFO 0010000
|
|
||||||
|
|
||||||
/* rename flags */
|
/* rename flags */
|
||||||
#define SSH_FXF_RENAME_OVERWRITE 0x00000001
|
#define SSH_FXF_RENAME_OVERWRITE 0x00000001
|
||||||
#define SSH_FXF_RENAME_ATOMIC 0x00000002
|
#define SSH_FXF_RENAME_ATOMIC 0x00000002
|
||||||
@@ -1014,16 +985,16 @@ LIBSSH_API void sftp_handle_remove(sftp_session sftp, void *handle);
|
|||||||
#define SFTP_RENAME SSH_FXP_RENAME
|
#define SFTP_RENAME SSH_FXP_RENAME
|
||||||
#define SFTP_READLINK SSH_FXP_READLINK
|
#define SFTP_READLINK SSH_FXP_READLINK
|
||||||
#define SFTP_SYMLINK SSH_FXP_SYMLINK
|
#define SFTP_SYMLINK SSH_FXP_SYMLINK
|
||||||
#define SFTP_EXTENDED SSH_FXP_EXTENDED
|
|
||||||
|
|
||||||
/* openssh flags */
|
/* openssh flags */
|
||||||
#define SSH_FXE_STATVFS_ST_RDONLY 0x1 /* read-only */
|
#define SSH_FXE_STATVFS_ST_RDONLY 0x1 /* read-only */
|
||||||
#define SSH_FXE_STATVFS_ST_NOSUID 0x2 /* no setuid */
|
#define SSH_FXE_STATVFS_ST_NOSUID 0x2 /* no setuid */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
} ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* SFTP_H */
|
#endif /* SFTP_H */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
/* vim: set ts=2 sw=2 et cindent: */
|
||||||
|
|||||||
82
include/libssh/ssh1.h
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
#ifndef __SSH1_H
|
||||||
|
#define __SSH1_H
|
||||||
|
|
||||||
|
#define SSH_MSG_NONE 0 /* no message */
|
||||||
|
#define SSH_MSG_DISCONNECT 1 /* cause (string) */
|
||||||
|
#define SSH_SMSG_PUBLIC_KEY 2 /* ck,msk,srvk,hostk */
|
||||||
|
#define SSH_CMSG_SESSION_KEY 3 /* key (BIGNUM) */
|
||||||
|
#define SSH_CMSG_USER 4 /* user (string) */
|
||||||
|
#define SSH_CMSG_AUTH_RHOSTS 5 /* user (string) */
|
||||||
|
#define SSH_CMSG_AUTH_RSA 6 /* modulus (BIGNUM) */
|
||||||
|
#define SSH_SMSG_AUTH_RSA_CHALLENGE 7 /* int (BIGNUM) */
|
||||||
|
#define SSH_CMSG_AUTH_RSA_RESPONSE 8 /* int (BIGNUM) */
|
||||||
|
#define SSH_CMSG_AUTH_PASSWORD 9 /* pass (string) */
|
||||||
|
#define SSH_CMSG_REQUEST_PTY 10 /* TERM, tty modes */
|
||||||
|
#define SSH_CMSG_WINDOW_SIZE 11 /* row,col,xpix,ypix */
|
||||||
|
#define SSH_CMSG_EXEC_SHELL 12 /* */
|
||||||
|
#define SSH_CMSG_EXEC_CMD 13 /* cmd (string) */
|
||||||
|
#define SSH_SMSG_SUCCESS 14 /* */
|
||||||
|
#define SSH_SMSG_FAILURE 15 /* */
|
||||||
|
#define SSH_CMSG_STDIN_DATA 16 /* data (string) */
|
||||||
|
#define SSH_SMSG_STDOUT_DATA 17 /* data (string) */
|
||||||
|
#define SSH_SMSG_STDERR_DATA 18 /* data (string) */
|
||||||
|
#define SSH_CMSG_EOF 19 /* */
|
||||||
|
#define SSH_SMSG_EXITSTATUS 20 /* status (int) */
|
||||||
|
#define SSH_MSG_CHANNEL_OPEN_CONFIRMATION 21 /* channel (int) */
|
||||||
|
#define SSH_MSG_CHANNEL_OPEN_FAILURE 22 /* channel (int) */
|
||||||
|
#define SSH_MSG_CHANNEL_DATA 23 /* ch,data (int,str) */
|
||||||
|
#define SSH_MSG_CHANNEL_CLOSE 24 /* channel (int) */
|
||||||
|
#define SSH_MSG_CHANNEL_CLOSE_CONFIRMATION 25 /* channel (int) */
|
||||||
|
/* SSH_CMSG_X11_REQUEST_FORWARDING 26 OBSOLETE */
|
||||||
|
#define SSH_SMSG_X11_OPEN 27 /* channel (int) */
|
||||||
|
#define SSH_CMSG_PORT_FORWARD_REQUEST 28 /* p,host,hp (i,s,i) */
|
||||||
|
#define SSH_MSG_PORT_OPEN 29 /* ch,h,p (i,s,i) */
|
||||||
|
#define SSH_CMSG_AGENT_REQUEST_FORWARDING 30 /* */
|
||||||
|
#define SSH_SMSG_AGENT_OPEN 31 /* port (int) */
|
||||||
|
#define SSH_MSG_IGNORE 32 /* string */
|
||||||
|
#define SSH_CMSG_EXIT_CONFIRMATION 33 /* */
|
||||||
|
#define SSH_CMSG_X11_REQUEST_FORWARDING 34 /* proto,data (s,s) */
|
||||||
|
#define SSH_CMSG_AUTH_RHOSTS_RSA 35 /* user,mod (s,mpi) */
|
||||||
|
#define SSH_MSG_DEBUG 36 /* string */
|
||||||
|
#define SSH_CMSG_REQUEST_COMPRESSION 37 /* level 1-9 (int) */
|
||||||
|
#define SSH_CMSG_MAX_PACKET_SIZE 38 /* size 4k-1024k (int) */
|
||||||
|
#define SSH_CMSG_AUTH_TIS 39 /* we use this for s/key */
|
||||||
|
#define SSH_SMSG_AUTH_TIS_CHALLENGE 40 /* challenge (string) */
|
||||||
|
#define SSH_CMSG_AUTH_TIS_RESPONSE 41 /* response (string) */
|
||||||
|
#define SSH_CMSG_AUTH_KERBEROS 42 /* (KTEXT) */
|
||||||
|
#define SSH_SMSG_AUTH_KERBEROS_RESPONSE 43 /* (KTEXT) */
|
||||||
|
#define SSH_CMSG_HAVE_KERBEROS_TGT 44 /* credentials (s) */
|
||||||
|
#define SSH_CMSG_HAVE_AFS_TOKEN 65 /* token (s) */
|
||||||
|
|
||||||
|
/* protocol version 1.5 overloads some version 1.3 message types */
|
||||||
|
#define SSH_MSG_CHANNEL_INPUT_EOF SSH_MSG_CHANNEL_CLOSE
|
||||||
|
#define SSH_MSG_CHANNEL_OUTPUT_CLOSE SSH_MSG_CHANNEL_CLOSE_CONFIRMATION
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Authentication methods. New types can be added, but old types should not
|
||||||
|
* be removed for compatibility. The maximum allowed value is 31.
|
||||||
|
*/
|
||||||
|
#define SSH_AUTH_RHOSTS 1
|
||||||
|
#define SSH_AUTH_RSA 2
|
||||||
|
#define SSH_AUTH_PASSWORD 3
|
||||||
|
#define SSH_AUTH_RHOSTS_RSA 4
|
||||||
|
#define SSH_AUTH_TIS 5
|
||||||
|
#define SSH_AUTH_KERBEROS 6
|
||||||
|
#define SSH_PASS_KERBEROS_TGT 7
|
||||||
|
/* 8 to 15 are reserved */
|
||||||
|
#define SSH_PASS_AFS_TOKEN 21
|
||||||
|
|
||||||
|
/* Protocol flags. These are bit masks. */
|
||||||
|
#define SSH_PROTOFLAG_SCREEN_NUMBER 1 /* X11 forwarding includes screen */
|
||||||
|
#define SSH_PROTOFLAG_HOST_IN_FWD_OPEN 2 /* forwarding opens contain host */
|
||||||
|
|
||||||
|
/* cipher flags. they are bit numbers */
|
||||||
|
#define SSH_CIPHER_NONE 0 /* No encryption */
|
||||||
|
#define SSH_CIPHER_IDEA 1 /* IDEA in CFB mode */
|
||||||
|
#define SSH_CIPHER_DES 2 /* DES in CBC mode */
|
||||||
|
#define SSH_CIPHER_3DES 3 /* Triple-DES in CBC mode */
|
||||||
|
#define SSH_CIPHER_RC4 5 /* RC4 */
|
||||||
|
#define SSH_CIPHER_BLOWFISH 6
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@@ -7,7 +7,6 @@
|
|||||||
#define SSH2_MSG_DEBUG 4
|
#define SSH2_MSG_DEBUG 4
|
||||||
#define SSH2_MSG_SERVICE_REQUEST 5
|
#define SSH2_MSG_SERVICE_REQUEST 5
|
||||||
#define SSH2_MSG_SERVICE_ACCEPT 6
|
#define SSH2_MSG_SERVICE_ACCEPT 6
|
||||||
#define SSH2_MSG_EXT_INFO 7
|
|
||||||
|
|
||||||
#define SSH2_MSG_KEXINIT 20
|
#define SSH2_MSG_KEXINIT 20
|
||||||
#define SSH2_MSG_NEWKEYS 21
|
#define SSH2_MSG_NEWKEYS 21
|
||||||
|
|||||||
@@ -24,40 +24,8 @@
|
|||||||
#include <libssh/libssh.h>
|
#include <libssh/libssh.h>
|
||||||
#include <libssh/callbacks.h>
|
#include <libssh/callbacks.h>
|
||||||
|
|
||||||
#if HAVE_PTHREAD
|
|
||||||
|
|
||||||
#include <pthread.h>
|
|
||||||
#define SSH_MUTEX pthread_mutex_t
|
|
||||||
|
|
||||||
#if defined(PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP)
|
|
||||||
#define SSH_MUTEX_STATIC_INIT PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
|
|
||||||
#else
|
|
||||||
#define SSH_MUTEX_STATIC_INIT PTHREAD_MUTEX_INITIALIZER
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif (defined _WIN32) || (defined _WIN64)
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include <winbase.h>
|
|
||||||
#define SSH_MUTEX CRITICAL_SECTION *
|
|
||||||
#define SSH_MUTEX_STATIC_INIT NULL
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
# define SSH_MUTEX void *
|
|
||||||
#define SSH_MUTEX_STATIC_INIT NULL
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int ssh_threads_init(void);
|
int ssh_threads_init(void);
|
||||||
void ssh_threads_finalize(void);
|
void ssh_threads_finalize(void);
|
||||||
const char *ssh_threads_get_type(void);
|
const char *ssh_threads_get_type(void);
|
||||||
|
|
||||||
void ssh_mutex_lock(SSH_MUTEX *mutex);
|
|
||||||
void ssh_mutex_unlock(SSH_MUTEX *mutex);
|
|
||||||
|
|
||||||
struct ssh_threads_callbacks_struct *ssh_threads_get_default(void);
|
|
||||||
int crypto_thread_init(struct ssh_threads_callbacks_struct *user_callbacks);
|
|
||||||
void crypto_thread_finalize(void);
|
|
||||||
|
|
||||||
#endif /* THREADS_H_ */
|
#endif /* THREADS_H_ */
|
||||||
|
|||||||
@@ -25,14 +25,6 @@
|
|||||||
#include "libssh/libssh.h"
|
#include "libssh/libssh.h"
|
||||||
#include "libssh/libcrypto.h"
|
#include "libssh/libcrypto.h"
|
||||||
#include "libssh/libgcrypt.h"
|
#include "libssh/libgcrypt.h"
|
||||||
#include "libssh/libmbedcrypto.h"
|
|
||||||
|
|
||||||
enum ssh_digest_e {
|
|
||||||
SSH_DIGEST_AUTO=0,
|
|
||||||
SSH_DIGEST_SHA1=1,
|
|
||||||
SSH_DIGEST_SHA256,
|
|
||||||
SSH_DIGEST_SHA512
|
|
||||||
};
|
|
||||||
|
|
||||||
enum ssh_mac_e {
|
enum ssh_mac_e {
|
||||||
SSH_MAC_SHA1=1,
|
SSH_MAC_SHA1=1,
|
||||||
@@ -46,8 +38,7 @@ enum ssh_hmac_e {
|
|||||||
SSH_HMAC_SHA256,
|
SSH_HMAC_SHA256,
|
||||||
SSH_HMAC_SHA384,
|
SSH_HMAC_SHA384,
|
||||||
SSH_HMAC_SHA512,
|
SSH_HMAC_SHA512,
|
||||||
SSH_HMAC_MD5,
|
SSH_HMAC_MD5
|
||||||
SSH_HMAC_AEAD_POLY1305
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ssh_des_e {
|
enum ssh_des_e {
|
||||||
@@ -60,8 +51,6 @@ struct ssh_hmac_struct {
|
|||||||
enum ssh_hmac_e hmac_type;
|
enum ssh_hmac_e hmac_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ssh_cipher_struct;
|
|
||||||
|
|
||||||
typedef struct ssh_mac_ctx_struct *ssh_mac_ctx;
|
typedef struct ssh_mac_ctx_struct *ssh_mac_ctx;
|
||||||
MD5CTX md5_init(void);
|
MD5CTX md5_init(void);
|
||||||
void md5_update(MD5CTX c, const void *data, unsigned long len);
|
void md5_update(MD5CTX c, const void *data, unsigned long len);
|
||||||
@@ -101,18 +90,15 @@ void hmac_update(HMACCTX c, const void *data, unsigned long len);
|
|||||||
void hmac_final(HMACCTX ctx,unsigned char *hashmacbuf,unsigned int *len);
|
void hmac_final(HMACCTX ctx,unsigned char *hashmacbuf,unsigned int *len);
|
||||||
size_t hmac_digest_len(enum ssh_hmac_e type);
|
size_t hmac_digest_len(enum ssh_hmac_e type);
|
||||||
|
|
||||||
int crypt_set_algorithms_client(ssh_session session);
|
int crypt_set_algorithms(ssh_session session, enum ssh_des_e des_type);
|
||||||
int crypt_set_algorithms_server(ssh_session session);
|
int crypt_set_algorithms_server(ssh_session session);
|
||||||
struct ssh_crypto_struct *crypto_new(void);
|
struct ssh_crypto_struct *crypto_new(void);
|
||||||
void crypto_free(struct ssh_crypto_struct *crypto);
|
void crypto_free(struct ssh_crypto_struct *crypto);
|
||||||
|
|
||||||
void ssh_reseed(void);
|
void ssh_reseed(void);
|
||||||
int ssh_crypto_init(void);
|
|
||||||
void ssh_crypto_finalize(void);
|
|
||||||
|
|
||||||
void ssh_cipher_clear(struct ssh_cipher_struct *cipher);
|
void ssh_cipher_clear(struct ssh_cipher_struct *cipher);
|
||||||
struct ssh_hmac_struct *ssh_get_hmactab(void);
|
struct ssh_hmac_struct *ssh_get_hmactab(void);
|
||||||
struct ssh_cipher_struct *ssh_get_ciphertab(void);
|
|
||||||
const char *ssh_hmac_type_to_string(enum ssh_hmac_e hmac_type);
|
const char *ssh_hmac_type_to_string(enum ssh_hmac_e hmac_type);
|
||||||
|
|
||||||
#endif /* WRAPPER_H_ */
|
#endif /* WRAPPER_H_ */
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
set(PACKAGE_VERSION @PROJECT_VERSION@)
|
set(PACKAGE_VERSION @APPLICATION_VERSION@)
|
||||||
|
|
||||||
# Check whether the requested PACKAGE_FIND_VERSION is compatible
|
# Check whether the requested PACKAGE_FIND_VERSION is compatible
|
||||||
if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
|
if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
|
||||||
|
|||||||