Steve Jones wrote: |
Stefan Ritt wrote: |
Steve Jones wrote: | I have checked and can find no reference within Sun documents regarding the support of the forkpty() function. I have not been following elog development lately -- what is shell substitution supposed to buy us? |
See the config manual and look for $shell |
Steve Jones wrote: | Yep, I saw it. Thanks |
|
Steve Jones wrote: |
Stefan, I found the following "forkpty()" replacement for running under Solaris. The URL is http://www.developerweb.net/forum/showthread.php?t=2990.
Perhaps this can be used unless someone comes up with a Solaris "util" library.
#ifdef SOLARIS /* Use the code in my_forkpty.c */
int my_forkpty (int *amaster, char *name, void *unused1, void *unused2);
#define forkpty my_forkpty
#endif
-----------------------
my_forkpty.c
-----------------------
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/stream.h>
#include <sys/stropts.h>
/* fork_pty() remplacement for Solaris.
* This ignore the last two arguments
* for the moment
*/
int
my_forkpty (int *amaster,
char *name,
void *unused1,
void *unused2)
{
int master, slave;
char *slave_name;
pid_t pid;
master = open("/dev/ptmx", O_RDWR);
if (master < 0)
return -1;
if (grantpt (master) < 0)
{
close (master);
return -1;
}
if (unlockpt (master) < 0)
{
close (master);
return -1;
}
slave_name = ptsname (master);
if (slave_name == NULL)
{
close (master);
return -1;
}
slave = open (slave_name, O_RDWR);
if (slave < 0)
{
close (master);
return -1;
}
if (ioctl (slave, I_PUSH, "ptem") < 0
|| ioctl (slave, I_PUSH, "ldterm") < 0)
{
close (slave);
close (master);
return -1;
}
if (amaster)
*amaster = master;
if (name)
strcpy (name, slave_name);
pid = fork ();
switch (pid)
{
case -1: /* Error */
return -1;
case 0: /* Child */
close (master);
dup2 (slave, STDIN_FILENO);
dup2 (slave, STDOUT_FILENO);
dup2 (slave, STDERR_FILENO);
return 0;
default: /* Parent */
close (slave);
return pid;
}
return -1;
}
|
|