tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

exit.c (2666B)


      1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #include "prio.h"
      7 #include "prprf.h"
      8 #include "prinit.h"
      9 #include "prthread.h"
     10 #include "prproces.h"
     11 #include "prinrval.h"
     12 
     13 #include "plgetopt.h"
     14 
     15 #include <stdlib.h>
     16 
     17 static PRInt32 dally = 0;
     18 static PRFileDesc* err = NULL;
     19 static PRBool verbose = PR_FALSE, force = PR_FALSE;
     20 
     21 static void Help(void) {
     22  PR_fprintf(err, "Usage: [-t s] [-h]\n");
     23  PR_fprintf(err, "\t-d   Verbose output              (default: FALSE)\n");
     24  PR_fprintf(err, "\t-x   Forced termination          (default: FALSE)\n");
     25  PR_fprintf(err, "\t-t   Time for thread to block    (default: 10 seconds)\n");
     26  PR_fprintf(err, "\t-h   This message and nothing else\n");
     27 } /* Help */
     28 
     29 static void Dull(void* arg) {
     30  PR_Sleep(PR_SecondsToInterval(dally));
     31  if (verbose && force) {
     32    PR_fprintf(err, "If you see this, the test failed\n");
     33  }
     34 } /* Dull */
     35 
     36 static PRIntn PR_CALLBACK RealMain(PRIntn argc, char** argv) {
     37  PLOptStatus os;
     38  PLOptState* opt = PL_CreateOptState(argc, argv, "ht:dx");
     39 
     40  err = PR_GetSpecialFD(PR_StandardError);
     41 
     42  while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) {
     43    if (PL_OPT_BAD == os) {
     44      continue;
     45    }
     46    switch (opt->option) {
     47      case 'd': /* verbosity */
     48        verbose = PR_TRUE;
     49        break;
     50      case 'x': /* force exit */
     51        force = PR_TRUE;
     52        break;
     53      case 't': /* seconds to dally in child */
     54        dally = atoi(opt->value);
     55        break;
     56      case 'h': /* user wants some guidance */
     57      default:
     58        Help();   /* so give him an earful */
     59        return 2; /* but not a lot else */
     60    }
     61  }
     62  PL_DestroyOptState(opt);
     63 
     64  if (0 == dally) {
     65    dally = 10;
     66  }
     67 
     68  /*
     69   * Create LOCAL and GLOBAL threads
     70   */
     71  (void)PR_CreateThread(PR_USER_THREAD, Dull, NULL, PR_PRIORITY_NORMAL,
     72                        PR_LOCAL_THREAD, PR_UNJOINABLE_THREAD, 0);
     73 
     74  (void)PR_CreateThread(PR_USER_THREAD, Dull, NULL, PR_PRIORITY_NORMAL,
     75                        PR_GLOBAL_THREAD, PR_UNJOINABLE_THREAD, 0);
     76 
     77  if (verbose)
     78    PR_fprintf(err, "Main is exiting now. Program should exit %s.\n",
     79               (force) ? "immediately" : "after child dally time");
     80 
     81  if (force) {
     82    PR_ProcessExit(0);
     83    if (verbose) {
     84      PR_fprintf(err, "You should not have gotten here.\n");
     85      return 1;
     86    }
     87  }
     88  return 0;
     89 }
     90 
     91 int main(int argc, char** argv) {
     92  PRIntn rv;
     93 
     94  rv = PR_Initialize(RealMain, argc, argv, 0);
     95  return rv;
     96 } /* main */