Re: Pipes Again -- a simple test case

2016-01-11 Thread Corinna Vinschen
On Jan  8 17:30, Corinna Vinschen wrote:
> On Jan  8 17:12, Houder wrote:
> > On 2016-01-08 16:19, Corinna Vinschen wrote:
> > >On Jan  4 10:24, Houder wrote:
> > >>On 2016-01-04 09:52, Marco Atzeri wrote:
> > >>>On 04/01/2016 09:03, Houder wrote:
> > Hi Corinna,
> > 
> > I have been looking for an STC to show why cmp fails on Cygwin (and to
> > show the
> > difference between Cygwin and Linux).
> > 
> > The STC below creates a pipe (pipe() is used), followed by calls to
> > fstat() and
> > stat() for both the read end and the write end of the pipe.
> > 
> > (I also tested with popen()/pclose(): same result)
> > 
> > Regards,
> > Henri
> > >
> > >Thanks for the STC.  However, given how this stuff works internally,
> > >I have no good solution off the top of my head.  I played with various
> > >ideas but to no avail.  I add this to my TODO list, but I probably
> > >won't have a quick solution :(
> > >
> > >
> > >Thanks,
> > >Corinna
> > >
> > >
> > >P.S: It would be really helpful if you could stick to the original
> > > thread and simply use "reply-to" once a discussion has started.
> > > It's very confusing having to connect the various threads.  Thanks.
> > 
> > Perhaps David B. can be helped by a Cygwin-specific patching to "cmp"? Eric?
> > 
> > ... replacing the call to fstat() by a call to stat() ...
> > (as shown in https://cygwin.com/ml/cygwin/2015-12/msg00348.html)
> > 
> > By the way, thank you for reporting back to "us" about this. I already
> > feared that a "general" solution would have to wait ... You have already
> > too much on your plate.
> > 
> > As a final point, I also tested FIFOs and (unix domain) sockets.
> > 
> > FIFOs pass the test, sockets do not.
> 
> Yes, that's expected.  The underlying hack^Wmethod is the same for sockets
> and pipes, while FIFOs have a real path on a real filesystem and thus have
> a real inode number to fetch in stat/fstat.

I applied a patch to make this work.  Please give the latest developer
snapshot from https://cygwin.com/snapshots/ a try.


Thanks,
Corinna

-- 
Corinna Vinschen  Please, send mails regarding Cygwin to
Cygwin Maintainer cygwin AT cygwin DOT com
Red Hat


signature.asc
Description: PGP signature


Re: Pipes Again -- a simple test case

2016-01-11 Thread Henri
Corinna Vinschen  cygwin.com> writes:
> Can you please provide the socket testcase?

Trying to send you what you ask for (using gmane.org, I have to copy/paste)

- t_stat3.c:
/*\
*  Copyright (C) Michael Kerrisk, 2014.   *
* *
* This program is free software. You may use, modify, and redistribute it *
* under the terms of the GNU Affero General Public License as published   *
* by the Free Software Foundation, either version 3 or (at your option)   *
* any later version. This program is distributed without any warranty.*
* See the file COPYING.agpl-v3 for details.   *
\*/

/* Listing 15-1 */ // t_stat.c -- heavily modified

#define _BSD_SOURCE /* Get major() and minor() from  */
#include 
#include 
#include 
//#include "file_perms.h"
//#include "tlpi_hdr.h"

#include   /* Standard I/O functions */
#include  /* Prototypes of commonly used library functions,
   plus EXIT_SUCCESS and EXIT_FAILURE constants */
#include  /* Prototypes for many system calls */
#include  /* Commonly used string-handling functions */

static void
displayStatInfo(const struct stat *sb)
{
printf("File type:");

switch (sb->st_mode & S_IFMT) {
case S_IFREG:  printf("regular file\n");break;
case S_IFDIR:  printf("directory\n");   break;
case S_IFCHR:  printf("character device\n");break;
case S_IFBLK:  printf("block device\n");break;
case S_IFLNK:  printf("symbolic (soft) link\n");break;
case S_IFIFO:  printf("FIFO or pipe\n");break;
case S_IFSOCK: printf("socket\n");  break;
default:   printf("unknown file type?\n");  break;
}

printf("Device containing i-node: (%lx)   major=%lu   minor=%lu\n",
(long) sb->st_dev, (long) major(sb->st_dev), (long)
minor(sb->st_dev));

printf("I-node number:%llx - decimal: %llu\n", sb->st_ino,
sb->st_ino);

if (S_ISCHR(sb->st_mode) || S_ISBLK(sb->st_mode))
printf("  Device number (st_rdev):  major=%ld; minor=%ld\n",
(long) major(sb->st_rdev), (long) minor(sb->st_rdev));

printf("File size:%lld bytes\n", (long long) sb->st_size);
}

void errExit(const char *format, ...);

#include 
#include 

int
main()
{
char symlnk[64];

pid_t pid = getpid();

int sfd[2];

for (int f = 0; f < 2; f++) // step over the 1st and 2nd socket
{
if (!f) {
sfd[f] = socket(AF_UNIX, SOCK_STREAM, 0);
//sfd[f] = socket(AF_INET, SOCK_STREAM, 0);
if (sfd[f] == -1)
errExit("socket");
} else {
sfd[f] = socket(AF_UNIX, SOCK_STREAM, 0);
//sfd[f] = socket(AF_INET, SOCK_STREAM, 0);
if (sfd[f] == -1)
errExit("socket");
}
}

struct stat sb[2]; // one buffer for the 1st socket, one for the 2nd
int f;

char target[128];
ssize_t num;

printf("1st socket\n");
f = 0;
if (sprintf(symlnk, "/proc/%d/fd/%d", pid, sfd[f]) <= 0)
errExit("sprintf");
printf("... %s (symbolic link to the socket)\n", symlnk);

if ( (num = readlink( (const char *)symlnk, target, 128) ) == -1)
   errExit("readlink");
if (num < 128) {
target[num] = '\0';
printf("... %s (target of symbolic link to the socket)\n", target);

printf("... using  stat() on symbolic link: %s\n", symlnk);
//if (stat(target, sb + f) != 0) // not possible: target is NOT a
filename ...
if (stat(symlnk, sb + f) != 0)
errExit("stat");
displayStatInfo(sb + f);

printf("... using fstat()\n");
memset(sb + f, 0, sizeof(struct stat) ); // CLEAR
if (fstat(sfd[f], sb + f) != 0)
errExit("fstat");
displayStatInfo(sb + f);
}

#if 1
printf("\n2nd socket\n");
f = 1;
if (sprintf(symlnk, "/proc/%d/fd/%d", pid, sfd[f]) <= 0)
errExit("sprintf");
printf("... %s (symbolic link to the socket)\n", symlnk);

if ( (num = readlink( (const char *)symlnk, target, 128) ) == -1)
   errExit("readlink");
if (num < 128) {
target[num] = '\0';
printf("... %s (target of symbolic link to the socket)\n", target);

printf("... using  stat() on symbolic link: %s\n", symlnk);
//if (stat(target, sb + f) != 0) // not possible: target is NOT a
filename ...
if (stat(symlnk, sb + f) != 0)
errExit("stat");
displayStatInfo(sb + f);

printf("... using fstat()\n");
memset(sb + f, 0, sizeof(struct stat) ); // CLEAR
if (fstat(sfd[f], sb + f) != 0)
errExit("fstat");

Re: Pipes Again -- a simple test case

2016-01-11 Thread Henri
Corinna Vinschen  cygwin.com> writes:

> > > As a final point, I also tested FIFOs and (unix domain) sockets.
> > > 
> > > FIFOs pass the test, sockets do not.
> > 
> > Yes, that's expected.  The underlying hack^Wmethod is the same for sockets
> > and pipes, while FIFOs have a real path on a real filesystem and thus have
> > a real inode number to fetch in stat/fstat.
> 
> I applied a patch to make this work.  Please give the latest developer
> snapshot from https://cygwin.com/snapshots/ a try.

Thank you!

Down with flue on this side. Did a quick verification (32-bits Cygwin).
Pipes look good. The problem with cmp apperas to be gone.
Sockets still leave wanting, as shown here:

@@ ./t_henri
1st socket
... /proc/4896/fd/3 (symbolic link to the socket)
... socket:[252] (target of symbolic link to the socket)
... using  stat() on symbolic link: /proc/4896/fd/3
File type:socket
Device containing i-node: (1e)   major=30   minor=0
I-node number:38037da0d28c3faf - decimal: 4036207820734742447
File size:0 bytes
... using fstat()
File type:socket
Device containing i-node: (1e)   major=30   minor=0
I-node number:1 - decimal: 1
File size:0 bytes

2nd socket
... /proc/4896/fd/4 (symbolic link to the socket)
... socket:[272] (target of symbolic link to the socket)
... using  stat() on symbolic link: /proc/4896/fd/4
File type:socket
Device containing i-node: (1e)   major=30   minor=0
I-node number:38037da2d3885eb1 - decimal: 4036207829341200049
File size:0 bytes
... using fstat()
File type:socket
Device containing i-node: (1e)   major=30   minor=0
I-node number:2 - decimal: 2
File size:0 bytes
@@ 

Regards,
Henri


--
Problem reports:   http://cygwin.com/problems.html
FAQ:   http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info:  http://cygwin.com/ml/#unsubscribe-simple



Re: Pipes Again -- a simple test case

2016-01-11 Thread Corinna Vinschen
On Jan 11 16:13, Henri wrote:
> Corinna Vinschen  cygwin.com> writes:
> > Can you please provide the socket testcase?
> 
> Trying to send you what you ask for (using gmane.org, I have to copy/paste)

Thanks!  I applied a patch and created a new developer snapshot.  I'll
also upload a new cygwin test release later today.  That's hopefully the
last one.  I intend to release end of this week.


Thanks again,
Corinna

-- 
Corinna Vinschen  Please, send mails regarding Cygwin to
Cygwin Maintainer cygwin AT cygwin DOT com
Red Hat


signature.asc
Description: PGP signature


Re: Pipes Again -- a simple test case

2016-01-08 Thread Corinna Vinschen
On Jan  8 17:12, Houder wrote:
> On 2016-01-08 16:19, Corinna Vinschen wrote:
> >On Jan  4 10:24, Houder wrote:
> >>On 2016-01-04 09:52, Marco Atzeri wrote:
> >>>On 04/01/2016 09:03, Houder wrote:
> Hi Corinna,
> 
> I have been looking for an STC to show why cmp fails on Cygwin (and to
> show the
> difference between Cygwin and Linux).
> 
> The STC below creates a pipe (pipe() is used), followed by calls to
> fstat() and
> stat() for both the read end and the write end of the pipe.
> 
> (I also tested with popen()/pclose(): same result)
> 
> Regards,
> Henri
> >
> >Thanks for the STC.  However, given how this stuff works internally,
> >I have no good solution off the top of my head.  I played with various
> >ideas but to no avail.  I add this to my TODO list, but I probably
> >won't have a quick solution :(
> >
> >
> >Thanks,
> >Corinna
> >
> >
> >P.S: It would be really helpful if you could stick to the original
> > thread and simply use "reply-to" once a discussion has started.
> > It's very confusing having to connect the various threads.  Thanks.
> 
> Perhaps David B. can be helped by a Cygwin-specific patching to "cmp"? Eric?
> 
> ... replacing the call to fstat() by a call to stat() ...
> (as shown in https://cygwin.com/ml/cygwin/2015-12/msg00348.html)
> 
> By the way, thank you for reporting back to "us" about this. I already
> feared that a "general" solution would have to wait ... You have already
> too much on your plate.
> 
> As a final point, I also tested FIFOs and (unix domain) sockets.
> 
> FIFOs pass the test, sockets do not.

Yes, that's expected.  The underlying hack^Wmethod is the same for sockets
and pipes, while FIFOs have a real path on a real filesystem and thus have
a real inode number to fetch in stat/fstat.


Corinna

-- 
Corinna Vinschen  Please, send mails regarding Cygwin to
Cygwin Maintainer cygwin AT cygwin DOT com
Red Hat


signature.asc
Description: PGP signature


Re: Pipes Again -- a simple test case

2016-01-08 Thread Houder

On 2016-01-08 16:19, Corinna Vinschen wrote:

On Jan  4 10:24, Houder wrote:

On 2016-01-04 09:52, Marco Atzeri wrote:
>On 04/01/2016 09:03, Houder wrote:
>>Hi Corinna,
>>
>>I have been looking for an STC to show why cmp fails on Cygwin (and to
>>show the
>>difference between Cygwin and Linux).
>>
>>The STC below creates a pipe (pipe() is used), followed by calls to
>>fstat() and
>>stat() for both the read end and the write end of the pipe.
>>
>>(I also tested with popen()/pclose(): same result)
>>
>>Regards,
>>Henri


Thanks for the STC.  However, given how this stuff works internally,
I have no good solution off the top of my head.  I played with various
ideas but to no avail.  I add this to my TODO list, but I probably
won't have a quick solution :(


Thanks,
Corinna


P.S: It would be really helpful if you could stick to the original
 thread and simply use "reply-to" once a discussion has started.
 It's very confusing having to connect the various threads.  
Thanks.


Perhaps David B. can be helped by a Cygwin-specific patching to "cmp"? 
Eric?


... replacing the call to fstat() by a call to stat() ...
(as shown in https://cygwin.com/ml/cygwin/2015-12/msg00348.html)

By the way, thank you for reporting back to "us" about this. I already
feared that a "general" solution would have to wait ... You have already
too much on your plate.

As a final point, I also tested FIFOs and (unix domain) sockets.

FIFOs pass the test, sockets do not.

Regards,

Henri

--
Problem reports:   http://cygwin.com/problems.html
FAQ:   http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info:  http://cygwin.com/ml/#unsubscribe-simple



Re: Pipes Again -- a simple test case

2016-01-08 Thread Corinna Vinschen
On Jan  4 10:24, Houder wrote:
> On 2016-01-04 09:52, Marco Atzeri wrote:
> >On 04/01/2016 09:03, Houder wrote:
> >>Hi Corinna,
> >>
> >>I have been looking for an STC to show why cmp fails on Cygwin (and to
> >>show the
> >>difference between Cygwin and Linux).
> >>
> >>The STC below creates a pipe (pipe() is used), followed by calls to
> >>fstat() and
> >>stat() for both the read end and the write end of the pipe.
> >>
> >>(I also tested with popen()/pclose(): same result)
> >>
> >>Regards,
> >>Henri

Thanks for the STC.  However, given how this stuff works internally,
I have no good solution off the top of my head.  I played with various
ideas but to no avail.  I add this to my TODO list, but I probably
won't have a quick solution :(


Thanks,
Corinna


P.S: It would be really helpful if you could stick to the original
 thread and simply use "reply-to" once a discussion has started.
 It's very confusing having to connect the various threads.  Thanks.

-- 
Corinna Vinschen  Please, send mails regarding Cygwin to
Cygwin Maintainer cygwin AT cygwin DOT com
Red Hat


signature.asc
Description: PGP signature


Re: Pipes Again -- a simple test case

2016-01-04 Thread Marco Atzeri

On 04/01/2016 09:03, Houder wrote:

Hi Corinna,

I have been looking for an STC to show why cmp fails on Cygwin (and to
show the
difference between Cygwin and Linux).

The STC below creates a pipe (pipe() is used), followed by calls to
fstat() and
stat() for both the read end and the write end of the pipe.

(I also tested with popen()/pclose(): same result)

Regards,
Henri

Btw, I am using W7 prof.; Cygwin-32 and Cygwin-64; 2.3.1 and 2.4.0

=

The code for the STC is basically as follows:


in general a STC should be complete and attached as file.

I know where you took errExit and displayStatInfo, but
it is anyway a extra effort time consuming for the others.

Regards
Marco

--
Problem reports:   http://cygwin.com/problems.html
FAQ:   http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info:  http://cygwin.com/ml/#unsubscribe-simple



Pipes Again -- a simple test case

2016-01-04 Thread Houder

Hi Corinna,

I have been looking for an STC to show why cmp fails on Cygwin (and to 
show the

difference between Cygwin and Linux).

The STC below creates a pipe (pipe() is used), followed by calls to 
fstat() and

stat() for both the read end and the write end of the pipe.

(I also tested with popen()/pclose(): same result)

Regards,
Henri

Btw, I am using W7 prof.; Cygwin-32 and Cygwin-64; 2.3.1 and 2.4.0

=

The code for the STC is basically as follows:

int
main()
{
struct stat sb[2];
int pfd[2];

pid_t pid = getpid();
if (pipe(pfd) != 0)
errExit("pipe");

for (int f = 0; f < 2; f++) // step over the read end and write end 
of the pipe

{
char symlnk[64];

if (sprintf(symlnk, "/proc/%d/fd/%d", pid, pfd[0 + f]) <= 0)
errExit("sprintf");
!f ? printf("... %s (symbolic link to the  read end of the 
pipe)\n", symlnk)
   : printf("... %s (symbolic link to the write end of the 
pipe)\n", symlnk);


printf("... using  stat()\n");
if (stat(symlnk, sb) != 0)
errExit("stat");
displayStatInfo(sb);

printf("... using fstat()\n");
if ( fstat(pfd[0 + f], sb + 1) != 0 )
errExit("fstat");
displayStatInfo(sb + 1);
}
exit(EXIT_SUCCESS);
}

Linux shows:
@@ ./t_stat2
... /proc/968/fd/3 (symbolic link to the  read end of the pipe)
... using  stat()
File type:FIFO or pipe
Device containing i-node: (8)   major=0   minor=8
I-node number:53bc - decimal: 21436
File size:0 bytes
... using  stat()
File type:FIFO or pipe
Device containing i-node: (8)   major=0   minor=8
I-node number:53bc - decimal: 21436
File size:0 bytes
... /proc/968/fd/4 (symbolic link to the write end of the pipe)
... using  stat()
File type:FIFO or pipe
Device containing i-node: (8)   major=0   minor=8
I-node number:53bc - decimal: 21436
File size:0 bytes
... using  stat()
File type:FIFO or pipe
Device containing i-node: (8)   major=0   minor=8
I-node number:53bc - decimal: 21436
File size:0 bytes

Cygwin shows:
@@ ./t_stat2
... /proc/2864/fd/3 (symbolic link to the  read end of the pipe)
... using  stat()
File type:FIFO or pipe
Device containing i-node: (c7)   major=0   minor=199
I-node number:a325e1ba495b63cf - decimal: 
11756050592531440591

File size:0 bytes
... using fstat()
File type:FIFO or pipe
Device containing i-node: (c6)   major=0   minor=198
I-node number:0 - decimal: 0  < zero, the 
non-existing i-node ...

File size:0 bytes
... /proc/2864/fd/4 (symbolic link to the write end of the pipe)
... using  stat()
File type:FIFO or pipe
Device containing i-node: (c7)   major=0   minor=199
I-node number:a325e1ba495f64cb - decimal: 
11756050592531702987 < Linux shows the same i-node

File size:0 bytes
... using fstat()
File type:FIFO or pipe
Device containing i-node: (c5)   major=0   minor=197
I-node number:0 - decimal: 0  < ditto
File size:0 bytes

=

--
Problem reports:   http://cygwin.com/problems.html
FAQ:   http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info:  http://cygwin.com/ml/#unsubscribe-simple



Re: Pipes Again -- a simple test case

2016-01-04 Thread Houder

On 2016-01-04 09:52, Marco Atzeri wrote:

On 04/01/2016 09:03, Houder wrote:

Hi Corinna,

I have been looking for an STC to show why cmp fails on Cygwin (and to
show the
difference between Cygwin and Linux).

The STC below creates a pipe (pipe() is used), followed by calls to
fstat() and
stat() for both the read end and the write end of the pipe.

(I also tested with popen()/pclose(): same result)

Regards,
Henri

Btw, I am using W7 prof.; Cygwin-32 and Cygwin-64; 2.3.1 and 2.4.0

=

The code for the STC is basically as follows:


in general a STC should be complete and attached as file.

I know where you took errExit and displayStatInfo, but
it is anyway a extra effort time consuming for the others.


Yup ... find it attached to this post ... (I hope).

(I was busy "compiling" everyting in one file :-)

Regards,
Henri/*\
*  Copyright (C) Michael Kerrisk, 2014.   *
* *
* This program is free software. You may use, modify, and redistribute it *
* under the terms of the GNU Affero General Public License as published   *
* by the Free Software Foundation, either version 3 or (at your option)   *
* any later version. This program is distributed without any warranty.*
* See the file COPYING.agpl-v3 for details.   *
\*/

/* Listing 15-1 */

/* t_stat.c -- heavily modified
 - using fstat: minor: 198/7 ... i-node: both (mostly) zero < my guess is that Cygwin is "in error"
 - using  stat: minor: 199 ... i-node: numbers are different from one another (and non-zero)
*/
#define _BSD_SOURCE /* Get major() and minor() from  */
#include 
#include 
#include 
//#include "file_perms.h"
//#include "tlpi_hdr.h"

#include   /* Standard I/O functions */
#include  /* Prototypes of commonly used library functions,
   plus EXIT_SUCCESS and EXIT_FAILURE constants */
#include  /* Prototypes for many system calls */
#include   /* Declares errno and defines error constants */
#include  /* Commonly used string-handling functions */

#include 

#ifdef TRUE
#undef TRUE
#endif

#ifdef FALSE
#undef FALSE
#endif

typedef enum { FALSE, TRUE } Boolean;

static char *ename[] = {
/*   0 */ "", 
/*   1 */ "EPERM", "ENOENT", "ESRCH", "EINTR", "EIO", "ENXIO", 
/*   7 */ "E2BIG", "ENOEXEC", "EBADF", "ECHILD", 
/*  11 */ "EAGAIN/EWOULDBLOCK", "ENOMEM", "EACCES", "EFAULT", 
/*  15 */ "ENOTBLK", "EBUSY", "EEXIST", "EXDEV", "ENODEV", 
/*  20 */ "ENOTDIR", "EISDIR", "EINVAL", "ENFILE", "EMFILE", 
/*  25 */ "ENOTTY", "ETXTBSY", "EFBIG", "ENOSPC", "ESPIPE", 
/*  30 */ "EROFS", "EMLINK", "EPIPE", "EDOM", "ERANGE", "ENOMSG", 
/*  36 */ "EIDRM", "ECHRNG", "EL2NSYNC", "EL3HLT", "EL3RST", 
/*  41 */ "ELNRNG", "EUNATCH", "ENOCSI", "EL2HLT", "EDEADLK", 
/*  46 */ "ENOLCK", "", "", "", "EBADE", "EBADR", "EXFULL", 
/*  53 */ "ENOANO", "EBADRQC", "EBADSLT", "EDEADLOCK", "EBFONT", 
/*  58 */ "", "", "ENOSTR", "ENODATA", "ETIME", "ENOSR", "ENONET", 
/*  65 */ "ENOPKG", "EREMOTE", "ENOLINK", "EADV", "ESRMNT", 
/*  70 */ "ECOMM", "EPROTO", "", "", "EMULTIHOP", "ELBIN", 
/*  76 */ "EDOTDOT", "EBADMSG", "", "EFTYPE", "ENOTUNIQ", "EBADFD", 
/*  82 */ "EREMCHG", "ELIBACC", "ELIBBAD", "ELIBSCN", "ELIBMAX", 
/*  87 */ "ELIBEXEC", "ENOSYS", "ENMFILE", "ENOTEMPTY", 
/*  91 */ "ENAMETOOLONG", "ELOOP", "", "", "EOPNOTSUPP", 
/*  96 */ "EPFNOSUPPORT", "", "", "", "", "", "", "", "ECONNRESET", 
/* 105 */ "ENOBUFS", "EAFNOSUPPORT", "EPROTOTYPE", "ENOTSOCK", 
/* 109 */ "ENOPROTOOPT", "ESHUTDOWN", "ECONNREFUSED", "EADDRINUSE", 
/* 113 */ "ECONNABORTED", "ENETUNREACH", "ENETDOWN", "ETIMEDOUT", 
/* 117 */ "EHOSTDOWN", "EHOSTUNREACH", "EINPROGRESS", "EALREADY", 
/* 121 */ "EDESTADDRREQ", "EMSGSIZE", "EPROTONOSUPPORT", 
/* 124 */ "ESOCKTNOSUPPORT", "EADDRNOTAVAIL", "ENETRESET", 
/* 127 */ "EISCONN", "ENOTCONN", "ETOOMANYREFS", "EPROCLIM", 
/* 131 */ "EUSERS", "EDQUOT", "ESTALE", "ENOTSUP", "ENOMEDIUM", 
/* 136 */ "ENOSHARE", "ECASECLASH", "EILSEQ", "EOVERFLOW", 
/* 140 */ "ECANCELED", "ENOTRECOVERABLE", "EOWNERDEAD", "ESTRPIPE"
};

#define MAX_ENAME 143

static void
displayStatInfo(const struct stat *sb)
{
printf("File type:");

switch (sb->st_mode & S_IFMT) {
case S_IFREG:  printf("regular file\n");break;
case S_IFDIR:  printf("directory\n");   break;
case S_IFCHR:  printf("character device\n");break;
case S_IFBLK:  printf("block device\n");break;
case S_IFLNK:  printf("symbolic (soft) link\n");break;
case S_IFIFO:  printf("FIFO or pipe\n");break;
case S_IFSOCK: printf("socket\n");  break;
default: