github.com/meulengracht/snapd@v0.0.0-20210719210640-8bde69bcc84e/cmd/libsnap-confine-private/panic.c (about)

     1  /*
     2   * Copyright (C) 2019 Canonical Ltd
     3   *
     4   * This program is free software: you can redistribute it and/or modify
     5   * it under the terms of the GNU General Public License version 3 as
     6   * published by the Free Software Foundation.
     7   *
     8   * This program is distributed in the hope that it will be useful,
     9   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11   * GNU General Public License for more details.
    12   *
    13   * You should have received a copy of the GNU General Public License
    14   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15   *
    16   */
    17  
    18  #include "panic.h"
    19  
    20  #include <errno.h>
    21  #include <stdarg.h>
    22  #include <stdio.h>
    23  #include <stdlib.h>
    24  #include <string.h>
    25  #include <unistd.h>
    26  
    27  static sc_panic_exit_fn panic_exit_fn = NULL;
    28  static sc_panic_msg_fn panic_msg_fn = NULL;
    29  
    30  void sc_panic(const char *fmt, ...) {
    31      va_list ap;
    32      va_start(ap, fmt);
    33      sc_panicv(fmt, ap);
    34      va_end(ap);
    35  }
    36  
    37  void sc_panicv(const char *fmt, va_list ap) {
    38      int errno_copy = errno;
    39  
    40      if (panic_msg_fn != NULL) {
    41          panic_msg_fn(fmt, ap, errno_copy);
    42      } else {
    43          vfprintf(stderr, fmt, ap);
    44          if (errno != 0) {
    45              fprintf(stderr, ": %s\n", strerror(errno_copy));
    46          } else {
    47              fprintf(stderr, "\n");
    48          }
    49      }
    50  
    51      if (panic_exit_fn != NULL) {
    52          panic_exit_fn();
    53      }
    54      exit(1);
    55  }
    56  
    57  sc_panic_exit_fn sc_set_panic_exit_fn(sc_panic_exit_fn fn) {
    58      sc_panic_exit_fn old = panic_exit_fn;
    59      panic_exit_fn = fn;
    60      return old;
    61  }
    62  
    63  sc_panic_msg_fn sc_set_panic_msg_fn(sc_panic_msg_fn fn) {
    64      sc_panic_msg_fn old = panic_msg_fn;
    65      panic_msg_fn = fn;
    66      return old;
    67  }