⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file_chgs.c

📁 openPBS的开放源代码
💻 C
字号:
/**         OpenPBS (Portable Batch System) v2.3 Software License* * Copyright (c) 1999-2000 Veridian Information Solutions, Inc.* All rights reserved.* * ---------------------------------------------------------------------------* For a license to use or redistribute the OpenPBS software under conditions* other than those described below, or to purchase support for this software,* please contact Veridian Systems, PBS Products Department ("Licensor") at:* *    www.OpenPBS.org  +1 650 967-4675                  sales@OpenPBS.org*                        877 902-4PBS (US toll-free)* ---------------------------------------------------------------------------* * This license covers use of the OpenPBS v2.3 software (the "Software") at* your site or location, and, for certain users, redistribution of the* Software to other sites and locations.  Use and redistribution of* OpenPBS v2.3 in source and binary forms, with or without modification,* are permitted provided that all of the following conditions are met.* After December 31, 2001, only conditions 3-6 must be met:* * 1. Commercial and/or non-commercial use of the Software is permitted*    provided a current software registration is on file at www.OpenPBS.org.*    If use of this software contributes to a publication, product, or*    service, proper attribution must be given; see www.OpenPBS.org/credit.html* * 2. Redistribution in any form is only permitted for non-commercial,*    non-profit purposes.  There can be no charge for the Software or any*    software incorporating the Software.  Further, there can be no*    expectation of revenue generated as a consequence of redistributing*    the Software.* * 3. Any Redistribution of source code must retain the above copyright notice*    and the acknowledgment contained in paragraph 6, this list of conditions*    and the disclaimer contained in paragraph 7.* * 4. Any Redistribution in binary form must reproduce the above copyright*    notice and the acknowledgment contained in paragraph 6, this list of*    conditions and the disclaimer contained in paragraph 7 in the*    documentation and/or other materials provided with the distribution.* * 5. Redistributions in any form must be accompanied by information on how to*    obtain complete source code for the OpenPBS software and any*    modifications and/or additions to the OpenPBS software.  The source code*    must either be included in the distribution or be available for no more*    than the cost of distribution plus a nominal fee, and all modifications*    and additions to the Software must be freely redistributable by any party*    (including Licensor) without restriction.* * 6. All advertising materials mentioning features or use of the Software must*    display the following acknowledgment:* *     "This product includes software developed by NASA Ames Research Center,*     Lawrence Livermore National Laboratory, and Veridian Information *     Solutions, Inc.*     Visit www.OpenPBS.org for OpenPBS software support,*     products, and information."* * 7. DISCLAIMER OF WARRANTY* * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. ANY EXPRESS* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT* ARE EXPRESSLY DISCLAIMED.* * IN NO EVENT SHALL VERIDIAN CORPORATION, ITS AFFILIATED COMPANIES, OR THE* U.S. GOVERNMENT OR ANY OF ITS AGENCIES BE LIABLE FOR ANY DIRECT OR INDIRECT,* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.* * This license will be governed by the laws of the Commonwealth of Virginia,* without reference to its choice of law rules.*//* $Id: file_chgs.c,v 1.1.6.2 2000/08/09 00:18:39 hender Exp $ *//* * Routines to check if files have been changed, deleted, created, etc. since * the last invocation.  Used to automatically load new configuration and * statistics data. */#include <sys/stat.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <errno.h>#include <pbs_error.h>#include <pbs_ifl.h>#include <log.h>#include "toolkit.h"struct filestatus {    struct filestatus *next;    char    *filename;    time_t   ctime;    int      exists;};typedef struct filestatus FileStatus;static FileStatus *filestats = NULL;intschd_register_file(char *filename){    char    *id = "schd_register_file";    FileStatus *stats, *tail, *new = NULL;    /*     * Look for the tail of the list.  While walking the list, check to see     * that the filename is not already registered.     */    tail = NULL;    for (stats = filestats; stats != NULL; stats = stats->next) {	if (strcmp(filename, stats->filename) == 0) {	    sprintf(log_buffer, "%s: file %s already registered.", id, 		filename);	    log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER, id, log_buffer);	    DBPRT(("%s: %s\n", id, log_buffer));	    return (-1);	}	tail = stats;    }    /* Create space for the new record. */    new = (FileStatus *) malloc (sizeof (FileStatus));    if (new == NULL) {	sprintf(log_buffer, 	    "%s: out of memory allocating FileStatus for file %s", 	    id, filename);	log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER, id, log_buffer);	return (-1);    }    /* Clear the record out -- this clears the ctime and next pointer. */    memset (new, 0, sizeof(FileStatus));    /* Keep a copy of the filename around. */    new->filename = schd_strdup(filename);    if (new->filename == NULL) {	log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER, id,	    "schd_strdup(filename)");	return (-1);    }    /*      * If this is not the first element, tack it on the end of the list.     * Otherwise, start the list with it.     */    if (tail)	tail->next = new;    else	filestats = new;    (void)sprintf(log_buffer, "%s: file %s registered.", id, filename);    log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER, id, log_buffer);    /*     * Load the new element with the initial values for the file.  Ignore     * the return value - only setting up the timestamp and file existence     * status are important.     */    (void)schd_file_has_changed(filename, 1);    return (0);}intschd_file_has_changed(char *filename, int reset_stamp){    char   *id = "schd_file_has_changed";    FileStatus *stats;    struct stat stat_buffer;    int     exists;    /* Assume that the file has not changed, and that it exists. */    exists      = 1;    if (filename == NULL) {	DBPRT(("%s: filename is null\n", id));	return (-1);    }    for (stats = filestats; stats != NULL; stats = stats->next) {	if (strcmp(filename, stats->filename) == 0)	    break;    }    if (stats == NULL) {	DBPRT(("%s: filename %s not registered\n", id, filename));	return (-1);    }    /* Get the file modification times from the filesystem. */    if (stat(filename, &stat_buffer) == -1) {	if (errno == ENOENT) {	    exists = 0;	} else {	    (void)sprintf(log_buffer,		"%s: stat(%s) failed: %d", id, filename, errno);	    log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER, id, log_buffer);	    return (-1);	}    }    /*     * Has file has changed state?     */    if (exists != stats->exists) {	stats->exists = exists;	if (exists && reset_stamp)	    stats->ctime = stat_buffer.st_ctime;	return (1);    }    /*     * If the ctime is different from the previously recorded one, the     * file has changed.  stat(2) indicates that ctime will be changed     * on every write, truncate, etc.  Update the ctime value for the     * next call.     */    if (exists && (stat_buffer.st_ctime != stats->ctime)) {	if (reset_stamp)	    stats->ctime = stat_buffer.st_ctime;	return (1);    }    /*     * Either file still does not exist, or it has not been changed since     * the last call.     */    return (0);}/* * "Forget" about the file named by 'filename', or all files if 'filename' * is a NULL pointer.  Returns the number of files removed from the watch * list, or -1 if the file is not found (or the list was empty). */intschd_forget_file(char *filename){    /* char   *id = "schd_forget_file"; */    FileStatus *stats, *prev, *next;    int  count, found;    count = 0;    found = 0;    prev  = NULL;    /*     * Remove entries in the list of file stats being watched that match     * the supplied filename, or all entries if 'filename' is NULL.     */    for (stats = filestats; stats != NULL; stats = next) {	next = stats->next;	if (filename && (strcmp(filename, stats->filename) != 0)) {	    prev = stats;	    continue;	}	found ++;	if (stats == filestats) {	    filestats = stats->next;	} else {	    prev->next = stats->next;	}	/* Free the schd_strdup()'d filename */	free(stats->filename);	free(stats);	count ++;    }    if (found)	return (count);    else	return (-1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -