Re: Pipes Again -- a simple test case
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
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
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
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
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
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
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
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
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
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: