OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [stable_0_2_0/] [or1ksim/] [peripheral/] [channels/] [xterm.c] - Diff between revs 1070 and 1118

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 1070 Rev 1118
Line 45... Line 45...
#include "channel.h"
#include "channel.h"
#include "generic.h"
#include "generic.h"
#include "fd.h"
#include "fd.h"
 
 
 
 
 
 
struct xterm_channel
struct xterm_channel
{
{
        struct fd_channel fds;
        struct fd_channel fds;
        int pid;
        int pid;
 
        char** argv;
};
};
 
 
 
 
static void xterm_close(void * data)
static void xterm_close(void * data)
{
{
Line 68... Line 70...
        {
        {
                kill(xt->pid, SIGKILL);
                kill(xt->pid, SIGKILL);
                waitpid(xt->pid, NULL, 0);
                waitpid(xt->pid, NULL, 0);
        }
        }
 
 
 
        if (xt->argv)
 
                free (xt->argv);
 
 
        xt->fds.fdin = -1;
        xt->fds.fdin = -1;
        xt->fds.fdout = -1;
        xt->fds.fdout = -1;
        xt->pid = -1;
        xt->pid = -1;
 
        xt->argv = NULL;
 
 
}
}
 
 
static void xterm_exit(int i, void * data)
static void xterm_exit(int i, void * data)
{
{
        xterm_close(data);
        xterm_close(data);
}
}
 
 
 
#define MAX_XTERM_ARGS 100
static void * xterm_init(const char * input)
static void * xterm_init(const char * input)
{
{
        struct xterm_channel * retval = malloc(sizeof(struct xterm_channel));
        struct xterm_channel * retval = malloc(sizeof(struct xterm_channel));
        if(retval)
        if(retval)
        {
        {
                retval->fds.fdin = -1;
                retval->fds.fdin = -1;
                retval->fds.fdout = -1;
                retval->fds.fdout = -1;
                retval->pid = -1;
                retval->pid = -1;
                /* reset cause exit(1), leaving an xterm opened */
                /* reset cause exit(1), leaving an xterm opened */
                on_exit(xterm_exit, retval);
                on_exit(xterm_exit, retval);
 
 
 
                int i = 2;
 
                char *arglist = (char*)input;
 
                retval->argv = malloc(sizeof(char*) * MAX_XTERM_ARGS);
 
                if (!retval->argv) {
 
                        free(retval);
 
                        return NULL;
 
                }
 
                /* Assume xterm arguments are separated by whitespace */
 
                while (retval->argv[i++] = strtok(arglist, " \t\n")) {
 
                        arglist = NULL;
 
                        if (i == MAX_XTERM_ARGS - 1) {
 
                                free(retval);
 
                                return NULL;
 
                        }
 
                }
 
 
        }
        }
        return (void*)retval;
        return (void*)retval;
}
}
 
 
 
 
Line 108... Line 133...
        {
        {
                errno = ENODEV;
                errno = ENODEV;
                return -1;
                return -1;
        }
        }
 
 
 
 
        master = open("/dev/ptmx", O_RDWR);
        master = open("/dev/ptmx", O_RDWR);
 
 
        if(master < 0)
        if(master < 0)
                return -1;
                return -1;
 
 
Line 127... Line 151...
        }
        }
 
 
        xt->fds.fdout = xt->fds.fdin = open(slavename, O_RDWR);
        xt->fds.fdout = xt->fds.fdin = open(slavename, O_RDWR);
        if(xt->fds.fdout < 0) goto closemastererror;
        if(xt->fds.fdout < 0) goto closemastererror;
 
 
 
#ifndef linux
 
        /* Linux does not support STREAMS-style line discipline, even with LiS. */
        retval = ioctl(xt->fds.fdin, I_PUSH, "ptem");
        retval = ioctl(xt->fds.fdin, I_PUSH, "ptem");
        if(retval < 0) goto closeslaveerror;
        if(retval < 0) goto closeslaveerror;
 
 
        retval = ioctl(xt->fds.fdin, I_PUSH, "ldterm");
        retval = ioctl(xt->fds.fdin, I_PUSH, "ldterm");
        if(retval < 0) goto closeslaveerror;
        if(retval < 0) goto closeslaveerror;
 
#endif
 
 
        retval = tcgetattr(xt->fds.fdin, &termio);
        retval = tcgetattr(xt->fds.fdin, &termio);
        if(retval < 0) goto closeslaveerror;
        if(retval < 0) goto closeslaveerror;
 
 
 
 
        termio.c_lflag &= ~ECHO;
        termio.c_lflag &= ~ECHO;
        retval = tcsetattr(xt->fds.fdin, TCSADRAIN, &termio);
        retval = tcsetattr(xt->fds.fdin, TCSADRAIN, &termio);
        if(retval < 0) goto closeslaveerror;
        if(retval < 0) goto closeslaveerror;
 
 
        xt->pid = fork();
        xt->pid = fork();
Line 161... Line 186...
                }
                }
                else
                else
                {
                {
                      sprintf(arg, "-S%c%c%d", fin[0], fin[1], master);
                      sprintf(arg, "-S%c%c%d", fin[0], fin[1], master);
                }
                }
                execlp("xterm", "xterm", arg, NULL);
                xt->argv[0] = "xterm";
 
                xt->argv[1] = arg;
 
                execvp("xterm", xt->argv);
                write(master, "\n", 1);
                write(master, "\n", 1);
                exit(1);
                exit(1);
        }
        }
 
 
        do retval = read(xt->fds.fdin, &arg, 1);
        do retval = read(xt->fds.fdin, &arg, 1);
        while(retval >= 0 && arg[0] != '\n');
        while(retval >= 0 && arg[0] != '\n');
 
 
        if(retval < 0) goto closeslaveerror;
        if(retval < 0) goto closeslaveerror;
 
 
        termio.c_lflag |= ECHO;
        termio.c_lflag |= ECHO;
        retval = tcsetattr(xt->fds.fdin, TCSADRAIN, &termio);
        retval = tcsetattr(xt->fds.fdin, TCSADRAIN, &termio);
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.