Here's some skeleton code to try. I haven't tested it much, but it seems to connect alright.
#! /usr/bin/perl
use strict;
use warnings;
use Socket;
use POSIX;
sub named_socket_spawn {
my $code = shift;
ref $code eq 'CODE' or return;
my ($serv, $conn);
socket($serv, AF_UNIX, SOCK_STREAM, PF_UNSPEC)
|| die "socket: $!";
my $sname = tmpnam();
bind($serv, sockaddr_un($sname)) || die "bind: $!";
listen($serv, 1) || die "listen: $!";
my $pid = fork() // die "fork: $!";
if ($pid) {
close $serv;
return $sname;
}
accept($conn, $serv) || warn "accept: $!";
unlink($sname) || warn "unlink: $!";
open STDIN, "<&", $conn;
open STDOUT, ">&", $conn;
close $serv;
close $conn;
exit $code->();
}
use DBD::mysql;
#my $sqlsock = named_socket_spawn(sub{exec "ssh host -W host:3306"});
my $sqlsock = named_socket_spawn(sub{ exec "nc localhost 3306" });
my $dsn = "DBI:mysql:database=test;mysql_socket=$sqlsock";
my $dbh = DBI->connect($dsn, "test", "hunter5");