Changeset 839:028bb26bac65 in roaraudio for libroar/socket.c


Ignore:
Timestamp:
09/27/08 03:21:31 (16 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added ssh proxy support for +fork and inet via netcat

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/socket.c

    r838 r839  
    681681 } else if ( !strcmp(proxy_type, "http") ) { // HTTP CONNECT 
    682682  code = roar_socket_open_http; 
     683 } else if ( !strncmp(proxy_type, "ssh", 3) ) { // SSH... 
     684  code = roar_socket_open_ssh; 
    683685 } else { 
    684686  return -1; // unknown type 
     
    804806} 
    805807 
     808 
     809int roar_socket_open_ssh    (int mode, int fh, char * host, int port, char * user, char * pw, char * opts) { 
     810 char * proxy_addr = getenv("ssh_proxy"); 
     811 char * sep; 
     812 char   cmd[1024] = {0}, rcmd[1024] = {0}; 
     813 int    proxy_port = 22; 
     814 int r; 
     815 int socks[2]; 
     816 
     817 if ( host == NULL ) 
     818  return -1; 
     819 
     820 if ( *host == '/' ) 
     821  return -1; 
     822 
     823 if ( mode == MODE_LISTEN ) 
     824  return -1; 
     825 
     826 if ( proxy_addr == NULL ) 
     827  return -1; 
     828 
     829 if ( (sep = strstr(proxy_addr, "@")) != NULL ) 
     830  proxy_addr = sep+1; 
     831 
     832 if ( (sep = strstr(proxy_addr, ":")) != NULL ) { 
     833  *sep = 0; 
     834  proxy_port = atoi(sep+1); 
     835 } 
     836 
     837 
     838 if ( !strcmp(host, "+fork") ) { 
     839  strcpy(rcmd, "roard --no-listen --client-fh 0"); 
     840 } else { 
     841  snprintf(rcmd, 1023, "$(which netcat nc 2> /dev/null | grep -v \" \" | head -n 1) \"%s\" %i", host, port); 
     842  rcmd[1023] = 0; 
     843 } 
     844 
     845 snprintf(cmd, 1023, "ssh -p %i -l '%s' '%s' '%s'", proxy_port, user, proxy_addr, rcmd); 
     846 cmd[1023] = 0; 
     847 
     848 
     849 if ( socketpair(AF_UNIX, SOCK_STREAM, 0, socks) == -1 ) { 
     850  return -1; 
     851 } 
     852 
     853 r = fork(); 
     854 
     855 if ( r == -1 ) { // error! 
     856  ROAR_ERR("roar_socket_open_ssh(*): Can not fork: %s", strerror(errno)); 
     857  close(socks[0]); 
     858  close(socks[1]); 
     859  return -1; 
     860 } else if ( r == 0 ) { // we are the child 
     861  close(socks[0]); 
     862 
     863  close(ROAR_STDIN ); // we do not want roard to have any standard input 
     864  close(ROAR_STDOUT); // STDOUT is also not needed, so we close it, 
     865                      // but STDERR we keep open for error messages. 
     866 
     867  dup2(socks[1], 0); 
     868  dup2(socks[1], 1); 
     869 
     870  execlp("sh", "sh", "-c", cmd, NULL); 
     871 
     872  // we are still alive? 
     873  ROAR_ERR("roar_socket_open_ssh(*): alive after exec(), that's bad!"); 
     874  _exit(1); 
     875 } else { // we are the parent 
     876  close(socks[1]); 
     877  return socks[0]; 
     878 } 
     879 return -1; 
     880} 
     881 
    806882//ll 
Note: See TracChangeset for help on using the changeset viewer.