Skip to content

Commit c98a8df

Browse files
committed
server session CHANGE libssh poll changed and handles SSH messages automatically
It was changed accordingly, but also higher libssh version is now required. Fixes #44
1 parent f0705ea commit c98a8df

2 files changed

Lines changed: 27 additions & 37 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ endif()
116116

117117
# dependencies - libssh
118118
if(ENABLE_SSH)
119-
find_package(LibSSH 0.6.4 REQUIRED)
119+
find_package(LibSSH 0.7.0 REQUIRED)
120120
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNC_ENABLED_SSH")
121121
target_link_libraries(netconf2 "-L${LIBSSH_LIBRARY_DIR}" -lssh -lssh_threads -lcrypt)
122122
include_directories(${LIBSSH_INCLUDE_DIRS})

src/session_server.c

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,49 +1200,39 @@ nc_ps_poll_session(struct nc_session *session, time_t now_mono, char *msg)
12001200
#ifdef NC_ENABLED_SSH
12011201
case NC_TI_LIBSSH:
12021202
r = ssh_channel_poll_timeout(session->ti.libssh.channel, 0, 0);
1203-
if (r < 1) {
1204-
if (r == SSH_EOF) {
1205-
sprintf(msg, "SSH channel unexpected EOF");
1206-
session->status = NC_STATUS_INVALID;
1207-
session->term_reason = NC_SESSION_TERM_DROPPED;
1208-
ret = NC_PSPOLL_SESSION_TERM | NC_PSPOLL_SESSION_ERROR;
1209-
} else if (r == SSH_ERROR) {
1210-
sprintf(msg, "SSH channel poll error (%s)", ssh_get_error(session->ti.libssh.session));
1211-
session->status = NC_STATUS_INVALID;
1212-
session->term_reason = NC_SESSION_TERM_OTHER;
1213-
ret = NC_PSPOLL_SESSION_TERM | NC_PSPOLL_SESSION_ERROR;
1214-
} else {
1215-
ret = NC_PSPOLL_TIMEOUT;
1216-
}
1217-
break;
1218-
}
1219-
1220-
/* we have some data, but it may be just an SSH message */
1221-
r = ssh_execute_message_callbacks(session->ti.libssh.session);
1222-
if (r != SSH_OK) {
1223-
sprintf(msg, "failed to receive SSH messages (%s)", ssh_get_error(session->ti.libssh.session));
1203+
if (r == SSH_EOF) {
1204+
sprintf(msg, "SSH channel unexpected EOF");
1205+
session->status = NC_STATUS_INVALID;
1206+
session->term_reason = NC_SESSION_TERM_DROPPED;
1207+
ret = NC_PSPOLL_SESSION_TERM | NC_PSPOLL_SESSION_ERROR;
1208+
} else if (r == SSH_ERROR) {
1209+
sprintf(msg, "SSH channel poll error (%s)", ssh_get_error(session->ti.libssh.session));
12241210
session->status = NC_STATUS_INVALID;
12251211
session->term_reason = NC_SESSION_TERM_OTHER;
12261212
ret = NC_PSPOLL_SESSION_TERM | NC_PSPOLL_SESSION_ERROR;
1227-
} else if (session->flags & NC_SESSION_SSH_NEW_MSG) {
1228-
/* new SSH message */
1229-
session->flags &= ~NC_SESSION_SSH_NEW_MSG;
1230-
if (session->ti.libssh.next) {
1231-
for (new = session->ti.libssh.next; new != session; new = new->ti.libssh.next) {
1232-
if ((new->status == NC_STATUS_STARTING) && new->ti.libssh.channel
1233-
&& (new->flags & NC_SESSION_SSH_SUBSYS_NETCONF)) {
1234-
/* new NETCONF SSH channel */
1235-
ret = NC_PSPOLL_SSH_CHANNEL;
1213+
} else if (!r) {
1214+
if (session->flags & NC_SESSION_SSH_NEW_MSG) {
1215+
/* new SSH message */
1216+
session->flags &= ~NC_SESSION_SSH_NEW_MSG;
1217+
if (session->ti.libssh.next) {
1218+
for (new = session->ti.libssh.next; new != session; new = new->ti.libssh.next) {
1219+
if ((new->status == NC_STATUS_STARTING) && new->ti.libssh.channel
1220+
&& (new->flags & NC_SESSION_SSH_SUBSYS_NETCONF)) {
1221+
/* new NETCONF SSH channel */
1222+
ret = NC_PSPOLL_SSH_CHANNEL;
1223+
break;
1224+
}
1225+
}
1226+
if (new != session) {
12361227
break;
12371228
}
12381229
}
1239-
if (new != session) {
1240-
break;
1241-
}
1242-
}
12431230

1244-
/* just some SSH message */
1245-
ret = NC_PSPOLL_SSH_MSG;
1231+
/* just some SSH message */
1232+
ret = NC_PSPOLL_SSH_MSG;
1233+
} else {
1234+
ret = NC_PSPOLL_TIMEOUT;
1235+
}
12461236
} else {
12471237
/* we have some application data */
12481238
ret = NC_PSPOLL_RPC;

0 commit comments

Comments
 (0)