/*
 * Mailbox Daemon Temporary File helpers
 *
 * Copyright 2017 IBM
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "test/tmpf.h"

static const char *tmpf_dir = "/tmp/";

int tmpf_init(struct tmpf *tmpf, const char *template)
{
	strcpy(tmpf->path, tmpf_dir);
	strncat(tmpf->path, template, sizeof(tmpf->path) - sizeof(tmpf_dir));

	tmpf->fd = mkstemp(tmpf->path);
	if (tmpf->fd < 0) {
		perror("mkstemp");
		return -1;
	}

	return 0;
}

void tmpf_destroy(struct tmpf *tmpf)
{
	if (tmpf->fd)
		close(tmpf->fd);

	if (tmpf->path)
		unlink(tmpf->path);
}
