@@ -299,7 +299,7 @@ int main(int argc, char* argv[])
299299 inst_mssg (argc, argv);
300300 setsid ();
301301 chdir (" /" );
302- umask (0 );
302+ umask (0077 );
303303 close (STDIN_FILENO);
304304 close (STDOUT_FILENO);
305305 close (STDERR_FILENO);
@@ -952,7 +952,7 @@ type_thread_func monitor(void* arg)
952952 total += 10 ;
953953 break ;
954954 default :
955- snprintf ((sd_bufs + offset), 15 , " Unknown error." );
955+ snprintf ((sd_bufs + offset), 33 , " Unknown error while JOIN_ZONE ." );
956956 break ;
957957 }
958958 } else {
@@ -1006,7 +1006,10 @@ type_thread_func monitor(void* arg)
10061006 }// for MAX_MEMBERS_PER_GROUP
10071007 }// else val_rtn < 0
10081008 } break ;
1009- default : break ;
1009+ default :
1010+ snprintf ((sd_bufs + offset), 24 , " Unknown command [%c]." , sd_bufs[1 ]);
1011+ *length = total = 48 ;
1012+ break ;
10101013 }
10111014 if ((memcmp (g_usrMsg.chk , " P2P" , 4 ) != 0 ) &&
10121015 (send (cur_sock, sd_bufs, total, 0 ) < 0 )) {
@@ -1100,9 +1103,8 @@ int inst_mssg(int argc, char* argv[])
11001103 _beginthreadex (nullptr , 0 , (_beginthreadex_proc_type)commands, nullptr , 0 , &threadid);
11011104 WSADATA wsaData;
11021105 if (WSAStartup (0x202 , &wsaData) == SOCKET_ERROR) {
1103- std::cerr << " WSAStartup failed with error " << WSAGetLastError () << std::endl;
1106+ std::cerr << " WSAStartup failed with error [ " << WSAGetLastError () << " ]( " << errno << " ): " << strerror (errno ) << std::endl;
11041107 WSACleanup ();
1105- std::cerr << " ERROR(" << errno << " ): " << strerror (errno) << std::endl;
11061108 return -1 ;
11071109 }
11081110#else
@@ -1135,7 +1137,7 @@ int inst_mssg(int argc, char* argv[])
11351137#else
11361138 < 0 ) {
11371139#endif
1138- std::cerr << " ERROR(" << errno << " ): " << strerror (errno) << std::endl;
1140+ std::cerr << " ERROR(" << errno << " ) bindport [ " << srvPort << " ] : " << strerror (errno) << std::endl;
11391141 exit (-1 );
11401142 }
11411143 if (listen (listen_socket, 50 )
@@ -1146,7 +1148,7 @@ int inst_mssg(int argc, char* argv[])
11461148#else
11471149 < 0 ) {
11481150#endif
1149- std::cerr << " ERROR(" << errno << " ): " << strerror (errno) << std::endl;
1151+ std::cerr << " ERROR(" << errno << " ) listen [ " << srvPort << " ] : " << strerror (errno) << std::endl;
11501152 exit (-1 );
11511153 }
11521154 int threadCnt = 0 ;
@@ -1174,7 +1176,7 @@ int inst_mssg(int argc, char* argv[])
11741176#else
11751177 < 0 ) {
11761178#endif // use socklen
1177- std::cerr << " ERROR(" << errno << " , " << socklen << " ) : " << strerror (errno) << std::endl;
1179+ std::cerr << " ERROR(" << errno << " ) accept [ " << socklen << " ] : " << strerror (errno) << std::endl;
11781180 return -1 ;
11791181 } else {
11801182 char IPdotDec[16 ];
@@ -1206,7 +1208,7 @@ int inst_mssg(int argc, char* argv[])
12061208#elif !defined SOCK_CONN_TEST || defined SOCK_CONN_TEST
12071209 type_socket msg_socket = accept (listen_socket, (struct sockaddr *)&fromAddr, &socklen);
12081210 if (msg_socket < 0 ) {
1209- std::cerr << " ERROR(" << errno << " ): " << strerror (errno) << std::endl;
1211+ std::cerr << " ERROR(" << errno << " ) accept [ " << listen_socket << " ] : " << strerror (errno) << std::endl;
12101212 return -1 ;
12111213 } else {
12121214 int PID = 0 ;
@@ -1309,24 +1311,51 @@ void func_waitpid(int signo)
13091311#else
13101312 ssize_t total = 0 ;
13111313 char * sock_0 = reinterpret_cast <char *>(&sock);
1312- while (total < (ssize_t )sizeof (sock)) {
1313- ssize_t len = read (g_filedes[0 ], sock_0 + total, sizeof (sock) - total);
1314- if (len < 0 ) {
1315- fprintf (stderr, " Read error: %s\n " , strerror (errno));
1316- break ;
1314+ const ssize_t expect = sizeof (sock);
1315+ while (total < expect && total >= 0 ) {
1316+ ssize_t len = read (g_filedes[0 ], sock_0 + total, expect - total);
1317+ if (len > 0 ) {
1318+ if (total + len > expect) {
1319+ fprintf (stderr, " Buffer overflow prevented: expects %zd, got %zd!\n " , expect, total + len);
1320+ break ;
1321+ }
1322+ total += len;
1323+ continue ;
13171324 }
13181325 if (len == 0 ) {
1319- fprintf (stderr, " Read EOF: expects %zu , got %zd!\n " , sizeof (sock) , total);
1326+ fprintf (stderr, " Read EOF: expects %zd , got %zd!\n " , expect , total);
13201327 break ;
13211328 }
1322- if (total + len > (ssize_t )sizeof (sock)) {
1323- fprintf (stderr, " Buffer overflow prevented: expects %zu, got %zd!\n " , sizeof (sock), total + len);
1324- break ;
1329+ // len < 0: handle transient errors specially
1330+ if (errno == EINTR) {
1331+ // interrupted by signal, retry read
1332+ continue ;
13251333 }
1326- total += len;
1334+ if (errno == EAGAIN || errno == EWOULDBLOCK) {
1335+ // no data available right now; wait briefly for readability
1336+ fd_set rfds;
1337+ FD_ZERO (&rfds);
1338+ FD_SET (g_filedes[0 ], &rfds);
1339+ timeval tv;
1340+ tv.tv_sec = 1 ;
1341+ tv.tv_usec = 0 ;
1342+ int sel = select (g_filedes[0 ] + 1 , &rfds, NULL , NULL , &tv);
1343+ if (sel > 0 ) {
1344+ // socket ready, retry read
1345+ continue ;
1346+ } else if (sel == 0 ) {
1347+ fprintf (stderr, " Read timeout on pipe: expects %zd, got %zd!\n " , expect, total);
1348+ break ;
1349+ } else {
1350+ // select error; fall through to error reporting
1351+ }
1352+ }
1353+ // fatal read error
1354+ fprintf (stderr, " Read error: %s\n " , strerror (errno));
1355+ break ;
13271356 }
1328- if (total != ( ssize_t ) sizeof (sock) ) {
1329- fprintf (stderr, " Read size mismatch: expects %zu , got %zd!\n " , sizeof (sock) , total);
1357+ if (total != expect ) {
1358+ fprintf (stderr, " Read size mismatch: expects %zd , got %zd!\n " , expect , total);
13301359 break ;
13311360 }
13321361#endif
0 commit comments