From: earnie_boyd AT yahoo DOT com (Earnie Boyd) Subject: Re: fdopen() on sockets? 18 Jun 1998 01:15:33 -0700 Message-ID: <19980617143128.28238.rocketmail.cygnus.gnu-win32@send1e.yahoomail.com> Reply-To: earnie_boyd AT yahoo DOT com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii To: gnu-win32 AT cygnus DOT com, David Gadbois To fix the most serious problems: Please, _READ_ the IMPORTANT UPGRADE NOTICE at the end of this note. Please, ensure that there is only _ONE_ cygwinb19.dll. Please, ensure that _ALL_ b18 binaries have been removed. Please, _USE_ the Searchable Mail Archives. ---David Gadbois wrote: > > I recently installed a vanilla b19.1 and am re-porting a bunch of code > from b18. > > I have some library code that takes sockets that turns sockets into > FILE *'s so that calling code doesn't need to worry if it is dealing > with a socket or a regular file. fdopen() is failing on sockets with > EBADF. Is there a workaround? > > Test case appended. Oh, and as a bonus question, I normally rig > things so that detected program errors print a message and send a > SIGINT to the process. (See the function die() below.) When running > under gdb, this normally returns control to gdb with all the stack > ready for examination. The B19 behavior is for the program to exit. > > --David Gadbois > > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > > #define PROGRAM "socket-fdopen" > > void die(char *format, ...) { > va_list args; > > fprintf(stderr, "%s: ", PROGRAM); > va_start(args, format); > vfprintf(stderr, format, args); > va_end(args); > if (errno) > fprintf(stderr, ": %s", strerror(errno)); > fprintf(stderr, ".\n"); > kill(getpid(), SIGINT); > } > > #define MESSAGE "Eat flaming death, monkey boy!\r\n" > > int main(int argc, char **argv) { > int port; > struct sockaddr_in addr; > int sfd; > > if (argc == 1) > die("Must specify a port number to listen to."); > port = atoi(argv[1]); > if (port < 1024 || port > 65536) > die("Invalid port %d", port); > > /* Make sure Winsock gets initialized. */ > getprotobyname("tcp"); > > if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) > die("socket"); > > { > int reuseaddr = 1; > > if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, > (char *) &reuseaddr, sizeof(reuseaddr)) != 0) > die("setsockopt"); > } > > (void) memset((void *) &addr, 0, sizeof(addr)); > addr.sin_family = AF_INET; > addr.sin_port = htons((u_short) port); > addr.sin_addr.s_addr = htonl(INADDR_ANY); > > if (bind(sfd, (struct sockaddr *) &addr, sizeof(addr)) < 0) > die("bind"); > > if (listen(sfd, 5) < 0) > die("listen"); > > while (1) { > int new_sfd; > struct sockaddr_in peer_addr; > int peer_addr_len = sizeof(peer_addr); > > if ((new_sfd = accept(sfd, (struct sockaddr *) &peer_addr, &peer_addr_len)) < 0) > die("accept"); > #if 1 > { > FILE *fp; > > if ((fp = fdopen(new_sfd, "w")) == NULL) > die("fdopen"); > if (fwrite(MESSAGE, sizeof(char), strlen(MESSAGE), fp) != strlen(MESSAGE)) > die("fwrite"); > if (fclose(fp) != 0) > die("fclose"); > } > #else > if (write(new_sfd, MESSAGE, strlen(MESSAGE)) != strlen(MESSAGE)) > die("write"); > if (close(new_sfd) != 0) > die("close"); > #endif > } > } > - > For help on using this list (especially unsubscribing), send a message to > "gnu-win32-request AT cygnus DOT com" with one line of text: "help". > - \\||// ---o0O0--Earnie--0O0o---- --earnie_boyd AT yahoo DOT com-- ------ooo0O--O0ooo------- Please, research your question via the Searchable Mail Archives first. http://www.cygnus.com/ml/gnu-win32 (Searchable Mail Archives) Check out these great gnu-win32 related sites: ftp://ftp.cygnus.com/pub/gnu-win32/latest/ (ftp site) http://www.cygnus.com/pubs/gnupro/ (Comercial Page) http://www.cygnus.com/misc/gnu-win32/ (Project Page) http://dvpraktikum.informatik.uni-koeln.de:3232/ (Cygwin32 Porting Project) http://www.lexa.ru/sos (Sergey Okhapkin) ftp://www.lexa.ru/pub/domestic/sos/ (Sergey's ftp site) http://www.fu.is.saga-u.ac.jp/~colin/gcc.html (Colin Peters - Mingw32) http://www.xraylith.wisc.edu/~khan/software/gnu-win32/ (Mumit Khan) ftp://ftp.hksys.com/pub/mirrors/EGCS-Win32/ (Jeremy Bettis - mirror) http://gnu-win32.paranoia.ru (Chuck Bogorad's ports) http://www.downloadwizard.com/ak/gnu-win32/bash.html (GNU-Win32 Bash Configuration) http://www.parallax.co.uk/~andyp/index_text.html (Andy Piper - ports) http://www.tiac.net/users/cgf (Christopher Faylor - package ports) http://aquarius.franken.de/docs/develop/gnuwin32/GNUWin32.txt (Package Porting Notes) ftp://ftp.franken.de/pub/win32/develop/gnuwin32/cygwin32/ (German mirror) http://www.dol.ru/users/valtul (Valery Tulnikov - software ports) ftp://ftp.cs.nyu.edu/pub/local/fox/cygwin32 (David fox - RPM packages) http://www.itribe.net/virtunix/winhelp-man-pages/ (HTML Man Pages) Help for Win32 Beginners: http://www.relisoft.com http://www.program.com/resources/win32.html DISCLAIMER: These links or links from these pages to other sites do not constitute an endorsement of any entities, advertisers, products or services therein. I am not responsible for and do not control or monitor the content of these sites or the accuracy of information found therein. -------------------- IMPORTANT UPGRADE NOTICE ------------------------ You should get the following to update your cygwinb19 package: Sergey Okhapkin's coolview package which contains an updated cygwinb19.dll. (Yes, even if you've already downloaded the b19.1 update from the Cygnus Site). Mumit Khan's compilation of EGCS for the cygwinb19.dll; especially if you're using the C++ compiler. The current version of the compiler that comes with the tools has lots of problems that have been fixed with the EGCS version. This is a drop-in replacement for the GCC toolset. URL's are listed above. ----------------------------------------------------------------------- _________________________________________________________ DO YOU YAHOO!? Get your free @yahoo.com address at http://mail.yahoo.com - For help on using this list (especially unsubscribing), send a message to "gnu-win32-request AT cygnus DOT com" with one line of text: "help".