| 947 | | main(argc, argv) |
| 948 | | int argc; |
| 949 | | char **argv; |
| 950 | | { |
| 951 | | int i, j; |
| 952 | | char *name = ""; |
| 953 | | struct passwd *pe; |
| 954 | | int testmode = 0; |
| 955 | | struct timeval tnow; |
| 956 | | char buf[128]; |
| 957 | | |
| 958 | | #ifndef WIN32 |
| 959 | | |
| 960 | | check_ext_input(); |
| 961 | | |
| 962 | | |
| 963 | | (void)open("/dev/null", O_RDONLY, 0);
|
| 964 | | (void)open("/dev/null", O_RDONLY, 0);
|
| 965 | | (void)open("/dev/null", O_RDONLY, 0);
|
| 966 | | #else |
| 967 | | |
| 968 | | |
| 969 | | |
| 970 | | if (WSAStartup(0x0101, &WSAData) != 0) { |
| 971 | | printf("\nWSAStartup() failed\n"); |
| 972 | | ExitProcess(1); |
| 973 | | } |
| 974 | | setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE, |
| 975 | | (char *)&nAlert,sizeof(int)); |
| 976 | | osinfo=malloc(sizeof(OSVERSIONINFO)); |
| 977 | | osinfo->dwOSVersionInfoSize = sizeof(OSVERSIONINFO); |
| 978 | | GetVersionEx(osinfo); |
| 979 | | os_is_NT= ( osinfo->dwPlatformId == VER_PLATFORM_WIN32_NT); |
| 980 | | #endif |
| 981 | | |
| 982 | | { |
| 983 | | char *p; |
| 984 | | if (p = getenv("PVMDDEBUG")) |
| 985 | | pvmdebmask = pvmstrtoi(p); |
| 986 | | } |
| 987 | | |
| 988 | | #ifndef WIN32 |
| 989 | | if ((pvm_useruid = getuid()) == -1) { |
| 990 | | pvmlogerror("main() can't getuid()\n"); |
| 991 | | pvmbailout(0); |
| 992 | | } |
| 993 | | pvmchkuid( pvm_useruid ); |
| 994 | | #else |
| 995 | | username = MyGetUserName(); |
| 996 | | #endif |
| 997 | | |
| 998 | | pvmsetlog(3); |
| 999 | | |
| 1000 | | #ifndef WIN32 |
| 1001 | | if (pe = getpwuid(pvm_useruid)) |
| 1002 | | username = STRALLOC(pe->pw_name);
|
| 1003 | | else |
| 1004 | | pvmlogerror("main() can't getpwuid\n"); |
| 1005 | | endpwent(); |
| 1006 | | #endif |
| 1007 | | |
| 1008 | | #ifdef WIN32 |
| 1009 | | if ((pvmmyupid = getpid()) == -1) { |
| 1010 | | pvmlogerror("main() can't getpid() %d \n",GetLastError()); |
| 1011 | | pvmbailout(0); |
| 1012 | | } |
| 1013 | | #else |
| 1014 | | if ((pvmmyupid = getpid()) == -1) { |
| 1015 | | pvmlogerror("main() can't getpid()\n"); |
| 1016 | | pvmbailout(0); |
| 1017 | | } |
| 1018 | | #endif |
| 1019 | | |
| 1020 | | (void)pvmgetroot(); |
| 1021 | | |
| 1022 | | sprintf(buf, "PVM_ARCH=%s", myarchname); |
| 1023 | | pvmputenv(STRALLOC(buf));
|
| 1024 | | |
| 1025 | | pvmmydsig = pvmgetdsig(); |
| 1026 | | |
| 1027 | | ppi_config(argc, argv); |
| 1028 | | |
| 1029 | | #if defined(IMA_PGON) || defined(IMA_SP2MPI) || defined(IMA_AIX4SP2) \ |
| 1030 | | || defined(IMA_AIX5SP2) || defined(IMA_BEOLIN) |
| 1031 | | mpp_init(&argc, argv); |
| 1032 | | #endif |
| 1033 | | |
| 1034 | | for (i = j = 1; i < argc; i++) { |
| 1035 | | if (argv[i][0] == '-') { |
| 1036 | | switch (argv[i][1]) { |
| 1037 | | |
| 1038 | | case 'd': |
| 1039 | | pvmdebmask = pvmstrtoi(argv[i] + 2); |
| 1040 | | break; |
| 1041 | | |
| 1042 | | case 'n': |
| 1043 | | name = argv[i] + 2; |
| 1044 | | break; |
| 1045 | | |
| 1046 | | case 'S': |
| 1047 | | argv[j++] = argv[i]; |
| 1048 | | case 's': |
| 1049 | | slavemode = 1; |
| 1050 | | break; |
| 1051 | | |
| 1052 | | case 't': |
| 1053 | | testmode = 1; |
| 1054 | | break; |
| 1055 | | |
| 1056 | | #ifdef WIN32 |
| 1057 | | case 'u': |
| 1058 | | if (os_is_NT==FALSE) { |
| 1059 | | |
| 1060 | | argv[i]++;argv[i]++; |
| 1061 | | strcpy(username,argv[i]); |
| 1062 | | } |
| 1063 | | else |
| 1064 | | if (strcmp(strcat("-u",username),argv[i])) { |
| | | ... |
| 1066 | | "Provided Username(%s) does not match ", |
| 1067 | | username); |
| 1068 | | fprintf(stderr,"with OS account(%s).\n", |
| 1069 | | argv[i]); |
| 1070 | | fprintf(stderr,"Wrong rshd ?!\n"); |
| 1071 | | exit(1); |
| 1072 | | } |
| 1073 | | break; |
| 1074 | | #endif |
| 1075 | | |
| 1076 | | default: |
| 1077 | | argv[j++] = argv[i]; |
| 1078 | | } |
| 1079 | | |
| 1080 | | } else { |
| 1081 | | argv[j++] = argv[i]; |
| 1082 | | } |
| 1083 | | } |
| 1084 | | argc = j; |
| 1085 | | |
| 1086 | | if (pvmdebmask) { |
| 1087 | | pvmlogprintf("version %s\n", PVM_VER);
|
| 1088 | | pvmlogprintf("ddpro %d tdpro %d\n", DDPROTOCOL, TDPROTOCOL);
|
| 1089 | | pvmlogprintf("main() debug mask is 0x%x (%s)\n", |
| 1090 | | pvmdebmask, debug_flags(pvmdebmask)); |
| 1091 | | } |
| 1092 | | |
| 1093 | | if (!*name) { |
| 1094 | | if (gethostname(buf, sizeof(buf)-1) == -1) { |
| 1095 | | pvmlogerror("main() can't gethostname()\n"); |
| 1096 | | pvmbailout(0); |
| 1097 | | } |
| 1098 | | name = buf; |
| 1099 | | } |
| 1100 | | if (testmode) { |
| 1101 | | PVM_TIMET time_temp;
|
| 1102 | | gettimeofday(&tnow, (struct timezone*)0); |
| 1103 | | pvmlogprintf("version %s ddpro %d tdpro %d sdpro %d\n", |
| 1104 | | PVM_VER, DDPROTOCOL, TDPROTOCOL, SDPROTOCOL);
|
| 1105 | | time_temp = (PVM_TIMET) tnow.tv_sec;
|
| 1106 | | pvmlogprintf(ctime(&time_temp)); |
| 1107 | | for (i = 0; i < argc; i++) |
| 1108 | | pvmlogprintf("argv[%d]=\"%s\"\n", i, argv[i]); |
| 1109 | | exit(0); |
| 1110 | | } |
| 1111 | | |
| 1112 | | { |
| 1113 | | char *p; |
| 1114 | | if (p = getenv("PVM_MAX_TASKS")) { |
| 1115 | | pvm_max_ntasks = atoi(p); |
| 1116 | | if (pvm_max_ntasks < 0) |
| 1117 | | pvm_max_ntasks = 0; |
| 1118 | | } |
| 1119 | | } |
| 1120 | | |
| 1121 | | if (slavemode) |
| 1122 | | slave_config(name, argc, argv); |
| 1123 | | |
| 1124 | | else |
| 1125 | | master_config(name, argc, argv); |
| 1126 | | |
| 1127 | | #if TTYDIS & 8
|
| 1128 | | setsid(); |
| 1129 | | #endif |
| 1130 | | #if TTYDIS & 4
|
| 1131 | | setpgid(0, 0); |
| 1132 | | #endif |
| 1133 | | #if TTYDIS & 2
|
| 1134 | | setpgrp(0, 0); |
| 1135 | | #endif |
| 1136 | | #if TTYDIS & 1
|
| 1137 | | if ((i = open("/dev/tty", O_RDWR, 0)) != -1) { |
| 1138 | | (void)ioctl(i, TIOCNOTTY, 0); |
| 1139 | | (void)close(i); |
| 1140 | | } |
| 1141 | | #endif |
| 1142 | | |
| 1143 | | myhostpart = hosts->ht_local << (ffs(tidhmask) - 1); |
| 1144 | | pvmmytid = myhostpart | TIDPVMD;
|
| 1145 | | |
| 1146 | | ndead = 1000; |
| 1147 | | |
| 1148 | | |
| 1149 | | |
| 1150 | | deads = TALLOC(ndead, struct deaddata, "dead");
|
| 1151 | | BZERO((char*)deads, ndead * sizeof(struct deaddata));
|
| 1152 | | |
| 1153 | | #ifndef WIN32 |
| 1154 | | |
| 1155 | | |
| 1156 | | #ifndef IMA_I860 |
| 1157 | | #ifdef SYSVSIGNAL |
| 1158 | | #ifndef IMA_BEOSCYLD |
| 1159 | | (void)signal(SIGCLD, reap);
|
| 1160 | | #endif |
| 1161 | | #ifdef IMA_SUNMP |
| 1162 | | sigset(SIGCLD, reap); |
| 1163 | | #endif |
| 1164 | | #else |
| 1165 | | (void)signal(SIGCHLD, reap); |
| 1166 | | #endif |
| 1167 | | #endif |
| 1168 | | |
| 1169 | | #endif |
| 1170 | | |
| 1171 | | if (signal(SIGINT, SIG_IGN) != SIG_IGN)
|
| 1172 | | #ifdef WIN32 |
| 1173 | | (void)signal(SIGINT, (void*) catch); |
| 1174 | | #else |
| 1175 | | (void)signal(SIGINT, catch);
|
| 1176 | | #endif |
| 1177 | | |
| 1178 | | if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
|
| 1179 | | #ifdef WIN32 |
| 1180 | | (void)signal(SIGTERM, (void *) catch); |
| 1181 | | #else |
| 1182 | | (void)signal(SIGTERM, catch);
|
| 1183 | | #endif |
| 1184 | | |
| 1185 | | #ifndef WIN32 |
| 1186 | | (void)signal(SIGHUP, SIG_IGN);
|
| 1187 | | (void)signal(SIGPIPE, SIG_IGN);
|
| 1188 | | #endif |
| 1189 | | |
| 1190 | | #ifndef WIN32 |
| 1191 | | (void)signal(SIGFPE, evilsig);
|
| 1192 | | (void)signal(SIGILL, evilsig);
|
| 1193 | | #else |
| 1194 | | (void)signal(SIGFPE, (void *)evilsig); |
| 1195 | | (void)signal(SIGILL, (void *)evilsig); |
| 1196 | | #endif |
| 1197 | | |
| 1198 | | #ifdef SIGBUS
|
| 1199 | | (void)signal(SIGBUS, evilsig);
|
| 1200 | | #endif |
| 1201 | | |
| 1202 | | #ifndef WIN32 |
| 1203 | | (void)signal(SIGSEGV, evilsig);
|
| 1204 | | #else |
| 1205 | | (void)signal(SIGSEGV, (void *)evilsig); |
| 1206 | | #endif |
| 1207 | | |
| 1208 | | #ifdef SIGSYS
|
| 1209 | | (void)signal(SIGSYS, evilsig);
|
| 1210 | | #endif |
| 1211 | | |
| 1212 | | #ifdef SIGDANGER |
| 1213 | | (void)signal(SIGDANGER, biteme); |
| 1214 | | #endif |
| 1215 | | |
| 1216 | | #ifdef STATISTICS |
| 1217 | | reset_statistics(); |
| 1218 | | #endif |
| 1219 | | |
| 1220 | | task_init(); |
| 1221 | | wait_init(myhostpart, TIDLOCAL);
|
| 1222 | | mb_init(); |
| 1223 | | ppi_init(); |
| 1224 | | |
| 1225 | | opq = pk_new(0); |
| 1226 | | opq->pk_tlink = opq->pk_trlink = opq; |
| 1227 | | |
| 1228 | | |
| 1229 | | |
| 1230 | | if (!slavemode) { |
| 1231 | | printf("%s\n", getenv("PVMSOCK")); |
| 1232 | | fflush(stdout); |
| 1233 | | } |
| 1234 | | |
| 1235 | | |
| 1236 | | |
| 1237 | | if (!slavemode && filehosts) { |
| 1238 | | struct hostd *hp; |
| 1239 | | int hh; |
| 1240 | | int n = 0; |
| 1241 | | |
| 1242 | | for (hh = filehosts->ht_last; hh >= 1; hh--) |
| 1243 | | if ((hp = filehosts->ht_hosts[hh]) && !(hp->hd_flag & HF_NOSTART))
|
| 1244 | | n++; |
| 1245 | | if (n) { |
| 1246 | | addmesg = mesg_new(0); |
| 1247 | | addmesg->m_tag = DM_ADD;
|
| 1248 | | pkint(addmesg, n); |
| 1249 | | for (hh = 1; hh <= filehosts->ht_last; hh++) |
| 1250 | | if ((hp = filehosts->ht_hosts[hh]) && !(hp->hd_flag & HF_NOSTART))
|
| 1251 | | pkstr(addmesg, hp->hd_name); |
| 1252 | | addmesg->m_dst = TIDPVMD;
|
| 1253 | | } |
| 1254 | | } |
| 1255 | | |
| 1256 | | work(); |
| 1257 | | pvmbailout(0); |
| 1258 | | exit(0); |
| 1259 | | } |