annotate lib/pty.c @ 235:1638e32e6a35

2003-7-25 Brian Masney <masneyb@gftp.org> * lib/gftp.h lib/pty.c - moved including of some PTY related header files to pty.c. Hopefully should fix build problems under FreeBSD
author masneyb
date Fri, 25 Jul 2003 20:46:58 +0000
parents b8d14c2c3097
children 094e83b55cb1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
1 /*****************************************************************************/
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
2 /* pty.c - general purpose routines */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
3 /* Copyright (C) 1998-2003 Brian Masney <masneyb@gftp.org> */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
4 /* */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
5 /* This program is free software; you can redistribute it and/or modify */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
6 /* it under the terms of the GNU General Public License as published by */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
7 /* the Free Software Foundation; either version 2 of the License, or */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
8 /* (at your option) any later version. */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
9 /* */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
10 /* This program is distributed in the hope that it will be useful, */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
11 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
12 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
13 /* GNU General Public License for more details. */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
14 /* */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
15 /* You should have received a copy of the GNU General Public License */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
16 /* along with this program; if not, write to the Free Software */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
17 /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
18 /*****************************************************************************/
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
19
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
20 static const char cvsid[] = "$Id$";
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
21
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
22 #include "gftp.h"
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
23
179
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
24 #ifdef __sgi
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
25
179
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
26 char *
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
27 gftp_get_pty_impl (void)
179
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
28 {
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
29 return ("sgi");
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
30 }
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
31
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
32
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
33 static int
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
34 _gftp_ptym_open (char *pts_name, size_t len, int *fds)
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
35 {
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
36 char *new_pts_name;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
37 int fdm;
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
38
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
39 if ((new_pts_name = _getpty (&fdm, O_RDWR, 0600, 0)) == NULL)
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
40 return (GFTP_ERETRYABLE);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
41
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
42 strncpy (pts_name, new_pts_name, len);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
43
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
44 return (fdm);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
45 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
46
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
47
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
48 static int
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
49 _gftp_ptys_open (int fdm, int fds, char *pts_name)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
50 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
51 int new_fds;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
52
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
53 if ((new_fds = open (pts_name, O_RDWR)) < 0)
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
54 {
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
55 close (fdm);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
56 return (-1);
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
57 }
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
58
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
59 return (new_fds);
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
60 }
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
61
232
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
62 #elif HAVE_OPENPTY
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
63
235
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
64 #ifdef HAVE_PTY_H
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
65 #include <pty.h>
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
66 #include <utmp.h> /* for login_tty */
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
67 #elif HAVE_LIBUTIL_H
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
68 #include <libutil.h>
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
69 #include <utmp.h> /* for login_tty */
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
70 #else
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
71 extern int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize * winp);
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
72 extern int login_tty(int fd);
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
73 #endif
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
74
232
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
75 char *
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
76 gftp_get_pty_impl (void)
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
77 {
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
78 return ("openpty");
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
79 }
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
80
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
81
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
82 static int
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
83 _gftp_ptym_open (char *pts_name, size_t len, int *fds)
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
84 {
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
85 int fdm;
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
86
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
87 if (openpty (&fdm, fds, pts_name, NULL, NULL) < 0)
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
88 return (GFTP_ERETRYABLE);
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
89
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
90 ioctl (*fds, TIOCSCTTY, NULL);
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
91
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
92 return (fdm);
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
93 }
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
94
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
95
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
96 static int
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
97 _gftp_ptys_open (int fdm, int fds, char *pts_name)
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
98 {
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
99 if (login_tty (fds) < 0)
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
100 return (GFTP_EFATAL);
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
101
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
102 return (fds);
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
103 }
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
104
178
8beb7bfca92b 2003-6-11 Brian Masney <masneyb@gftp.org>
masneyb
parents: 146
diff changeset
105 #elif HAVE_GRANTPT
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
106
235
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
107 #include <stropts.h>
1638e32e6a35 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 232
diff changeset
108
179
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
109 char *
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
110 gftp_get_pty_impl (void)
179
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
111 {
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
112 return ("unix98");
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
113 }
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
114
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
115
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
116 static int
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
117 _gftp_ptym_open (char *pts_name, size_t len, int *fds)
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
118 {
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
119 char *new_pts_name;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
120 int fdm;
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
121
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
122 if ((fdm = open ("/dev/ptmx", O_RDWR)) < 0)
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
123 return (GFTP_ERETRYABLE);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
124
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
125 if (grantpt (fdm) < 0)
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
126 {
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
127 close (fdm);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
128 return (GFTP_ERETRYABLE);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
129 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
130
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
131 if (unlockpt (fdm) < 0)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
132 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
133 close (fdm);
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
134 return (GFTP_ERETRYABLE);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
135 }
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
136
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
137 if ((new_pts_name = ptsname (fdm)) == NULL)
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
138 {
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
139 close (fdm);
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
140 return (GFTP_ERETRYABLE);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
141 }
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
142
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
143 strncpy (pts_name, new_pts_name, len);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
144
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
145 return (fdm);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
146 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
147
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
148
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
149 static int
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
150 _gftp_ptys_open (int fdm, int fds, char *pts_name)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
151 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
152 int new_fds;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
153
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
154 if ((new_fds = open (pts_name, O_RDWR)) < 0)
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
155 {
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
156 close (fdm);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
157 return (-1);
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
158 }
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
159
179
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
160 #ifdef SYSV
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
161 /* I intentionally ignore these errors */
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
162 ioctl (new_fds, I_PUSH, "ptem");
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
163 ioctl (new_fds, I_PUSH, "ldterm");
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
164 ioctl (new_fds, I_PUSH, "ttcompat");
179
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
165 #endif
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
166
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
167 return (new_fds);
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
168 }
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
169
232
b8d14c2c3097 2003-7-25 Brian Masney <masneyb@gftp.org>
masneyb
parents: 210
diff changeset
170 #else /* !HAVE_GRANTPT */
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
171
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
172 /* Fall back to *BSD... */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
173
179
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
174 char *
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
175 gftp_get_pty_impl (void)
179
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
176 {
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
177 return ("bsd");
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
178 }
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
179
8d933999bba6 2003-6-14 Brian Masney <masneyb@gftp.org>
masneyb
parents: 178
diff changeset
180
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
181 static int
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
182 _gftp_ptym_open (char *pts_name, size_t len, int *fds)
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
183 {
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
184 char *pos1, *pos2;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
185 int fdm;
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
186
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
187 g_return_val_if_fail (len >= 10, GFTP_EFATAL);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
188
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
189 strncpy (pts_name, "/dev/ptyXY", len);
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
190 for (pos1 = "pqrstuvwxyzPQRST"; *pos1 != '\0'; pos1++)
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
191 {
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
192 pts_name[8] = *pos1;
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
193 for (pos2 = "0123456789abcdef"; *pos2 != '\0'; pos2++)
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
194 {
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
195 pts_name[9] = *pos2;
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
196 if ((fdm = open (pts_name, O_RDWR)) < 0)
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
197 continue;
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
198
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
199 pts_name[5] = 't';
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
200 chmod (pts_name, S_IRUSR | S_IWUSR);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
201 chown (pts_name, getuid (), -1);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
202
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
203 return (fdm);
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
204 }
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
205 }
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
206
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
207 return (GFTP_ERETRYABLE);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
208 }
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
209
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
211 static int
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
212 _gftp_ptys_open (int fdm, int fds, char *pts_name)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
213 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
214 int new_fds;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
215
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
216 if ((new_fds = open (pts_name, O_RDWR)) < 0)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
217 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
218 close (fdm);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
219 return (-1);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
220 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
221
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
222 #if defined(TIOCSCTTY) && !defined(CIBAUD)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
223 ioctl (new_fds, TIOCSCTTY, NULL);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
224 #endif
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
225
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
226 return (new_fds);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
227 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
228
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
229 #endif /* __sgi */
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
230
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
231
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
232 static int
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
233 _gftp_tty_raw (int fd)
146
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
234 {
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
235 struct termios buf;
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
236
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
237 if (tcgetattr (fd, &buf) < 0)
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
238 return (-1);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
239
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
240 buf.c_iflag |= IGNPAR;
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
241 buf.c_iflag &= ~(ICRNL | ISTRIP | IXON | IGNCR | IXANY | IXOFF | INLCR);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
242 buf.c_lflag &= ~(ECHO | ICANON | ISIG | ECHOE | ECHOK | ECHONL);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
243 #ifdef IEXTEN
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
244 buf.c_lflag &= ~(IEXTEN);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
245 #endif
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
246
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
247 buf.c_oflag &= ~(OPOST);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
248 buf.c_cc[VMIN] = 1;
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
249 buf.c_cc[VTIME] = 0;
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
250
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
251 if (tcsetattr (fd, TCSADRAIN, &buf) < 0)
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
252 return (-1);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
253 return (0);
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
254 }
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
255
782f84694489 2003-4-25 Brian Masney <masneyb@gftp.org>
masneyb
parents:
diff changeset
256
210
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
257 static void
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
258 _gftp_close_all_fds (void)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
259 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
260 int i, maxfds;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
261
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
262 #ifdef HAVE_GETDTABLESIZE
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
263 maxfds = getdtablesize () - 1;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
264 #elif defined (OPEN_MAX)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
265 maxfds = OPEN_MAX;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
266 #else
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
267 maxfds = -1;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
268 #endif
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
269
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
270 for (i=3; i<maxfds; i++)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
271 close (i);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
272 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
273
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
274
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
275 pid_t
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
276 gftp_exec_without_new_pty (gftp_request * request, int *fdm, char **args)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
277 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
278 pid_t child;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
279 int s[2];
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
280
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
281 if (socketpair (AF_LOCAL, SOCK_STREAM, 0, s) < 0)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
282 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
283 request->logging_function (gftp_logging_error, request,
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
284 _("Cannot create a socket pair: %s\n"),
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
285 g_strerror (errno));
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
286 return (-1);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
287 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
288
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
289 if ((child = fork ()) == 0)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
290 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
291 setsid ();
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
292
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
293 close (s[0]);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
294
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
295 _gftp_tty_raw (s[1]);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
296 dup2 (s[1], 0);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
297 dup2 (s[1], 1);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
298 dup2 (s[1], 2);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
299 _gftp_close_all_fds ();
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
300
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
301 execvp (args[0], args);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
302
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
303 printf (_("Error: Cannot execute ssh: %s\n"), g_strerror (errno));
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
304 exit (1);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
305 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
306 else if (child > 0)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
307 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
308 close (s[1]);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
309 _gftp_tty_raw (s[0]);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
310 *fdm = s[0];
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
311 return (child);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
312 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
313 else
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
314 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
315 request->logging_function (gftp_logging_error, request->user_data,
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
316 _("Cannot fork another process: %s\n"),
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
317 g_strerror (errno));
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
318 return (-1);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
319 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
320 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
321
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
322
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
323 pid_t
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
324 gftp_exec_with_new_pty (gftp_request * request, int *fdm, char **args)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
325 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
326 char pts_name[64];
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
327 pid_t child;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
328 int fds;
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
329
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
330 *pts_name = '\0';
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
331 if ((*fdm = _gftp_ptym_open (pts_name, sizeof (pts_name), &fds)) < 0)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
332 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
333 request->logging_function (gftp_logging_error, request->user_data,
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
334 _("Cannot open master pty %s: %s\n"), pts_name,
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
335 g_strerror (errno));
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
336 return (-1);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
337 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
338
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
339 if ((child = fork ()) == 0)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
340 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
341 setsid ();
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
342
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
343 if ((fds = _gftp_ptys_open (*fdm, fds, pts_name)) < 0)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
344 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
345 printf ("Cannot open slave pts %s: %s\n", pts_name,
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
346 g_strerror (errno));
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
347 return (-1);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
348 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
349
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
350 close (*fdm);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
351
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
352 _gftp_tty_raw (fds);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
353 dup2 (fds, 0);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
354 dup2 (fds, 1);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
355 dup2 (fds, 2);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
356 _gftp_close_all_fds ();
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
357
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
358 execvp (args[0], args);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
359
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
360 printf (_("Error: Cannot execute ssh: %s\n"), g_strerror (errno));
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
361 exit (1);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
362 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
363 else if (child > 0)
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
364 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
365 _gftp_tty_raw (*fdm);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
366 return (child);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
367 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
368 else
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
369 {
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
370 request->logging_function (gftp_logging_error, request->user_data,
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
371 _("Cannot fork another process: %s\n"),
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
372 g_strerror (errno));
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
373 return (-1);
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
374 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
375 }
82ebd1b05345 2003-7-6 Brian Masney <masneyb@gftp.org>
masneyb
parents: 179
diff changeset
376