mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
Initial s390-tools-2.0.0 import
This commit is based on the s390-tools-1.39.0 version. Changes on top of s390-tools-1.39.0: - Add MIT license to all source files - Add LICENSE file - Transform REAMDE to README.md (markdown) - Add AUTHORS.md file - Add CONTRIBUTING.md file - Move changelog from README to CHANGELOG.md file Reviewed-by: Stefan Haberland <sth@linux.vnet.ibm.com> Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
This commit is contained in:
@@ -0,0 +1,191 @@
|
||||
/*
|
||||
* zgetdump - Tool for copying and converting System z dumps
|
||||
*
|
||||
* Main functions
|
||||
*
|
||||
* Copyright IBM Corp. 2001, 2017
|
||||
*
|
||||
* s390-tools is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See LICENSE for details.
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <linux/fs.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mtio.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "zgetdump.h"
|
||||
|
||||
/*
|
||||
* Globals
|
||||
*/
|
||||
struct zgetdump_globals g;
|
||||
|
||||
/*
|
||||
* Signal handler for exiting zgetdump (the atexit handler will do the work)
|
||||
*/
|
||||
static void sig_exit(int sig)
|
||||
{
|
||||
(void) sig;
|
||||
|
||||
STDERR("\n"); /* E.g. to get newline after '^C' */
|
||||
ERR_EXIT("Got signal %i, exiting...", sig);
|
||||
}
|
||||
|
||||
/*
|
||||
* Install signal handler
|
||||
*/
|
||||
static void sig_handler_init(void)
|
||||
{
|
||||
struct sigaction sigact;
|
||||
|
||||
/* Ignore signals SIGUSR1 and SIGUSR2 */
|
||||
if (sigemptyset(&sigact.sa_mask) < 0)
|
||||
goto fail;
|
||||
sigact.sa_handler = SIG_IGN;
|
||||
if (sigaction(SIGUSR1, &sigact, NULL) < 0)
|
||||
goto fail;
|
||||
if (sigaction(SIGUSR2, &sigact, NULL) < 0)
|
||||
goto fail;
|
||||
|
||||
/* Exit on SIGINT, SIGTERM, SIGHUP, ... */
|
||||
if (sigemptyset(&sigact.sa_mask) < 0)
|
||||
goto fail;
|
||||
sigact.sa_handler = sig_exit;
|
||||
if (sigaction(SIGINT, &sigact, NULL) < 0)
|
||||
goto fail;
|
||||
if (sigaction(SIGTERM, &sigact, NULL) < 0)
|
||||
goto fail;
|
||||
if (sigaction(SIGHUP, &sigact, NULL) < 0)
|
||||
goto fail;
|
||||
if (sigaction(SIGQUIT, &sigact, NULL) < 0)
|
||||
goto fail;
|
||||
if (sigaction(SIGALRM, &sigact, NULL) < 0)
|
||||
goto fail;
|
||||
if (sigaction(SIGPIPE, &sigact, NULL) < 0)
|
||||
goto fail;
|
||||
return;
|
||||
fail:
|
||||
ERR_EXIT_ERRNO("Could not initialize signal handler");
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if dump contains kdump dump and production system dump
|
||||
*/
|
||||
static void kdump_select_check(void)
|
||||
{
|
||||
static char *msg =
|
||||
"The dump contains \"kdump\" and \"production system\"\n"
|
||||
" Access \"production system\" with \"-s prod\"\n"
|
||||
" Access \"kdump\" with \"-s kdump\"\n"
|
||||
" Access the complete dump with \"-s all\"\n"
|
||||
" Send both dumps to your service organization";
|
||||
|
||||
if (g.opts.select_specified)
|
||||
return;
|
||||
if (!dfi_kdump_base())
|
||||
return;
|
||||
ERR_EXIT("%s", msg);
|
||||
}
|
||||
|
||||
/*
|
||||
* Run "--umount" action
|
||||
*/
|
||||
static int do_umount(void)
|
||||
{
|
||||
zfuse_umount();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Run "--device" action
|
||||
*/
|
||||
static int do_device_info(void)
|
||||
{
|
||||
dt_init();
|
||||
dt_info_print();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Run "--info" action
|
||||
*/
|
||||
static int do_dump_info(void)
|
||||
{
|
||||
if (dfi_init() != 0) {
|
||||
dfi_info_print();
|
||||
STDERR("\nERROR: Dump is not complete\n");
|
||||
zg_exit(1);
|
||||
}
|
||||
kdump_select_check();
|
||||
dfi_info_print();
|
||||
dfi_exit();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Run "--mount" action
|
||||
*/
|
||||
static int do_mount(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (dfi_init() != 0)
|
||||
ERR_EXIT("Dump cannot be processed (is not complete)");
|
||||
dfo_init();
|
||||
kdump_select_check();
|
||||
rc = zfuse_mount_dump();
|
||||
dfi_exit();
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Run "copy to stdout" action
|
||||
*/
|
||||
static int do_stdout(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (dfi_init() != 0)
|
||||
ERR_EXIT("Dump cannot be processed (is not complete)");
|
||||
dfo_init();
|
||||
kdump_select_check();
|
||||
rc = stdout_write_dump();
|
||||
dfi_exit();
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* The zgetdump main function
|
||||
*/
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
sig_handler_init();
|
||||
opts_parse(argc, argv);
|
||||
|
||||
switch (g.opts.action) {
|
||||
case ZG_ACTION_STDOUT:
|
||||
return do_stdout();
|
||||
case ZG_ACTION_DUMP_INFO:
|
||||
return do_dump_info();
|
||||
case ZG_ACTION_DEVICE_INFO:
|
||||
return do_device_info();
|
||||
case ZG_ACTION_MOUNT:
|
||||
return do_mount();
|
||||
case ZG_ACTION_UMOUNT:
|
||||
return do_umount();
|
||||
}
|
||||
ABORT("Invalid action: %i", g.opts.action);
|
||||
}
|
||||
Reference in New Issue
Block a user