void mini_inetd (int port) { int err; struct addrinfo *ai, hints; char portstr[NI_MAXSERV]; memset (&hints, 0, sizeof(hints)); hints.ai_flags = AI_PASSIVE; hints.ai_socktype = SOCK_STREAM; hints.ai_family = PF_INET; snprintf (portstr, sizeof(portstr), "%d", ntohs(port)); err=getaddrinfo (NULL, portstr, &hints, &ai); mini_inetd_addrinfo(ai); freeaddrinfo(ai); }
void ROKEN_LIB_FUNCTION mini_inetd (int port) { int error; struct addrinfo *ai, hints; char portstr[NI_MAXSERV]; memset (&hints, 0, sizeof(hints)); hints.ai_flags = AI_PASSIVE; hints.ai_socktype = SOCK_STREAM; hints.ai_family = PF_UNSPEC; snprintf (portstr, sizeof(portstr), "%d", ntohs(port)); error = getaddrinfo (NULL, portstr, &hints, &ai); if (error) errx (1, "getaddrinfo: %s", gai_strerror (error)); mini_inetd_addrinfo(ai); freeaddrinfo(ai); }
int main(int argc, char **argv) { int optind = 0; int on = 1; setprogname (argv[0]); roken_openlog ("rshd", LOG_ODELAY | LOG_PID, LOG_AUTH); if (getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)) usage(1); if(do_help) usage (0); if (do_version) { print_version(NULL); exit(0); } #if defined(KRB5) if (do_encrypt) do_kerberos = 1; if(do_kerberos) do_kerberos = DO_KRB5; #endif #ifdef KRB5 if((do_kerberos & DO_KRB5) && krb5_init_context (&context) != 0) do_kerberos &= ~DO_KRB5; #endif if (!do_inetd) { int error; struct addrinfo *ai = NULL, hints; char portstr[NI_MAXSERV]; memset (&hints, 0, sizeof(hints)); hints.ai_flags = AI_PASSIVE; hints.ai_socktype = SOCK_STREAM; hints.ai_family = PF_UNSPEC; if(port_str != NULL) { error = getaddrinfo (NULL, port_str, &hints, &ai); if (error) errx (1, "getaddrinfo: %s", gai_strerror (error)); } if (ai == NULL) { #if defined(KRB5) if (do_kerberos) { if (do_encrypt) { error = getaddrinfo(NULL, "ekshell", &hints, &ai); if(error == EAI_NONAME) { snprintf(portstr, sizeof(portstr), "%d", 545); error = getaddrinfo(NULL, portstr, &hints, &ai); } if(error) errx (1, "getaddrinfo: %s", gai_strerror (error)); } else { error = getaddrinfo(NULL, "kshell", &hints, &ai); if(error == EAI_NONAME) { snprintf(portstr, sizeof(portstr), "%d", 544); error = getaddrinfo(NULL, portstr, &hints, &ai); } if(error) errx (1, "getaddrinfo: %s", gai_strerror (error)); } } else #endif { error = getaddrinfo(NULL, "shell", &hints, &ai); if(error == EAI_NONAME) { snprintf(portstr, sizeof(portstr), "%d", 514); error = getaddrinfo(NULL, portstr, &hints, &ai); } if(error) errx (1, "getaddrinfo: %s", gai_strerror (error)); } } mini_inetd_addrinfo (ai, NULL); freeaddrinfo(ai); } if (do_keepalive && setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on)) < 0) syslog(LOG_WARNING, "setsockopt (SO_KEEPALIVE): %s", strerror(errno)); /* set SO_LINGER? */ signal (SIGPIPE, SIG_IGN); doit (); return 0; }