| 2792 | | mksocs() |
| 2793 | | { |
| 2794 | | char buf[128]; |
| 2795 | | #ifndef WIN32 |
| 2796 | | int d; |
| 2797 | | #else |
| 2798 | | HANDLE d; |
| 2799 | | #endif |
| 2800 | | |
| 2801 | | #ifdef SOCKLENISUINT |
| 2802 | | #if defined(IMA_AIX4SP2) || defined(IMA_AIX5SP2) |
| | | ... |
| 2807 | | #else |
| 2808 | | int oslen; |
| 2809 | | #endif |
| 2810 | | int n; |
| 2811 | | int try; |
| 2812 | | char *p; |
| 2813 | | #ifndef NOUNIXDOM |
| 2814 | | struct sockaddr_un uns; |
| 2815 | | #endif |
| 2816 | | |
| 2817 | | if (topvmd) |
| 2818 | | return 0; |
| 2819 | | |
| 2820 | | |
| 2821 | | |
| 2822 | | |
| 2823 | | |
| 2824 | | |
| 2825 | | if (!(p = getenv("PVMSOCK"))) { |
| 2826 | | if (!(p = pvmdsockfile())) { |
| 2827 | | pvmlogerror("mksocs() pvmdsockfile() failed\n"); |
| 2828 | | goto bail; |
| 2829 | | } |
| 2830 | | #ifndef WIN32 |
| 2831 | | if ((d = open(p, O_RDONLY, 0)) == -1) {
|
| 2832 | | #else |
| 2833 | | d = win32_open_file(p); |
| 2834 | | if (d == (HANDLE) -2) { |
| 2835 | | system_loser_win=TRUE; |
| 2836 | | d = (HANDLE) _open(p,O_RDONLY,0); |
| 2837 | | } |
| 2838 | | if (d== (HANDLE) -1) { |
| 2839 | | #endif |
| 2840 | | pvmlogperror(p); |
| 2841 | | goto bail; |
| 2842 | | } |
| 2843 | | #ifdef WIN32 |
| 2844 | | if (!system_loser_win) { |
| 2845 | | n = win32_read_file(d,buf,sizeof(buf)); |
| 2846 | | win32_close_file(d); |
| 2847 | | } |
| 2848 | | else { |
| 2849 | | n = (int)_read((int)d, (void *)buf, (unsigned int)sizeof(buf)); |
| 2850 | | (void)_close((int)d); |
| 2851 | | } |
| 2852 | | #else |
| 2853 | | n = read(d, buf, sizeof(buf)); |
| 2854 | | (void)close(d); |
| 2855 | | #endif |
| 2856 | | if (n == -1) { |
| 2857 | | pvmlogperror("mksocs() read addr file"); |
| 2858 | | goto bail; |
| 2859 | | } |
| 2860 | | if (n == 0) { |
| 2861 | | pvmlogerror("mksocs() read addr file: wrong length read\n"); |
| 2862 | | goto bail; |
| 2863 | | } |
| 2864 | | buf[n] = 0; |
| 2865 | | p = buf; |
| 2866 | | } |
| 2867 | | |
| 2868 | | FD_ZERO(&pvmrfds);
|
| 2869 | | |
| 2870 | | |
| 2871 | | |
| 2872 | | pvmnfds = 0; |
| 2873 | | |
| 2874 | | topvmd = ttpcb_new(); |
| 2875 | | topvmd->tt_tid = TIDPVMD;
|
| 2876 | | |
| 2877 | | if (p[0] == '/') { |
| 2878 | | #ifdef NOUNIXDOM |
| 2879 | | pvmlogerror("mksocs() no support for Unix domain socket\n"); |
| 2880 | | goto bail; |
| 2881 | | |
| 2882 | | #else |
| 2883 | | if ((topvmd->tt_fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
|
| 2884 | | pvmlogperror("mksocs() socket"); |
| 2885 | | goto bail; |
| 2886 | | } |
| 2887 | | |
| 2888 | | |
| 2889 | | |
| 2890 | | |
| 2891 | | |
| 2892 | | |
| 2893 | | try = 5; |
| 2894 | | while (1) { |
| 2895 | | BZERO((char*)&uns, sizeof(uns));
|
| 2896 | | uns.sun_family = AF_UNIX;
|
| 2897 | | strcpy(uns.sun_path, p); |
| 2898 | | n = sizeof(uns); |
| 2899 | | if (connect(topvmd->tt_fd, (struct sockaddr*)&uns, n) == -1) { |
| 2900 | | if (--try <= 0) { |
| 2901 | | pvmlogperror("mksocs() connect"); |
| 2902 | | pvmlogprintf("\tsocket address tried: %s\n",p); |
| 2903 | | goto bail; |
| 2904 | | } |
| 2905 | | pvmsleep(1); |
| 2906 | | |
| 2907 | | } else |
| 2908 | | break; |
| 2909 | | } |
| 2910 | | #endif |
| 2911 | | |
| 2912 | | } else { |
| 2913 | | if ((topvmd->tt_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
|
| 2914 | | pvmlogperror("mksocs() socket"); |
| 2915 | | goto bail; |
| 2916 | | } |
| 2917 | | |
| 2918 | | try = 5; |
| 2919 | | while (1) { |
| 2920 | | hex_inadport(p, &topvmd->tt_osad); |
| 2921 | | topvmd->tt_osad.sin_family = AF_INET;
|
| 2922 | | n = sizeof(topvmd->tt_osad); |
| 2923 | | |
| 2924 | | if (connect(topvmd->tt_fd, (struct sockaddr*)&topvmd->tt_osad, n) |
| 2925 | | == -1) { |
| 2926 | | if (--try <= 0) { |
| 2927 | | pvmlogperror("mksocs() connect"); |
| 2928 | | pvmlogprintf("\tsocket address tried: %s\n",p); |
| 2929 | | goto bail; |
| 2930 | | } |
| 2931 | | pvmsleep(1); |
| 2932 | | } else |
| 2933 | | break; |
| 2934 | | } |
| 2935 | | |
| 2936 | | #ifndef NOSOCKOPT |
| 2937 | | #ifdef WIN32 |
| 2938 | | d = (HANDLE)1; |
| 2939 | | #else |
| 2940 | | d = 1; |
| 2941 | | #endif |
| 2942 | | if (setsockopt(topvmd->tt_fd, IPPROTO_TCP, TCP_NODELAY, (char*)&d, sizeof(int))
|
| 2943 | | == -1) { |
| 2944 | | pvmlogperror("mksocs() setsockopt"); |
| 2945 | | goto bail; |
| 2946 | | } |
| 2947 | | #endif |
| 2948 | | oslen = sizeof(topvmd->tt_sad); |
| 2949 | | if (getsockname(topvmd->tt_fd, (struct sockaddr*)&topvmd->tt_sad, &oslen) == -1) { |
| 2950 | | pvmlogperror("mksocs() getsockname"); |
| 2951 | | goto bail; |
| 2952 | | } |
| 2953 | | } |
| 2954 | | |
| 2955 | | topvmd->tt_state = TTOPEN;
|
| 2956 | | pvm_fd_add(topvmd->tt_fd, 1); |
| 2957 | | |
| 2958 | | return 0; |
| 2959 | | |
| 2960 | | bail: |
| 2961 | | if (topvmd) |
| 2962 | | ttpcb_delete(topvmd); |
| 2963 | | topvmd = 0; |
| 2964 | | return PvmSysErr;
|
| 2965 | | } |