Re: [Regression] kdesu broken

From: OGAWA Hirofumi
Date: Sat Jul 25 2009 - 11:16:20 EST


Alan Cox <alan@xxxxxxxxxxxxxxxxxxx> writes:

> Actually try this:

Thanks. This patch improved situation. However, if slave writes big data
to buffer, it seems we still have the problem.

> + tty_flip_buffer_push(tty->link);

This is handling the pending buffer, but in flush_to_ldisc(), if
!tty->receive_room, it seems still delay the ->receive_buf().

> set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
> wake_up_interruptible(&tty->link->read_wait);
> wake_up_interruptible(&tty->link->write_wait);

Thanks.
--
OGAWA Hirofumi <hirofumi@xxxxxxxxxxxxxxxxxx>


#define _GNU_SOURCE
#define BIG_BUF
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <error.h>
#include <limits.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <unistd.h>

static char pts_name[PATH_MAX];

static int open_pty(void)
{
int master;
char *name;

master = getpt();
if (master < 0)
return -1;

if (grantpt(master) < 0 || unlockpt(master) < 0)
goto close_master;
#if 0
{
int on = 1;
ioctl(master, FIONBIO, &on);
}
#endif
name = ptsname(master);
if (name == NULL)
goto close_master;

strcpy(pts_name, name);

return master;

close_master:
close(master);
return -1;
}

static pid_t child(int master)
{
pid_t pid;
int slave;

pid = fork();
if (pid < 0)
error(1, errno, "%s: fork", __func__);

if (pid == 0) {
slave = open(pts_name, O_RDWR);
if (slave < 0)
error(1, errno, "%s: open", __func__);

close(master);
dup2(slave, 0);
dup2(slave, 1);
dup2(slave, 2);
close(slave);

#ifdef BIG_BUF
{
char buf[4096];
size_t size;

memset(buf, '-', sizeof(buf));
size = 0;
while (size < 8192) {
ssize_t r = write(STDOUT_FILENO, buf, sizeof(buf));
if (r < 0)
error(1, errno, "%s: write", __func__);
size += r;
}
}
#else
printf("1-----------------------------------------------\n");
printf("2-----------------------------------------------\n");
printf("3-----------------------------------------------\n");
printf("4-----------------------------------------------\n");
printf("5-----------------------------------------------\n");
printf("6-----------------------------------------------\n");
printf("7-----------------------------------------------\n");
printf("8-----------------------------------------------\n");
printf("9-----------------------------------------------\n");
#endif
exit(0);
}

return pid;
}

int main()
{
pid_t pid;
int master;

master = open_pty();
if (master < 0)
error(1, errno, "%s: open_pty", __func__);

pid = child(master);

waitpid(pid, NULL, 0);
while (1) {
char buf[4096];
ssize_t size;

size = read(master, buf, sizeof(buf));
if (size < 0) {
if (errno == EAGAIN) {
printf("EAGAIN\n");
continue;
}
error(1, errno, "%s: read", __func__);
}
if (size == 0)
break;
#ifdef BIG_BUF
printf("size %zd\n", size);
#else
write(STDOUT_FILENO, buf, size);
#endif
}

return 0;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/