Browse Source

Use mkstemp() in apt-extracttemplaes (closes: #741627)

Use mkstemp() in apt-extractemplates and add a integrationtest
for apt-extracttemplates too. Thanks to Steve Kemp for the report.
tags/debian/1.0
Michael Vogt 7 years ago
parent
commit
8d50b63f28
4 changed files with 57 additions and 8 deletions
  1. +9
    -6
      cmdline/apt-extracttemplates.cc
  2. +2
    -2
      doc/apt-extracttemplates.1.xml
  3. +1
    -0
      test/integration/framework
  4. +45
    -0
      test/integration/test-apt-extracttemplates

+ 9
- 6
cmdline/apt-extracttemplates.cc View File

@@ -37,6 +37,7 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

#include "apt-extracttemplates.h"

@@ -239,23 +240,25 @@ static int ShowHelp(void)
static string WriteFile(const char *package, const char *prefix, const char *data)
{
char fn[512];
static int i;

std::string tempdir = GetTempDir();
snprintf(fn, sizeof(fn), "%s/%s.%s.%u%d",
snprintf(fn, sizeof(fn), "%s/%s.%s.XXXXXX",
_config->Find("APT::ExtractTemplates::TempDir",
tempdir.c_str()).c_str(),
package, prefix, getpid(), i++);
package, prefix);
FileFd f;
if (data == NULL)
data = "";

if (!f.Open(fn, FileFd::WriteTemp, 0600))
int fd = mkstemp(fn);
if (fd < 0) {
_error->Errno("ofstream::ofstream",_("Unable to mkstemp %s"),fn);
return string();
}
if (!f.OpenDescriptor(fd, FileFd::WriteOnly, FileFd::None, true))
{
_error->Errno("ofstream::ofstream",_("Unable to write to %s"),fn);
return string();
}

f.Write(data, strlen(data));
f.Close();
return fn;


+ 2
- 2
doc/apt-extracttemplates.1.xml View File

@@ -47,8 +47,8 @@
<para>template-file and config-script are written to the temporary directory
specified by the <option>-t</option> or <option>--tempdir</option>
(<literal>APT::ExtractTemplates::TempDir</literal>) directory,
with filenames of the form <filename>package.template.XXXX</filename> and
<filename>package.config.XXXX</filename></para>
with filenames of the form <filename>package.template.XXXXXX</filename> and
<filename>package.config.XXXXXX</filename></para>
</refsect1>
<refsect1><title>options</title>


+ 1
- 0
test/integration/framework View File

@@ -118,6 +118,7 @@ apt() { runapt apt "$@"; }
apthelper() { runapt "${APTHELPERBINDIR}/apt-helper" "$@"; }
aptwebserver() { runapt "${APTWEBSERVERBINDIR}/aptwebserver" "$@"; }
aptitude() { runapt aptitude "$@"; }
aptextracttemplates() { runapt apt-extracttemplates "$@"; }

dpkg() {
command dpkg --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log "$@"


+ 45
- 0
test/integration/test-apt-extracttemplates View File

@@ -0,0 +1,45 @@
#!/bin/sh
set -e

TESTDIR=$(readlink -f $(dirname $0))
. $TESTDIR/framework

setupenvironment
configarchitecture 'amd64'

# apt-extracttemplates needs this
insertinstalledpackage 'debconf' 'amd64' '1.5'
insertinstalledpackage 'pkg-with-template' 'amd64' '1.0'

# build a simple package that contains a config and a tempalte
mkdir -p DEBIAN
TEMPLATE_STR="Template: foo/bar
Type: string
Description: Some bar var
"
echo "$TEMPLATE_STR" > DEBIAN/templates

CONFIG_STR="#!/bin/sh
random shell stuff
"
echo "$CONFIG_STR" > DEBIAN/config

buildsimplenativepackage 'pkg-with-template' 'amd64' '0.8.15' 'stable' '' 'pkg with template' '' '' './DEBIAN'

# ensure we get the right stuff out of the file
mkdir extracttemplates-out
OUT="$(aptextracttemplates -t ./extracttemplates-out incoming/pkg-with-template*.deb)"

PKG=$(printf "$OUT" | cut -f1 -d' ')
INSTALLED_VER=$(printf "$OUT" | cut -f2 -d' ')
TEMPLATE=$(printf "$OUT" | cut -f3 -d' ')
CONFIG=$(printf "$OUT" | cut -f4 -d' ')

testequal "$CONFIG_STR" cat $CONFIG
testequal "$TEMPLATE_STR" cat $TEMPLATE

# ensure that the format of the output string has the right number of dots
for s in "$CONFIG" "$TEMPLATE"; do
NR_DOTS=$(basename "$s" | tr -c -d .)
testequal ".." echo $NR_DOTS
done

Loading…
Cancel
Save