This is the entrypoint to the program. The program takes the following syntax on the command line:
gss-server [-port port] [-d] [-mech mech] host service msg |
After parsing the command line, main() converts the name of the desired security mechanism (if provided) to an OID, acquires credentials, establishes a context and receives data, and then destroys the mechanism OID if necessary.
Applications should normally not set the mechanism, but use defaults provided by the GSS-API.
int main(argc, argv) int argc; char **argv; { char *service_name, *mechType = NULL; gss_cred_id_t server_creds; OM_uint32 min_stat; u_short port = 4444; int s; int once = 0; int do_inetd = 0; log = stdout; display_file = stdout; argc--; argv++; while (argc) { if (strcmp(*argv, "-port") == 0) { argc--; argv++; if (!argc) usage(); port = atoi(*argv); } else if (strcmp(*argv, "-verbose") == 0) { verbose = 1; } else if (strcmp(*argv, "-once") == 0) { once = 1; } else if (strcmp(*argv, "-inetd") == 0) { do_inetd = 1; } else if (strcmp(*argv, "-mech") == 0) { argc--; argv++; if (!argc) usage(); mechType = *argv; } else if (strcmp(*argv, "-logfile") == 0) { argc--; argv++; if (!argc) usage(); log = fopen(*argv, "a"); display_file = log; if (!log) { perror(*argv); exit(1); } } else break; argc--; argv++; } if (argc != 1) usage(); if ((*argv)[0] == '-') usage(); service_name = *argv; if (mechType != NULL) { if ((g_mechOid = createMechOid(mechType)) == NULL) { usage(); exit(-1); } } if (server_acquire_creds(service_name, g_mechOid, &server_creds) < 0) return -1; if (do_inetd) { close(1); close(2); sign_server(0, server_creds); close(0); } else { int stmp; if ((stmp = create_socket(port))) { do { /* Accept a TCP connection */ if ((s = accept(stmp, NULL, 0)) < 0) { perror("accepting connection"); } else { /* this return value is not checked, because there's not really anything to do if it fails */ sign_server(s, server_creds); } } while (!once); } close(stmp); } (void) gss_release_cred(&min_stat, &server_creds); if (g_mechOid != GSS_C_NULL_OID) gss_release_oid(&min_stat, &g_mechOid); /*NOTREACHED*/ (void) close(s); return 0; }