Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > Perl Misc > question about "requiring" linux/stat.ph

Reply
Thread Tools

question about "requiring" linux/stat.ph

 
 
szr
Guest
Posts: n/a
 
      02-14-2008
Hello. I am wrapping up a rather large server migration job I was tasked
with. Everything is running wonderfully.

One thing I noticed in a few legacy Perl scripts that had <code>require
"linux/stat.ph";</code> near the top and making use of functions like
S_ISLNK, resulting in this sort of error, which can be easily
reproduced:

$ perl -e 'require "linux/stat.ph"; &S_ISLNK'
Undefined subroutine &main::S_ISLNK called at -e line 1.


It seems the problem is coming from line 7 in
/usr/local/perl5.8.8/lib/site_perl/5.8.8/i686-linux-64int-ld/linux/stat.ph

if(defined( &__KERNEL__) || !defined( &__GLIBC__) ||
((defined(&__GLIBC__) ? &__GLIBC__ : 0) < 2)) {



Here is what the values for those defines are:

$ perl -e 'require
"/usr/local/perl5.8.8/lib/site_perl/5.8.8/i686-linux-64int-ld/linux/stat.ph";
print "[", &__KERNEL__, "]"'
Undefined subroutine &main::__KERNEL__ called at -e line 1.

$ perl -e 'require
"/usr/local/perl5.8.8/lib/site_perl/5.8.8/i686-linux-64int-ld/linux/stat.ph";
print "[", &__GLIBC__, "]"'
[2]


&__KERNEL__ is not defined and &__GLIBC__ is 2



If I comment out line 7 (and it's closing brace) then all the &S_ subs
(ie, S_ISLNK) are found properly, but I don't want to use such a hack, I
would like to fix the problem itself.

Thanks for any help.


-------------------------------
Perl Info Below
-------------------------------

$ perl -v

This is perl, v5.8.8 built for i686-linux-64int-ld
[...]

$ perl -V
Summary of my perl5 (revision 5 version 8 subversion configuration:
Platform:
osname=linux, osvers=2.4.20-8, archname=i686-linux-64int-ld
uname='linux srlinux 2.4.20-8 #1 thu mar 13 17:54:28 est 2003 i686
i686 i386 gnulinux '
config_args='-Dprefix=/usr/local/perl5.8.8 -Duse64bitint'
hint=recommended, useposix=true, d_sigaction=define
usethreads=undef use5005threads=undef useithreads=undef
usemultiplicity=undef
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=define use64bitall=undef uselongdouble=define
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags
='-fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
-I/usr/include/gdbm',
optimize='-O2',
cppflags='-fno-strict-aliasing -pipe -I/usr/local/include -I/usr/include/gdbm'
ccversion='', gccversion='3.2.2 20030222 (Red Hat Linux 3.2.2-5)',
gccosandvers=''
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
ivtype='long long', ivsize=8, nvtype='long double', nvsize=12,
Off_t='off_t', lseeksize=8
alignbytes=4, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc
perllibs=-lnsl -ldl -lm -lcrypt -lutil -lc
libc=/lib/libc-2.3.2.so, so=so, useshrplib=false, libperl=libperl.a
gnulibc_version='2.3.2'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fpic', lddlflags='-shared -L/usr/local/lib'


Characteristics of this binary (from libperl):
Compile-time options: PERL_MALLOC_WRAP USE_64_BIT_INT USE_LARGE_FILES
USE_LONG_DOUBLE USE_PERLIO
Built under linux
Compiled at Feb 11 2008 01:12:44
%ENV:
PERL5LIB="/home/SR/perllib:"
@INC:
/home/SR/perllib
/usr/local/perl5.8.8/lib/5.8.8/i686-linux-64int-ld
/usr/local/perl5.8.8/lib/5.8.8
/usr/local/perl5.8.8/lib/site_perl/5.8.8/i686-linux-64int-ld
/usr/local/perl5.8.8/lib/site_perl/5.8.8
/usr/local/perl5.8.8/lib/site_perl
 
Reply With Quote
 
 
 
 
John W. Krahn
Guest
Posts: n/a
 
      02-14-2008
szr wrote:
> Hello. I am wrapping up a rather large server migration job I was tasked
> with. Everything is running wonderfully.
>
> One thing I noticed in a few legacy Perl scripts that had <code>require
> "linux/stat.ph";</code> near the top and making use of functions like
> S_ISLNK, resulting in this sort of error, which can be easily
> reproduced:
>
> $ perl -e 'require "linux/stat.ph"; &S_ISLNK'
> Undefined subroutine &main::S_ISLNK called at -e line 1.


Change:

require "linux/stat.ph";

To:

use Fcntl;


perldoc -f stat
[ SNIP ]
You can import symbolic mode constants ("S_IF*") and functions
("S_IS*") from the Fcntl module:



John
--
Perl isn't a toolbox, but a small machine shop where you
can special-order certain sorts of tools at low cost and
in short order. -- Larry Wall
 
Reply With Quote
 
 
 
 
szr
Guest
Posts: n/a
 
      02-14-2008
John W. Krahn wrote:
> szr wrote:
>> Hello. I am wrapping up a rather large server migration job I was
>> tasked with. Everything is running wonderfully.
>>
>> One thing I noticed in a few legacy Perl scripts that had
>> <code>require "linux/stat.ph";</code> near the top and making use of
>> functions like S_ISLNK, resulting in this sort of error, which can
>> be easily reproduced:
>>
>> $ perl -e 'require "linux/stat.ph"; &S_ISLNK'
>> Undefined subroutine &main::S_ISLNK called at -e line 1.

>
> Change:
>
> require "linux/stat.ph";
>
> To:
>
> use Fcntl;
>
>
> perldoc -f stat
> [ SNIP ]
> You can import symbolic mode constants ("S_IF*") and functions
> ("S_IS*") from the Fcntl module:
>


Thanks.

use Fcntl ':mode';

did the trick


--
szr


 
Reply With Quote
 
Ben Morrow
Guest
Posts: n/a
 
      02-14-2008

Quoth "szr" <(E-Mail Removed)>:
> Hello. I am wrapping up a rather large server migration job I was tasked
> with. Everything is running wonderfully.
>
> One thing I noticed in a few legacy Perl scripts that had <code>require
> "linux/stat.ph";</code> near the top and making use of functions like
> S_ISLNK, resulting in this sort of error, which can be easily
> reproduced:
>
> $ perl -e 'require "linux/stat.ph"; &S_ISLNK'
> Undefined subroutine &main::S_ISLNK called at -e line 1.


You should be importing these constants from Fcntl with non-ancient
versions of Perl. h2ph can't always cope with the complicated
conditional definitions in Linux' system headers, so sometimes the
generated .ph files are not useable.

perl -MFcntl=:mode -le'print S_ISLNK(S_IFLNK)'

Generally speaking you can just use -l instead, though.

Ben

 
Reply With Quote
 
szr
Guest
Posts: n/a
 
      02-29-2008
Ben Morrow wrote:
> Quoth "szr" <(E-Mail Removed)>:
>> Hello. I am wrapping up a rather large server migration job I was
>> tasked with. Everything is running wonderfully.
>>
>> One thing I noticed in a few legacy Perl scripts that had
>> <code>require "linux/stat.ph";</code> near the top and making use of
>> functions like S_ISLNK, resulting in this sort of error, which can
>> be easily reproduced:
>>
>> $ perl -e 'require "linux/stat.ph"; &S_ISLNK'
>> Undefined subroutine &main::S_ISLNK called at -e line 1.

>
> You should be importing these constants from Fcntl with non-ancient
> versions of Perl. h2ph can't always cope with the complicated
> conditional definitions in Linux' system headers, so sometimes the
> generated .ph files are not useable.
>
> perl -MFcntl=:mode -le'print S_ISLNK(S_IFLNK)'
>
> Generally speaking you can just use -l instead, though.
>
> Ben


Thank you for the information.

-szr


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
question row filter (more of sql query question) =?Utf-8?B?YW5kcmV3MDA3?= ASP .Net 2 10-06-2005 01:07 PM
Quick Question - Newby Question =?Utf-8?B?UnlhbiBTbWl0aA==?= ASP .Net 4 02-16-2005 11:59 AM
Question on Transcender Question :-) eddiec MCSE 6 05-20-2004 06:59 AM
Question re: features of the 831 router (also a 924 question) Wayne Cisco 0 03-02-2004 07:57 PM
Syntax Question - Novice Question sean ASP .Net 1 10-20-2003 12:18 PM



Advertisments