#!/bin/sh
#---------------------------------------------------------
# dump_core.sh - script for generating runnning/suspended core dump
#
# Copyright (c) 2000-2015, 2017, 2019 by cisco Systems, Inc.
#---------------------------------------------------------
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin

default_path=$1
if [ ! -d ${default_path} ]; then
    mkdir -p ${default_path}
fi
cd ${default_path}

if [ -x /pkg/bin/uname ]; then
    node=$(/pkg/bin/uname -n)
else
    node=$(uname -n)
fi

node=${node%%.*}

if [ "$2" = "by_pid" ]; then
    by_pid="$2"
    pids="$3"
    type="$4"
    if [ -e /proc/${pids}/cmdline ] ; then
        # cmdline is a null-separated list - we only want the first
        # element. There must be a simpler way to do this...
        CMDL=`cat /proc/${pids}/cmdline | tr '\000' '\n'`
        for X in $CMDL ; do
            process_name=$X
            break
        done
    else
        echo "Pid \"$pids\" not found." 1>&2
        exit 1
    fi
else
    process_name="$2"
    type="$3"
    pids=$(pidof "$process_name")

    if [ -z "$pids" ]; then
        echo "Process \"$process_name\" not found." 1>&2
        exit 1
    fi
fi

echo $pids | tr \  \\n | while read process_id
do
    md5=$(md5sum /proc/${process_id}/exe | cut -c28-32)
    timestamp=$(date '+%Y%m%d-%H%M%S')
    name="${process_name}_${process_id}.by.user.${timestamp}.${node}.${md5}.core"
    tmpname=${name}.tmp
    if [ -x /usr/bin/ccore ]; then
        if [ x"$type" = x"running" ]; then
            RUNNING_OPT=-r
        else
            RUNNING_OPT=
        fi
        ccore $RUNNING_OPT -z1 -o $tmpname.gz $process_id && mv $tmpname.gz $name.gz
    else
        /usr/bin/gdb_gcore.sh -o $name $process_id
        gzip -f ${name}_${process_id}
        mv ${name}_${process_id}.gz ${name}.gz
    fi

    retval=$?
    kill -CONT $process_id
    exit $retval
done
