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