[comp.lang.perl] can't get ioctl value

harrison@csl.dl.nec.com (Mark Harrison) (05/15/91)

I am having a problem getting the value needed for an TIOCGWINSZ (get
window size) ioctl.  If I hardcode the value printed by the C program,
everything works correctly.  I have run "h2ph * */*" in /usr/include.

Anybody have a clue?  Thanks in advance!

C program:
> #include <sys/ioccom.h>
> #include <sys/ttycom.h>
> main(){printf("%d\n", TIOCGWINSZ);}

from ioccom.ph:
>   eval 'sub _IOR {
>       local($x,$y,$t) = @_;
>       eval "( &_IOC_OUT|(($sizeof{$t}& &_IOCPARM_MASK)<<16)|(ord(\'$x\')<<8)|$y)";
>   }';

from ttycom.ph:
>     eval 'sub TIOCGWINSZ { &_IOR("t", 104, struct winsize);}';

My program:

#!/usr/local/bin/perl
require "sys/ioccom.ph";
require "sys/ttycom.ph";
$x = &TIOCGWINSZ;
print "x =", $x, ":\n";
print "TIOCGWINSZ =", &TIOCGWINSZ, ":\n";
ioctl(STDIN, &TIOCGWINSZ, $gettyval) || die "can't get window size";
#ioctl(STDIN, 1074295912, $gettyval); # <-- this one works ok.
($Rows, $Cols) = unpack("ss", $gettyval);
~

My output:
> x =:
> TIOCGWINSZ =:
> can't get window size at foo line 13.
-- 
Mark Harrison           | Note: harrison@ssd.dl.nec.com and
harrison@csl.dl.nec.com | necssd!harrison are not operating at
(214)518-5050           | present.  Please forward mail through the
                        | above address.  Sorry for the inconvenience.

tchrist@convex.COM (Tom Christiansen) (05/16/91)

From the keyboard of harrison@csl.dl.nec.com (Mark Harrison):
:I am having a problem getting the value needed for an TIOCGWINSZ (get
:window size) ioctl.  If I hardcode the value printed by the C program,
:everything works correctly.  I have run "h2ph * */*" in /usr/include.
:
:Anybody have a clue?  Thanks in advance!

Try checking $@ after the function call.

--tom
--
Tom Christiansen		tchrist@convex.com	convex!tchrist
		"So much mail, so little time." 

harrison@csl.dl.nec.com (Mark Harrison) (05/20/91)

Following up to my own article, I am coming closer to figuring out
why my ioctl's are not working.  It seems that I am not getting a
definition of struct something, or of &int.

Any suggestions?  Did I leave out a step somewhere to the the
definitions of struct and &int?

These lines are from /usr/local/lib/perl/sys/ttycom.ph:
>       eval 'sub TIOCGWINSZ { &_IOR("t", 104, struct winsize);}';
>       eval 'sub TIOCSCTTY { &_IO("t", 132);}';
>       eval 'sub TIOCGPGRP { &_IOR("t", 119,  &int);}';

my test program:
----------------
#!/usr/local/bin/perl
require "sys/ioctl.ph";
require "sys/ioccom.ph";
require "sys/ttycom.ph";

print "defined(&TIOCSCTTY)=", defined(&TIOCSCTTY), "\n";
$x = &TIOCSCTTY;
print "value is :$x:\n\n";

print "defined(&TIOCGWINSZ)=", defined(&TIOCGWINSZ), "\n";
$x = &TIOCGWINSZ;
print "value is :$x:\n\n";

print "defined(&TIOCGPGRP)=", defined(&TIOCGPGRP), "\n";
$x = &TIOCGPGRP;
print "value is :$x:\n\n";

Output:
-------
defined(&TIOCSCTTY)=1
value is :536900740:

defined(&TIOCGWINSZ)=1
value is ::

defined(&TIOCGPGRP)=1
Undefined subroutine "main'int" called at (eval) line 1.
-- 
Mark Harrison           | Note: harrison@ssd.dl.nec.com and
harrison@csl.dl.nec.com | necssd!harrison are not operating at
(214)518-5050           | present.  Please forward mail through the
                        | above address.  Sorry for the inconvenience.

tchrist@convex.COM (Tom Christiansen) (05/21/91)

From the keyboard of harrison@csl.dl.nec.com (Mark Harrison):
:Following up to my own article, I am coming closer to figuring out
:why my ioctl's are not working.  It seems that I am not getting a
:definition of struct something, or of &int.


:Any suggestions?  Did I leave out a step somewhere to the the
:definitions of struct and &int?

yes: you should first of all have %sizeof defined, so that

    $sizeof{'int'} = 4; # or whatever
    $sizeof{'struct winsize'} = 8; # or whatever

There are some old tools I once wrote in the src/perl/h2pl directory that
can serve as a starting point for this.

:These lines are from /usr/local/lib/perl/sys/ttycom.ph:
:>       eval 'sub TIOCGWINSZ { &_IOR("t", 104, struct winsize);}';
should be
         eval 'sub TIOCGWINSZ { &_IOR("t", 104, \'struct winsize\');}';
:>       eval 'sub TIOCSCTTY { &_IO("t", 132);}';
:>       eval 'sub TIOCGPGRP { &_IOR("t", 119, \'int\');}';

:#!/usr/local/bin/perl
:require "sys/ioctl.ph";
:require "sys/ioccom.ph";
:require "sys/ttycom.ph";


:defined(&TIOCSCTTY)=1
:value is :536900740:
:
:defined(&TIOCGWINSZ)=1
:value is ::
:
:defined(&TIOCGPGRP)=1
:Undefined subroutine "main'int" called at (eval) line 1.

You really ought to check $@ after calling these.  I would bet that you've 
got other evals blowing up in there.

--tom
--
Tom Christiansen		tchrist@convex.com	convex!tchrist
		"So much mail, so little time."