- {
- fprintf (stderr,
- "Internal error converting dummy IP to binary.\n");
- return 2;
- }
- if (-1 == (icmpsock = make_icmp_socket()))
- {
- return 3;
- }
- if (-1 == (rawsock = make_raw_socket()))
- {
- close (icmpsock);
- return 3;
- }
- uid = getuid ();
- if (0 != setresuid (uid, uid, uid))
- {
- fprintf (stderr,
- "Failed to setresuid: %s\n",
- strerror (errno));
- /* not critical, continue anyway */
- }
- if (-1 == (udpsock = make_udp_socket(&external)))
- {
- close (icmpsock);
- close (rawsock);
- return 3;
- }
+ {
+ fprintf (stderr, "Internal error converting dummy IP to binary.\n");
+ global_ret = 5;
+ goto error_exit;
+ }
+
+ /* error checking icmpsock */
+ if (-1 == icmpsock)
+ {
+ fprintf (stderr, "Error opening RAW socket: %s\n", strerror (icmp_eno));
+ global_ret = 6;
+ goto error_exit;
+ }
+ if (icmpsock >= FD_SETSIZE)
+ {
+ /* this could happen if we were started with a large number of already-open
+ file descriptors... */
+ fprintf (stderr, "Socket number too large (%d > %u)\n", icmpsock,
+ (unsigned int) FD_SETSIZE);
+ global_ret = 7;
+ goto error_exit;
+ }
+
+ /* error checking rawsock */
+ if (-1 == rawsock)
+ {
+ fprintf (stderr, "Error opening RAW socket: %s\n", strerror (raw_eno));
+ global_ret = 8;
+ goto error_exit;
+ }
+ /* no need to check 'rawsock' against FD_SETSIZE as it is never used
+ with 'select' */
+
+ if (0 != setup_raw_socket ())
+ {
+ global_ret = 9;
+ goto error_exit;
+ }
+
+ if (-1 == (udpsock = make_udp_socket (&external)))
+ {
+ global_ret = 10;
+ goto error_exit;
+ }
+