write_pid.c revision 78527
172445Sassar/*
272445Sassar * Copyright (c) 1999 - 2000 Kungliga Tekniska H�gskolan
372445Sassar * (Royal Institute of Technology, Stockholm, Sweden).
472445Sassar * All rights reserved.
572445Sassar *
672445Sassar * Redistribution and use in source and binary forms, with or without
772445Sassar * modification, are permitted provided that the following conditions
872445Sassar * are met:
972445Sassar *
1072445Sassar * 1. Redistributions of source code must retain the above copyright
1172445Sassar *    notice, this list of conditions and the following disclaimer.
1272445Sassar *
1372445Sassar * 2. Redistributions in binary form must reproduce the above copyright
1472445Sassar *    notice, this list of conditions and the following disclaimer in the
1572445Sassar *    documentation and/or other materials provided with the distribution.
1672445Sassar *
1772445Sassar * 3. Neither the name of the Institute nor the names of its contributors
1872445Sassar *    may be used to endorse or promote products derived from this software
1972445Sassar *    without specific prior written permission.
2072445Sassar *
2172445Sassar * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
2272445Sassar * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2372445Sassar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2472445Sassar * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
2572445Sassar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2672445Sassar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2772445Sassar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2872445Sassar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2972445Sassar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3072445Sassar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3172445Sassar * SUCH DAMAGE.
3272445Sassar */
3372445Sassar
3472445Sassar#ifdef HAVE_CONFIG_H
3572445Sassar#include <config.h>
3678527SassarRCSID("$Id: write_pid.c,v 1.5 2001/02/20 01:44:55 assar Exp $");
3772445Sassar#endif
3872445Sassar
3972445Sassar#include <stdio.h>
4072445Sassar#include <sys/types.h>
4172445Sassar#include <unistd.h>
4272445Sassar#include <roken.h>
4372445Sassar
4472445Sassar#include "roken.h"
4572445Sassar
4672445Sassarchar *
4772445Sassarpid_file_write (const char *progname)
4872445Sassar{
4972445Sassar    FILE *fp;
5072445Sassar    char *ret;
5172445Sassar
5272445Sassar    asprintf (&ret, "%s%s.pid", _PATH_VARRUN, progname);
5372445Sassar    if (ret == NULL)
5472445Sassar	return NULL;
5572445Sassar    fp = fopen (ret, "w");
5672445Sassar    if (fp == NULL) {
5772445Sassar	free (ret);
5872445Sassar	return NULL;
5972445Sassar    }
6072445Sassar    fprintf (fp, "%u", (unsigned)getpid());
6172445Sassar    fclose (fp);
6272445Sassar    return ret;
6372445Sassar}
6472445Sassar
6572445Sassarvoid
6672445Sassarpid_file_delete (char **filename)
6772445Sassar{
6872445Sassar    if (*filename != NULL) {
6972445Sassar	unlink (*filename);
7072445Sassar	free (*filename);
7172445Sassar	*filename = NULL;
7272445Sassar    }
7372445Sassar}
7472445Sassar
7572445Sassar#ifndef HAVE_PIDFILE
7672445Sassarstatic char *pidfile_path;
7772445Sassar
7872445Sassarstatic void
7972445Sassarpidfile_cleanup(void)
8072445Sassar{
8172445Sassar    if(pidfile_path != NULL)
8272445Sassar	pid_file_delete(&pidfile_path);
8372445Sassar}
8472445Sassar
8572445Sassarvoid
8672445Sassarpidfile(const char *basename)
8772445Sassar{
8872445Sassar    if(pidfile_path != NULL)
8972445Sassar	return;
9072445Sassar    if(basename == NULL)
9178527Sassar	basename = getprogname();
9272445Sassar    pidfile_path = pid_file_write(basename);
9372445Sassar    atexit(pidfile_cleanup);
9472445Sassar}
9572445Sassar#endif
96