Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 6 Apr 1996 11:14:32 +0200 (MET DST)
From:      J Wunsch <j@uriah.heep.sax.de>
To:        freebsd-hackers@freebsd.org (FreeBSD hackers)
Subject:   Re: Any clues as to why this fails?
Message-ID:  <199604060914.LAA07471@uriah.heep.sax.de>
In-Reply-To: <23387.828769307@time.cdrom.com> from "Jordan K. Hubbard" at Apr 5, 96 09:41:47 pm

next in thread | previous in thread | raw e-mail | index | archive | help
As Jordan K. Hubbard wrote:

>     printf("%d\n", fcntl(fd, F_SETOWN, getpid())); /* This call returns -1 */

> I've read the man page for fcntl() and it really appears as though
> that F_SETOWN call should work.  Any clues as to why not?  This

Because the man page for fcntl() is incomplete and doesn't mention all
possible error codes.  F_SETOWN finally calls ioctl(TIOCSPGRP) on the
descriptor, and this one (we should provide a source code license to
Thomas short of having correct man pages :-) :

        case TIOCSPGRP: {               /* set pgrp of tty */
                register struct pgrp *pgrp = pgfind(*(int *)data);

                if (!isctty(p, tp))
                        return (ENOTTY);

checks for the descriptor being a controlling tty.  Apparently, this
is not the case, unless you've been transferring the session to the
tty in question before, and acquired the ctty.  I don't know offhand
what's the political^H^H^H^H^H^H^Hsixical correct way for the latter,
but this one works (i've marked my changes):


#include <signal.h>
#include <fcntl.h>
#include <errno.h>
/* <<<<<<<<<<<<<<<<<<<< */
#include <sys/types.h>
#include <unistd.h>
#include <sys/ioctl.h>
/* >>>>>>>>>>>>>>>>>>>> */

void
handler(int sig)
{
    printf("Signal %d received\n", sig);
}

main()
{
    int i, fd;

    signal(SIGIO, handler);

    fd = open("/dev/cuaa1", O_RDONLY | O_NONBLOCK | O_EXCL);
    printf("%d\n", fd);
    i = fcntl(fd, F_GETFL, 0);
    printf("%d\n", i);
    /* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */
    if (fork()) exit(0);
    printf("%d\n", setsid());
    printf("%d\n", ioctl(fd, TIOCSCTTY, NULL));
    /* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */
    printf("%d\n", fcntl(fd, F_SETFL, i | O_ASYNC));
    printf("%d\n", fcntl(fd, F_SETOWN, getpid())); /* This call returns -1 */
    pause();
}

I don't know who in his right mind would really use SIGIO's these
days.

-- 
cheers, J"org

joerg_wunsch@uriah.heep.sax.de -- http://www.sax.de/~joerg/ -- NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199604060914.LAA07471>