#! /bin/sh
##
 # rmmproc.messageid -- tries to back up each message/file to a file
 #                      that's named based on Message ID
 #
 # This code is Copyright (c) 2013, by the authors of nmh.
 # See the COPYRIGHT file in the root directory of the nmh
 # distribution for complete copyright information.
 #
 # If called on messages, the current directory is the message folder
 # and the script arguments are the message filenames.  If called on
 # files, the arguments are the full paths to the files.
 #
 # The backup directory will be:
 #   1) If input is messages, the folder of the messages.
 #   2) If input is files, the directories of the files.
 #   3) If input is standard input (-), the user's MHPATH directory.
 #
 # Each backup filename will be:
 #   1) Message-ID with all / and \ converted to periods.
 #      Message-IDs should not contain \, but some filesystems can't
 #      handle them.  Message-IDs should be unique, so there should be
 #      no need to backup a file with the same name, especially if the
 #      result of malicious action.  If the backup file already
 #      exists, use 2).
 #      NOTE: conversion of some characters in the filename could
 #      result in an unintended name collision.  If that is a concern,
 #      a program that uses mkstemp(3) to create a temporary file might
 #      be the basis for a remedy.
 #   2) Concatenation of BACKUP_PREFIX and input filename.
 #      NOTE: if a file of that name already exists in the destination
 #      directory, it will be overwritten by the mv below.
##

for i in "$@"; do
    if [ "$i" = - ]; then
        #### Input is stdin; put backup in user's MHPATH directory.
        dir=`mhparam path`
        #### If Path is relative, prepend home directory.
        [ `dirname "$dir"` = . ]  &&  dir="$HOME/$dir"
    else
        dir=`dirname "$i"`
    fi

    #### Extract first Message-Id, remove <>, substitute / and \.
    messageid=`sed -n '
        /^$/q; /^[Mm][Ee][Ss][Ss][Aa][Gg][Ee]-[Ii][Dd]:/!d
        s/>.*//; s/.*<//; y#/\\\#..#; p
        ' "$i"`

    if [ "$messageid"  -a  ! -f "$dir/$messageid" ]; then
        filename="$dir/$messageid"
    else
        #### `mhparam sbackup` is usually ',' but depends on configuration.
        filename="$dir"/`mhparam sbackup``basename "$i"`
    fi

    mv "$i" "$filename"  ||  status=1
done

exit $status
