dave@pta.OZ (Dave Horsfall) (11/04/86)
For anyone interested, here is a summary of the responses I got, asking whether I can connect two file descriptors together. Sorry for the lateness. ------------------------------------------------------------ >From: rcodi@yabbie.rmit.oz (Ian Donaldson) Spawing cat would be hideous. Why not just have a loop do it: { char buf[4096]; register int cc; while((cc = read(pipefd, buf, 4096)) > 0) write(acceptfd, buf, cc); } If your process would be rather doing other things, then fork this loop instead of running it directly. Ian Donaldson *** Yes - I would rather be doing other things, and forking this *** loop is as hideous as spawning a 'cat'. *** Dave H. ------------------------------------------------------------ >From: Stewart Levin <seismo!hanauma!stew@munnari.oz> Don't know the answer, but pipes are implemented these days as sockets. So dig through the socket documentation and see if you can connect sockets. *** I did. Nothing. Which doesn't mean it isn't possible. *** Dave H. ------------------------------------------------------------ >From: Ken Lalonde <kwlalonde@math.waterloo.cdn@munnari.oz> Here's a thought: you can pass open file descriptors between processes using sendmsg() on an AF_UNIX/SOCK_DGRAM socket. Strange but true. *** Except that these are AF_INET/SOCK_STREAM sockets. Pity. *** Dave H. ------------------------------------------------------------ >From: mcvax!diku!thorinn@munnari.oz (Lars Henrik Mathiesen) Some time ago there were some articles in one of the sources groups from Rick Ace at New York Institute of Technology (philabs!nyit!rick) with the neccesary kernel mods to connect a socket with either a controlling pseudo-tty or a "real tty". This connection included some rlogin protocol processing. As you talk about accept(), I assume you're on 4.2+BSD. Then your pipes are special case sockets, so it's not the same situation. But if you can get Rick's articles, you may be able to hack it up yourself - it ought to be simpler, as you won't have to convert from mbufs to clists. I'm sorry to be so vague about where it appeared, but I haven't kept the headers. Try checking the mod.sources index. *** Except we don't have a source licence. Pity. *** Dave H. ------------------------------------------------------------ >From: Adam Quantrill <miduet!adam@munnari.oz> So you want: ACCEPT | V ___|_____ _______ | |--->---| | | P1 | | P2 | |_______| |_______| with the accept fd connected to the pipe going to p2. Well perhaps a better solution would be to dup the accept fd onto stdin, fork p2, and then restore stdin ( you could save stdin by dup'ing it to another descriptor and then dup'ing it back again). Then you would get: ACCEPT | |--->---| _________ | _______ | | |->--| | | P1 | | P2 | |_______| |_______| Hope this helps, -- -Adam. /* If at first it don't compile, kludge, kludge again.*/ *** Yes - that is pretty well what I wanted to do, but I *** got lost amongst the dups and forks ... I found another way *** of doing it anyway, which had nothing to do with dups at all! *** Amazing what you can do with a proper server/client situation. *** Dave H. ------------------------------------------------------------ >From: oddjob!matt@lbl-csam.arpa@munnari.oz (Matt Crawford) You could instead hand off the newly accepted fd to another process using a unix domain socket and sendmsg(). If you don't like that, go cat yourself! _____________________________________________________ Matt University crawford@anl-mcs.arpa Crawford of Chicago ihnp4!oddjob!matt Will this never-ending series of PLEASURABLE EVENTS never cease? *** I'm not using unix domain sockets. *** Dave H. ------------------------------------------------------------ >From: Jonathan Hue <seismo!caip!lll-lcc!leadsv!msunix!jon@munnari.oz> I must not understand the question. Doesn't dup2 do what you want? dup2(oldd, newd) int oldd, newd; In the second form of the call, the value of newd desired is specified. If this descriptor is already in use, the descriptor is first deallocated as if a close(2) call had been done first. "If we did it like everyone else, Jonathan Hue what would distinguish us from Via Visuals Inc. every other company in Silicon Valley?" sun!sunncal\ >!leadsv!msunix!jon "A profit?" amdcad!cae780/ *** Thereby losing the file descriptor I wanted to keep. See a *** previous reply along the lines you suggest. *** Dave H. ------------------------------------------------------------ Well - ladies, gentlemen and anything I may have missed, that covers it. The solution was simple - invert the server/client relationship, and everything just fell into place. Thanks to everyone who responded, and my apologies for being late. -- Dave Horsfall VK2KFU ISD: +61 2 957-2655 TLX: AA73857 Sun Computer Australia STD: (02) 957-2655 FAX: +61 2 923-2570 77 Pacific Hwy ACS: dave@pta.oz Nth Sydney NSW 2060 UUCP: seismo!munnari!pta.oz!dave AUSTRALIA ARPA: dave%pta.oz@seismo.arpa