//
// aegis - project change supervisor
// Copyright (C) 1999, 2001-2006, 2008 Peter Miller
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see
// .
//
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
input_cpio *
aedist_open(const nstring &ifr, nstring *subject_p)
{
//
// Open the input file and verify the format.
//
os_become_orig();
input ifp = input_file_open(ifr);
rfc822 hdr;
hdr.load(ifp, true);
nstring s = hdr.get("mime-version");
if (!s.empty())
{
s = hdr.get("content-type");
if (s != "application/aegis-change-set")
ifp->fatal_error("wrong content type");
}
//
// Deal with the content encoding.
//
s = hdr.get("content-transfer-encoding");
if (!s.empty())
{
static nstring base64("base64");
static nstring uuencode("uuencode");
//
// We could cope with other encodings here,
// if we ever need to.
//
if (s == base64)
{
//
// The rest of the input is in base64 encoding.
//
ifp = new input_base64(ifp);
}
else if (s == uuencode)
{
//
// The rest of the input is uuencoded.
//
ifp = new input_uudecode(ifp);
}
else
{
sub_context_ty sc;
sc.var_set_string("Name", s);
string_ty *tmp =
sc.subst_intl(i18n("content transfer encoding $name unknown"));
ifp->fatal_error(tmp->str_text);
str_free(tmp);
}
}
//
// The contents we are interested in are
// a gzipped cpio archive.
//
ifp = input_gunzip_open(ifp);
ifp = input_bunzip2_open(ifp);
input_cpio *cpio_p = new input_cpio(ifp);
os_become_undo();
//
// Set the subject if they are interested.
//
if (subject_p)
{
s = hdr.get("subject");
if (!s.empty())
*subject_p = s;
else
*subject_p = "No Subject";
}
//
// clean up and go home
//
return cpio_p;
}