question about "requiring" linux/stat.ph

Discussion in 'Perl Misc' started by szr, Feb 14, 2008.

  1. szr

    szr Guest

    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 8) 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
    szr, Feb 14, 2008
    #1
    1. Advertising

  2. 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
    John W. Krahn, Feb 14, 2008
    #2
    1. Advertising

  3. szr

    szr Guest

    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
    szr, Feb 14, 2008
    #3
  4. szr

    Ben Morrow Guest

    Quoth "szr" <>:
    > 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
    Ben Morrow, Feb 14, 2008
    #4
  5. szr

    szr Guest

    Ben Morrow wrote:
    > Quoth "szr" <>:
    >> 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
    szr, Feb 29, 2008
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Steven T. Hatton
    Replies:
    3
    Views:
    9,703
    Pete Becker
    Jun 2, 2005
  2. Patrick Useldinger

    os.stat('<filename>')[stat.ST_INO] on Windows

    Patrick Useldinger, Feb 27, 2005, in forum: Python
    Replies:
    6
    Views:
    1,168
    =?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=
    Mar 3, 2005
  3. Magesh
    Replies:
    3
    Views:
    443
    Gordon Burditt
    Oct 5, 2007
  4. Rolf Krüger
    Replies:
    2
    Views:
    613
    Ian Collins
    Mar 12, 2008
  5. ruck
    Replies:
    10
    Views:
    1,273
Loading...

Share This Page