#! /bin/bash
#
# Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
# Author: chengjike
# Copy a file, converting and formatting according to the operands..
#

BASIC_LIB_DIR=${BASIC_LIB_DIR="/UltraPath_NVMe/install/linuxTools/globalLib"}
BASIC_LIBFILE=${BASIC_LIBFILE="${BASIC_LIB_DIR}/basic_lib.sh"}
if [ -f "${BASIC_LIBFILE}" ]; then
    . "${BASIC_LIBFILE}"
else
    echo -e "ERROR: not found the lib[${BASIC_LIBFILE}]."
    exit 1
fi

function updd_plus_help()
{
  echo "Usage: updd_plus [OPERAND]..."
  echo "or:  updd_plus OPTION"
  echo "Copy a file, converting and formatting according to the operands."

  echo "bs=BYTES        force ibs=BYTES and obs=BYTES"
  echo "cbs=BYTES       convert BYTES bytes at a time"
  echo "conv=CONVS      convert the file as per the comma separated symbol list"
  echo "count=BLOCKS    copy only BLOCKS input blocks"
  echo "ibs=BYTES       read BYTES bytes at a time"
  echo "if=FILE         read from FILE instead of stdin"
  echo "iflag=FLAGS     read as per the comma separated symbol list"
  echo " "
  echo "BLOCKS and BYTES may be followed by the following multiplicative suffixes:"
  echo "xM M, c 1, w 2, b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,"
  echo "GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y."
  echo " "
  echo "Each CONV symbol may be:"

  echo "ascii     from EBCDIC to ASCII"
  echo "ebcdic    from ASCII to EBCDIC"
  echo "ibm       from ASCII to alternate EBCDIC"
  echo "block     pad newline-terminated records with spaces to cbs-size"
  echo "unblock   replace trailing spaces in cbs-size records with newline"
  echo "lcase     change upper case to lower case"
  echo "nocreat   do not create the output file"
  echo "excl      fail if the output file already exists"
  echo "iucase     change lower case to upper case"
  echo "swab      swap every pair of input bytes"
  echo "noerror   continue after read errors"
  echo "sync      pad every input block with NULs to ibs-size; when used"
  echo "          with block or unblock, pad with spaces rather than NULs"
  echo "fdatasync  physically write output file data before finishing"
  echo "fsync     likewise, but also write metadata"
  echo ""
  echo "Each FLAG symbol may be:"

  echo "append    append mode (makes sense only for output; conv=notrunc suggested)"
  echo "direct    use direct I/O for data"
  echo "directory fail unless a directory"
  echo "dsync     use synchronized I/O for data"
  echo "sync      likewise, but also for metadata"
  echo "nonblock  use non-blocking I/O"
  echo "noatime   do not update access time"
  echo "noctty    do not assign controlling terminal from file"
  echo "nofollow  do not follow symlinks"  
  echo ""
  echo "example:"
  echo "updd_plus if=/dev/sdx"
  echo ""
  echo "Options are:"
 
  echo "   --help     display this help and exit"
}

if [ $# -gt 0 ]; then 
    if [ $1 = "--help" ]; then
        updd_plus_help
        exit 1
    fi
fi

DD_STR="dd "
TEST_STR=""
for arg in "$@"
do 
    tmpstr=$(echo ${arg} | cut -c1-3)
    DD_STR=${DD_STR}" "
    if [ "${tmpstr}" = "of=" ]; then  
        diskname=$(echo ${arg} | cut -c4-)
        basic_trace_msg "WARN" "updd_plus: can't open '${diskname}': Function not implemented!" "verbose"
        exit 1
    elif [ "${tmpstr}" = "if=" ]; then
        DD_STR=${DD_STR}${arg}
        DD_STR=${DD_STR}" of=/dev/null"
    else
        DD_STR=${DD_STR}${arg}
    fi
done

TEST_STR=${DD_STR}" count=1 > /dev/null 2>&1"
eval ${TEST_STR}
if [ 0 -eq $? ]; then
    basic_trace_msg "INFO" "execute updd_plus successfully." "verbose"
    eval ${DD_STR}
else
    basic_trace_msg "ERROR" "updd_plus: parameter error: Function not implemented!." "verbose"
fi
exit 0
