与所有 C 程序一样,该程序的外部 shell 也包含在入口点函数 main() 中。main() 可执行以下四种功能:
解析命令行参数并为变量指定参数。
如果要使用缺省机制以外的机制,则调用 parse_oid() 来创建 GSS-API OID(即对象标识符)。对象标识符来自安全机制的名称,前提是已经提供了机制名称。
调用 call_server(),这会实际创建上下文并发送数据。
发送数据之后,根据需要释放 OID 的存储空间。
int main(argc, argv) int argc; char **argv; { char *msg; char service_name[128]; char hostname[128]; char *mechanism = 0; u_short port = 4444; int use_file = 0; OM_uint32 deleg_flag = 0, min_stat; display_file = stdout; /* Parse command-line arguments. */ argc--; argv++; while (argc) { if (strcmp(*argv, "-port") == 0) { argc--; argv++; if (!argc) usage(); port = atoi(*argv); } else if (strcmp(*argv, "-mech") == 0) { argc--; argv++; if (!argc) usage(); mechanism = *argv; } else if (strcmp(*argv, "-d") == 0) { deleg_flag = GSS_C_DELEG_FLAG; } else if (strcmp(*argv, "-f") == 0) { use_file = 1; } else break; argc--; argv++; } if (argc != 3) usage(); if (argc > 1) { strcpy(hostname, argv[0]); } else if (gethostname(hostname, sizeof(hostname)) == -1) { perror("gethostname"); exit(1); } if (argc > 2) { strcpy(service_name, argv[1]); strcat(service_name, "@"); strcat(service_name, hostname); } msg = argv[2]; /* Create GSSAPI object ID. */ if (mechanism) parse_oid(mechanism, &g_mechOid); /* Call server to create context and send data. */ if (call_server(hostname, port, g_mechOid, service_name, deleg_flag, msg, use_file) < 0) exit(1); /* Release storage space for OID, if still allocated */ if (g_mechOid != GSS_C_NULL_OID) (void) gss_release_oid(&min_stat, &gmechOid); return 0; }