GSS-API のプログラミング

main()

main() はプログラムのエントリポイントです。次に、コマンド行構文を示します。



gss-server [-port port] [-d] [-mech mech] host service msg

コマンド行を解析した後、main() は (指定されていれば) 希望のセキュリティ機構名を OID に変換し、資格を獲得し、コンテキストを確立し、データを受信し、そして、必要であれば機構 OID を破棄します。


注 –

通常、アプリケーションは機構を設定せずに、GSS-API が提供するデフォルトを使用するべきです。



例 A–9 main()


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 {
                 /* TCP 接続を受け入れる */
                 if ((s = accept(stmp, NULL, 0)) < 0) {
                     perror("accepting connection");
                 } else {
                     /* 失敗したとしても有効な対処はここではできないため、
                         この戻り値は検査されない */
                     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;
}