static int shell_request(ssh_session session, ssh_channel channel, void *userdata) { struct channel_data_struct *cdata = (struct channel_data_struct *) userdata; (void) session; (void) channel; if(cdata->pid > 0) { return SSH_ERROR; } if (cdata->pty_master != -1 && cdata->pty_slave != -1) { return exec_pty("-l", NULL, cdata); } /* Client requested a shell without a pty, let's pretend we allow that */ return SSH_OK; }
static int exec_request(ssh_session session, ssh_channel channel, const char *command, void *userdata) { struct channel_data_struct *cdata = (struct channel_data_struct *) userdata; (void) session; (void) channel; if(cdata->pid > 0) { return SSH_ERROR; } if (cdata->pty_master != -1 && cdata->pty_slave != -1) { return exec_pty("-c", command, cdata); } return exec_nopty(command, cdata); }
int main(int argc, char **argv, char **envp) { const char *path = "./bufferring_test"; int channels[3] = { -1, -1, -1}; int status; FILE *app_stdin; FILE *app_stdout; FILE *app_stderr; char pts_name[32]; int fdm; char buffer[32]; fdm = ptym_open(pts_name); status = exec_pty(path, argv, envp, ".", channels, pts_name, fdm); if (status >= 0) { //app_stdin = fdopen(channels[0], "w"); app_stdout = fdopen(channels[1], "r"); app_stderr = fdopen(channels[2], "r"); if (app_stdout == NULL || app_stderr == NULL /*|| app_stdin == NULL*/) { fprintf(stderr, "PROBLEMS\n"); } else { printf("PID %d\n", status); if (isatty(fdm)) { printf("Is atty\n"); } write(fdm, "foo\n", 4); write(fdm, "bar\n", 4); //fputs("foo\n", app_stdin); //fputs("bar\n", app_stdin); //fflush(app_stdin); while(fgets(buffer, sizeof buffer, app_stdout) != NULL) { fprintf(stdout, "STDOUT: %s\n", buffer); } while(fgets(buffer, sizeof buffer, app_stderr) != NULL) { fprintf(stdout, "STDERR: %s\n", buffer); } } } fputs("bye\n", stdout); close(channels[0]); close(channels[1]); close(channels[2]); return 0; }