summaryrefslogtreecommitdiffstats
path: root/include/libssh/server.h
blob: d615d2e622a4c7c6e743603820b486635384064b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/*
 * This file is part of the SSH Library
 *
 * Copyright (c) 2003-2008 by Aris Adamantiadis
 *
 * 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.
 */

/**
 * @defgroup ssh_server SSH Server
 * @addtogroup ssh_server
 * @{
 */

#ifndef SERVER_H
#define SERVER_H

#include "libssh/libssh.h"
#define SERVERBANNER CLIENTBANNER

#ifdef __cplusplus
extern "C" {
#endif

typedef struct ssh_bind_struct SSH_BIND;

/**
 * @brief Creates a new SSH server bind.
 *
 * @return A newly allocated ssh_bind session pointer.
 */
SSH_BIND *ssh_bind_new(void);

/**
 * @brief Set the opitons for the current SSH server bind.
 *
 * @param  ssh_bind     The ssh server bind to use.
 *
 * @param  options      The option structure to set.
 */
void ssh_bind_set_options(SSH_BIND *ssh_bind, SSH_OPTIONS *options);

/**
 * @brief Start listening to the socket.
 *
 * @param  ssh_bind     The ssh server bind to use.
 *
 * @return 0 on success, < 0 on error.
 */
int ssh_bind_listen(SSH_BIND *ssh_bind);

/**
 * @brief  Set the session to blocking/nonblocking mode.
 *
 * @param  ssh_bind     The ssh server bind to use.
 *
 * @param  blocking     Zero for nonblocking mode.
 */
void ssh_bind_set_blocking(SSH_BIND *ssh_bind, int blocking);

/**
 * @brief Recover the file descriptor from the session.
 *
 * @param  ssh_bind     The ssh server bind to get the fd from.
 *
 * @return The file descriptor.
 */
socket_t ssh_bind_get_fd(SSH_BIND *ssh_bind);

/**
 * @brief Set the file descriptor for a session.
 *
 * @param  ssh_bind     The ssh server bind to set the fd.
 *
 * @param  fd           The file descriptor.
 */
void ssh_bind_set_fd(SSH_BIND *ssh_bind, socket_t fd);

/**
 * @brief Allow the file descriptor to accept new sessions.
 *
 * @param  ssh_bind     The ssh server bind to use.
 */
void ssh_bind_fd_toaccept(SSH_BIND *ssh_bind);

/**
 * @brief Accept an incoming ssh connection and initialize the session.
 *
 * @param  ssh_bind     The ssh server bind to accept a connection.
 *
 * @return A newly allocated ssh session, NULL on error.
 */
SSH_SESSION *ssh_bind_accept(SSH_BIND *ssh_bind);

/**
 * @brief Free a ssh servers bind.
 *
 * @param  ssh_bind     The ssh server bind to free.
 */
void ssh_bind_free(SSH_BIND *ssh_bind);

/**
 * @brief Exchange the banner and cryptographic keys.
 *
 * @param  session      The ssh session to accept a connection.
 *
 * @return 0 on success, < 0 on error.
 */
int ssh_accept(SSH_SESSION *session);

/* messages.c */

#define SSH_AUTH_REQUEST 1
#define SSH_CHANNEL_REQUEST_OPEN 2
#define SSH_CHANNEL_REQUEST 3
#define SSH_SERVICE_REQUEST 4

#define SSH_AUTH_NONE (1<<0)
#define SSH_AUTH_PASSWORD (1<<1)
#define SSH_AUTH_HOSTBASED (1<<2)
#define SSH_AUTH_PUBLICKEY (1<<3)
#define SSH_AUTH_KEYBINT (1<<4)
#define SSH_AUTH_UNKNOWN 0

#define SSH_CHANNEL_SESSION 1
#define SSH_CHANNEL_TCPIP 2
#define SSH_CHANNEL_X11 3
#define SSH_CHANNEL_UNKNOWN 4

#define SSH_CHANNEL_REQUEST_PTY 1
#define SSH_CHANNEL_REQUEST_EXEC 2
#define SSH_CHANNEL_REQUEST_SHELL 3
#define SSH_CHANNEL_REQUEST_ENV 4
#define SSH_CHANNEL_REQUEST_SUBSYSTEM 5
#define SSH_CHANNEL_REQUEST_WINDOW_CHANGE 6
#define SSH_CHANNEL_REQUEST_UNKNOWN 7

typedef struct ssh_message SSH_MESSAGE;

SSH_MESSAGE *ssh_message_retrieve(SSH_SESSION *session, uint32_t packettype);
SSH_MESSAGE *ssh_message_get(SSH_SESSION *session);
int ssh_message_type(SSH_MESSAGE *msg);
int ssh_message_subtype(SSH_MESSAGE *msg);
int ssh_message_reply_default(SSH_MESSAGE *msg);
void ssh_message_free(SSH_MESSAGE *msg);

char *ssh_message_auth_user(SSH_MESSAGE *msg);
char *ssh_message_auth_password(SSH_MESSAGE *msg);
int ssh_message_auth_reply_success(SSH_MESSAGE *msg,int partial);
int ssh_message_auth_set_methods(SSH_MESSAGE *msg, int methods);

ssh_channel ssh_message_channel_request_open_reply_accept(SSH_MESSAGE *msg);

ssh_channel ssh_message_channel_request_channel(SSH_MESSAGE *msg);
// returns the TERM env variable
char *ssh_message_channel_request_pty_term(SSH_MESSAGE *msg);
char *ssh_message_channel_request_subsystem(SSH_MESSAGE *msg);
int ssh_message_channel_request_reply_success(SSH_MESSAGE *msg);

int ssh_message_service_reply_success(SSH_MESSAGE *msg);
char *ssh_message_service_service(SSH_MESSAGE *msg);

void ssh_set_message_callback(SSH_SESSION *session,
    int(*ssh_message_callback)(ssh_session session, struct ssh_message *msg));
#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* SERVER_H */

/**
 * @}
 */
/* vim: set ts=2 sw=2 et cindent: */