Provided by: netpipes_4.2-8build1_amd64 bug

NAME

       sockdown - shutdown(2) a socket

       netpipes 4.2

SYNOPSIS

       sockdown [ fd [how] ]

DESCRIPTION

       sockdown  performs the shutdown(2) system call on one of its file descriptors specified by
       fd.  The possible values for how are

       ┌──────────┬─────────────────────────────────────────────────────────┐
       │writeonly │ convert to write-only file descriptor                   │
       │0         │ convert to write-only file descriptor                   │
       │writeonly │ symbolic for same as above                              │
       │1         │ convert to read-only file descriptor                    │
       │readonly  │ symbolic for same as above                              │
       │2         │ complete shutdown.  no more reads or writes are allowed │
       │totally   │ symbolic for same as above                              │
       └──────────┴─────────────────────────────────────────────────────────┘

       The default fd is 1 (stdout) and the default how is 1.

EXAMPLES

       Imagine you have a machine that can perform a service (in this case conversion from  ASCII
       to fancy postscript) :

       server$ faucet 3000 --in --out enscript -2rGhp -

       You may then connect to it with a hose.  However, the first example enters deadlock :

       client$ hose server 3000 -in -out \
                 sh -c " cat blah.txt & cat > blah.ps "

       The  enscript  blocks  waiting  for  input  from  the socket because not all of the client
       processes have exited.  While the cat blah.txt is finished, the cat > blah.ps is not,  and
       will  not  be  finished  until the remote enscript process finishes writing.  The enscript
       process will not finish writing until it is finished reading, but that client->server half
       of  the  socket  is  still  open and will not be closed until all the client processes are
       done.  The result is deadlock.

       So, we use sockdown to close half of the pipe

       client$ hose server 3000 -in -out \
                 sh -c " ( cat blah.txt ; sockdown ) & cat > blah.ps "

       This way when the cat blah.txt is done, half of the socket is shut  down  and  the  remote
       enscript process runs out of input, causing it to flush its output and exit, so eventually
       the whole mess finishes cleanly.

       Note: the & on the hose is necessary to prevent another deadlock.  If we simply used the ;
       to  serialize  the  two  cat  processes it is possible that the enscript would fill up its
       write buffer before the first cat was done causing both processes to block and  preventing
       the second cat from draining the pipe.

       Of course, that idiomatic usage of hose is so useful that it is a special form:

       client$ hose server 3000 -slave < blah.txt > blah.ps

       Ian  Stirling  <root@mauve.demon.co.uk>  informs  me  that sockdown can be used in Linux's
       /proc/pid/fd/ directories to tear down hung network connections.  I have since  used  this
       myself  on  a  wedged MOMspider.  To try this, you have to know the PID of the program and
       the file descriptor of the wedged socket (can sometimes be found by running strace and see
       if  the  program  is  stuck in a read(2) system call).  If the PID is 991 and the socket's
       descriptor is 5, you do this as root:

       bash# sockdown 1 2 > /proc/991/fd/5

ERRORS

       Socket operation on non-socket

       Invalid argument (seen on Solaris) The fd you specified does not refer to a socket.   This
       happens  when  you run sockdown by itself (it is unlikely that any of the file descriptors
       attached to an interactive shell are actually sockets) or if you goof up your  faucet/hose
       command and forgot to dup(2) one of your descriptors.

       Bad  file  number  You  gave  it  a  bad  file number for fd.  If you have enough skill to
       actually generate this error, you probably know what is wrong.

       If you encounter any other errors, clue me in.

SEE ALSO

       netpipes (1) faucet (1), hose (1), getpeername (1), socket (2), shutdown (2),

NOTES

       Any normal human would assume a program this simple has to  be  bug  free,  but  I  am  an
       experienced programmer.

       Just  avoid  doing  anything  funky  like passing sockdown strings and it should serve you
       well.  You should not have to pass it any arguments unless you are doing something  fairly
       funky.

       Perhaps I should ditch the shutdown -a semantics on hose since a sockdown 1 2 would do the
       job.

CREDITS

       Ian Stirling <root@mauve.demon.co.uk>, for the idea of using this program in  /proc  on  a
       Linux machine.

COPYRIGHT

       Copyright (C) 1995-1998 Robert Forsman

       This program is free software; you can redistribute it and/or modify it under the terms of
       the GNU General Public License as  published  by  the  Free  Software  Foundation;  either
       version 2 of the License, or (at your option) any later version.

       This  program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
       without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR  PURPOSE.
       See the GNU General Public License for more details.

       You should have received a copy of the GNU General Public License along with this program;
       if not, write to the Free Software Foundation, Inc., 675 Mass Ave,  Cambridge,  MA  02139,
       USA.

AUTHOR

       Robert Forsman
        thoth@purplefrog.com
        Purple Frog Software
        http://web.purplefrog.com/~thoth/

                                           July 7, 1998                               SOCKDOWN(1)