Visit Our UNIX and Linux User Community


Pseudo-Terminal Programming-Extra newline


 
Thread Tools Search this Thread
Top Forums Programming Pseudo-Terminal Programming-Extra newline
# 1  
Old 11-10-2009
Pseudo-Terminal Programming-Extra newline

Hello everyone, im having a hard time figuring out why the program posted below prints an extra newline every time I type the enter key.I suspect this has to do with the terminal line discipline, but I can't really understand why.I have tried turning on/off several terminal options and disable special characters but to no avail.
Any help is greatly appreciated.
Source code follows(compiled in x86, linux-2.6.31.5 - gcc 4.3.3):

Code:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <termios.h>

void
die(char *ptr, ...)
{
	va_list vlist;
	va_start(vlist, ptr);
	char ch;

	while ((ch = *ptr++) != '\0') {
		if (ch == '%' && *ptr != '\0') {
			ch = *ptr++;
			switch(ch) {
				case 'd': printf("%d", va_arg(vlist, int)); break;
				case 'e': printf("%e", va_arg(vlist, double)); break;
				case 'c': printf("%c", va_arg(vlist, int)); break;
				case 's': printf("%s", va_arg(vlist, char *)); break;
				default: va_end(vlist);exit(1);
	

			}
			

		} else
			printf("%c", ch);


	}

	va_end(vlist);
	exit(1);
}



int
main(void)
{
    int pid,pid2;
    int ptm;
    int pts;
    char *ptr;
    char *program_name[2] = {"/usr/bin/passwd", NULL};
    char buf[512];
    int n,i;
    FILE *fp;
    struct termios term;
    int fd;


    if ((ptm = posix_openpt(O_RDWR)) == -1)
        die("posix_openpt error: %s\n", strerror(errno));
    if (grantpt(ptm) == -1)
        die("grantpt error: %s\n", strerror(errno));
    if (unlockpt(ptm) == -1)
        die("unlockpt error: %s\n", strerror(errno));

    if ((pid = fork()) < 0)
        die("fork error: %s\n", strerror(errno));
    else if (pid > 0) {    /* parent */

        if ((pid2 = fork()) < 0)
            die("2 fork error");
        else if (pid2 == 0) {        /* child in parent */
            if(dup2(ptm, STDOUT_FILENO) != STDOUT_FILENO)
                die("dup2 failed");

            for ( ; ;) {
                if ((n = read(STDIN_FILENO, buf,511)) <= 0)
                    die("read error");
                buf[n] = '\0';
                write(STDOUT_FILENO, buf, strlen(buf));

            }
        } else  {    /* parent in parent */
            if (dup2(ptm, STDIN_FILENO) != STDIN_FILENO)
                die("dup2 of parent failed");
            for (; ;) {
                if ((n = read(STDIN_FILENO, buf, 511)) <= 0)
                    die("read error");
                buf[n] = '\0';
                write(STDOUT_FILENO, buf, strlen(buf));

            }
        }
        
    
    } else {    /* child */
        if(setsid() == (pid_t) -1)
            die("setsid() error: %s\n", strerror(errno));

        if ((ptr = (char *) ptsname(ptm)) == NULL)
            die("ptsname error: %s\n", strerror(errno));
        if ((pts = open(ptr, O_RDWR)) < 0)
            die("open of slave failed: %a\n", strerror(errno));
        close(ptm);

        if (dup2(pts, STDIN_FILENO) != STDIN_FILENO ||
                dup2(pts, STDOUT_FILENO) != STDOUT_FILENO ||
                dup2(pts, STDERR_FILENO) != STDERR_FILENO)
            die("error doing dup's : %s\n", strerror(errno));

        if (execve(*program_name, program_name , NULL) == -1)
            die("execve error: %s\n", strerror(errno));
        exit(1);


    }


    /* should not get this far */
    return 0;
}


Last edited by rlex; 11-18-2009 at 10:52 AM..

Previous Thread | Next Thread
Test Your Knowledge in Computers #393
Difficulty: Easy
The Portable Operating System Interface (POSIX) is a family of standards specified by the IEEE Computer Society for maintaining compatibility between operating systems.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Print Terminal Output Exactly how it Appears in the Terminal to a New Text File

Hello All, I have a text file containing output from a command that contains lots of escape/control characters that when viewed using vi or view, looks like jibberish. But when viewed using the cat command the output is formatted properly. Is there any way to take the output from the cat... (7 Replies)
Discussion started by: mrm5102
7 Replies

2. Shell Programming and Scripting

Cannot get terminal application to launch with a graphical launcher when successful in terminal

I have been having an extremely annoying problem. For the record, I am relatively new at this. I've only been working with unix-based OS's for roughly two years, mostly Xubuntu and some Kali. I am pretty familiar with the BASH language, as that's the default shell for debian. Now, I've made this... (16 Replies)
Discussion started by: Huitzilopochtli
16 Replies

3. IP Networking

Ssh port forwarding through a pseudo terminal

Here's a situation: I do all my work on a Mac. I have mysql installed on my mac. 1. There's a certain linux server 'server01' that provides access to another linux server 'server02' via a pseudo terminal So, to ssh into 'server02', I do this from my mac: ssh -t server01... (1 Reply)
Discussion started by: imperialguy
1 Replies

4. UNIX for Dummies Questions & Answers

Does DOS has a terminal or pseudo terminal?

I am wondering if the DOS console works like the unix terminal? (1 Reply)
Discussion started by: vistastar
1 Replies

5. UNIX for Dummies Questions & Answers

Add pseudo terminal to bash history

Hello, Could you tell me if it is possible to add pseudo terminal name to the bash history? I need to see from which terminal the command was issues. I found a variable HISTTIMEFORMAT that helps me to identify the time but cannot find similar thing for the pts number. thanks, Pavel. (0 Replies)
Discussion started by: pn8830
0 Replies

6. UNIX for Dummies Questions & Answers

Pseudo Terminal

How can i view what my colleague is doing in the terminal pts/1 while i have logged into terminal pts/2 ?? Both have remotely logged in via ssh. (4 Replies)
Discussion started by: proactiveaditya
4 Replies

7. UNIX for Advanced & Expert Users

Need pseudo connectivity

Hi All, I have putty on my system (Vista). I need some server details to login via internet for my personnel practice. Can any body help me out. In case this not feasible, just let me know any other way to work with UNIX terminal on Windows Vista itself. Please help me since i am desparately... (3 Replies)
Discussion started by: vikas_kesarwani
3 Replies

8. UNIX for Advanced & Expert Users

Pseudo-terminal will not be allocated because stdin is not a terminal.

I am trying to automate a SSH login using Keys using the following command ssh -i id_rsa usernamw@ipaddr. I am successful in doing this and i am getting the Warning Screen and I logon successfully. but when I am executing the command tail -1cf put.dat | ssh -i id_rsa username@ipaddr > get.dat ... (1 Reply)
Discussion started by: Shivdatta
1 Replies

9. UNIX for Advanced & Expert Users

How to create a pseudo terminal

i have been trying to write a program to create a pseudo terminal..but im not familiar with pseudo terminals..so could some one help me out with the program flow ?? (0 Replies)
Discussion started by: shoba
0 Replies

10. Solaris

pseudo: [ID 129642 kern.info] pseudo-device: vol0

Hi I have a system that gave me some messages on bootup that I was not used to seeing: pseudo: pseudo-device: vol0 genunix: vol0 is /pseudo/vol@0 these came with these: Feb 13 17:42:17 system1 eri: SUNW,eri0 : 100 Mbps full duplex link up Feb 13 17:42:21 system1sendmail: My unqualified... (0 Replies)
Discussion started by: mndavies
0 Replies

Featured Tech Videos