Commit | Line | Data |
---|---|---|
79220ce3 LW |
1 | [This file of Tom Christiansen's has been edited to change makelib to h2ph |
2 | and .h to .ph where appropriate--law.] | |
3 | ||
4 | This directory contains files to help you convert the *.ph files generated my | |
5 | h2ph out of the perl source directory into *.pl files with all the | |
6 | indirection of the subroutine calls removed. The .ph version will be more | |
7 | safely portable, because if something isn't defined on the new system, like | |
8 | &TIOCGETP, then you'll get a fatal run-time error on the system lacking that | |
9 | function. Using the .pl version means that the subsequent scripts will give | |
10 | you a 0 $TIOCGETP and God only knows what may then happen. Still, I like the | |
11 | .pl stuff because they're faster to load. | |
12 | ||
13 | FIrst, you need to run h2ph on things like sys/ioctl.h to get stuff | |
14 | into the perl library directory, often /usr/local/lib/perl. For example, | |
15 | # h2ph sys/ioctl.h | |
16 | takes /usr/include/sys/ioctl.h as input and writes (without i/o redirection) | |
17 | the file /usr/local/lib/perl/sys/ioctl.ph, which looks like this | |
18 | ||
19 | eval 'sub TIOCM_RTS {0004;}'; | |
20 | eval 'sub TIOCM_ST {0010;}'; | |
21 | eval 'sub TIOCM_SR {0020;}'; | |
22 | eval 'sub TIOCM_CTS {0040;}'; | |
23 | eval 'sub TIOCM_CAR {0100;}'; | |
24 | ||
25 | and much worse, rather than what Larry's ioctl.pl from the perl source dir has, | |
26 | which is: | |
27 | ||
28 | $TIOCM_RTS = 0004; | |
29 | $TIOCM_ST = 0010; | |
30 | $TIOCM_SR = 0020; | |
31 | $TIOCM_CTS = 0040; | |
32 | $TIOCM_CAR = 0100; | |
33 | ||
34 | [Workaround for fixed bug in makedir/h2ph deleted--law.] | |
35 | ||
36 | The more complicated ioctl subs look like this: | |
37 | ||
38 | eval 'sub TIOCGSIZE {&TIOCGWINSZ;}'; | |
39 | eval 'sub TIOCGWINSZ {&_IOR("t", 104, \'struct winsize\');}'; | |
40 | eval 'sub TIOCSETD {&_IOW("t", 1, \'int\');}'; | |
41 | eval 'sub TIOCGETP {&_IOR("t", 8,\'struct sgttyb\');}'; | |
42 | ||
43 | The _IO[RW] routines use a %sizeof array, which (presumably) | |
44 | is keyed on the type name with the value being the size in bytes. | |
45 | ||
46 | To build %sizeof, try running this in this directory: | |
47 | ||
48 | % ./getioctlsizes | |
49 | ||
50 | Which will tell you which things the %sizeof array needs | |
51 | to hold. You can try to build a sizeof.ph file with: | |
52 | ||
53 | % ./getioctlsizes | ./mksizes > sizeof.ph | |
54 | ||
55 | Note that mksizes hardcodes the #include files for all the types, so it will | |
56 | probably require customization. Once you have sizeof.ph, install it in the | |
57 | perl library directory. Run my tcbreak script to see whether you can do | |
58 | ioctls in perl now. You'll get some kind of fatal run-time error if you | |
59 | can't. That script should be included in this directory. | |
60 | ||
61 | If this works well, now you can try to convert the *.ph files into | |
62 | *.pl files. Try this: | |
63 | ||
64 | foreach file ( sysexits.ph sys/{errno.ph,ioctl.ph} ) | |
65 | ./mkvars $file > t/$file:r.pl | |
66 | end | |
67 | ||
68 | The last one will be the hardest. If it works, should be able to | |
69 | run tcbreak2 and have it work the same as tcbreak. | |
70 | ||
71 | Good luck. |