Changeset 839:028bb26bac65 in roaraudio for libroar/socket.c
- Timestamp:
- 09/27/08 03:21:31 (16 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/socket.c
r838 r839 681 681 } else if ( !strcmp(proxy_type, "http") ) { // HTTP CONNECT 682 682 code = roar_socket_open_http; 683 } else if ( !strncmp(proxy_type, "ssh", 3) ) { // SSH... 684 code = roar_socket_open_ssh; 683 685 } else { 684 686 return -1; // unknown type … … 804 806 } 805 807 808 809 int 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 806 882 //ll
Note: See TracChangeset
for help on using the changeset viewer.