Port my_forkpty to be compatible with AIX

This commit is contained in:
Anton Lundin
2012-11-30 00:02:00 +01:00
parent 73d39980f4
commit 846a2fa535
+13 -3
View File
@@ -49,14 +49,20 @@ pid_t my_forkpty( int *amaster, char *name,
const struct termios *termp, const struct termios *termp,
const struct winsize *winp ) const struct winsize *winp )
{ {
/* For Solaris */ /* For Solaris and AIX */
int master, slave; int master, slave;
char *slave_name; char *slave_name;
pid_t pid; pid_t pid;
master = open( "/dev/ptmx", O_RDWR | O_NOCTTY ); #ifdef _AIX
#define PTY_DEVICE "/dev/ptc"
#else
#define PTY_DEVICE "/dev/ptmx"
#endif
master = open( PTY_DEVICE, O_RDWR | O_NOCTTY );
if ( master < 0 ) { if ( master < 0 ) {
perror( "open(/dev/ptmx)" ); perror( "open("PTY_DEVICE")" );
return -1; return -1;
} }
@@ -86,6 +92,7 @@ pid_t my_forkpty( int *amaster, char *name,
return -1; return -1;
} }
#ifndef _AIX
if ( ioctl(slave, I_PUSH, "ptem") < 0 || if ( ioctl(slave, I_PUSH, "ptem") < 0 ||
ioctl(slave, I_PUSH, "ldterm") < 0 ) { ioctl(slave, I_PUSH, "ldterm") < 0 ) {
perror( "ioctl(I_PUSH)" ); perror( "ioctl(I_PUSH)" );
@@ -93,6 +100,7 @@ pid_t my_forkpty( int *amaster, char *name,
close( master ); close( master );
return -1; return -1;
} }
#endif
if ( amaster != NULL ) if ( amaster != NULL )
*amaster = master; *amaster = master;
@@ -132,10 +140,12 @@ pid_t my_forkpty( int *amaster, char *name,
case 0: /* Child */ case 0: /* Child */
if ( setsid() < 0 ) if ( setsid() < 0 )
perror( "setsid" ); perror( "setsid" );
#ifndef _AIX
if ( ioctl( slave, TIOCSCTTY, NULL ) < 0 ) { if ( ioctl( slave, TIOCSCTTY, NULL ) < 0 ) {
perror( "ioctl" ); perror( "ioctl" );
return -1; return -1;
} }
#endif
close( master ); close( master );
dup2( slave, STDIN_FILENO ); dup2( slave, STDIN_FILENO );
dup2( slave, STDOUT_FILENO ); dup2( slave, STDOUT_FILENO );