Subject: Re: fdopen() on sockets?
From: [email-masked] (Earnie Boyd)

18 Jun 1998 01:15:33 -0700
Message-ID: <[email-masked]>
Reply-To: [email-masked]
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
To: [email-masked], David Gadbois <[email-masked]>

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 <[email-masked]> 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 <sys/types.h>
> #include <sys/socket.h>
> #include <netinet/in.h>
> #include <netdb.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> #include <stdio.h>
> #include <stdarg.h>
> #include <errno.h>
> #include <stdlib.h>
> #include <signal.h>
> #include <unistd.h>
> #include <string.h>
> 
> #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
> "[email-masked]" with one line of text: "help".
> 

-        \\||//
---o0O0--Earnie--0O0o----
[email-masked]
------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
"[email-masked]" with one line of text: "help".