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

📄 toolkit.c

📁 openPBS的开放源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
/**         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: toolkit.c,v 1.2.4.3 2000/08/09 00:18:53 hender Exp $ *//*  * * This file contains a variety of routines that should not need to be * modified to work with a variety of schedulers. This is an attempt * at encapulating common code into a single file for the various  * tasks that a scheduler may need to perform. Major tasks, or those * that may be scheduler or site specific are left in separate files. * * Code for this toolkit has been written and/or contributed by several * people including: *  *     Dr. Ed Hook, Nick Cardo, Karl Schilke, and James Patton Jones. * * Toolkit assembled and maintained by: *  *     James Patton Jones, jjones@pbspro.com, Veridian Systems *  * * This "toolkit" provides the following routines: * * -------------------------------------------------------------------------- * int schd_how_many(char *str, char *state) *  *      Given a state_count string, return the integer value of the *      state requested. * * -------------------------------------------------------------------------- * char * schd_byte2val(size_t bytes) * *      Return a pointer to a static string that is the shortest *      string by which the number of bytes can be accurately *      represented. i.e.: * *	     1023		-> 1023b *	     16384		-> 16kb *	     1048576		-> 1mb *	     16777216		-> 16mb *	     16777217		-> 16777217b *	     34359738368	-> 32gb * * -------------------------------------------------------------------------- * char *schd_sec2val(int seconds) * *      Convert seconds into "HH:MM:SS" format. Note that the returned *      string is a pointer to a static buffer. The caller must copy the *      time string into a holding buffer before the next call to *      sec2val() occurs. * * -------------------------------------------------------------------------- * size_t schd_val2byte(char *val) * *      Convert an allocation value string to its equivalent value in bytes./ * * -------------------------------------------------------------------------- * int schd_val2bool(char *val, int *bool) * *      Convert a boolean value (i.e. "True" or "False") to an int, where *      the integer 1 represents a true value, and 0 represents non-true. * * -------------------------------------------------------------------------- * char * schd_bool2val(int bool) * *      Convert a boolean value (i.e. an integer of 1 or 0) to  a char string *      of "True" or "False". * * -------------------------------------------------------------------------- * time_t schd_val2sec(char *val) * *      Convert a value string from time to its equivalent value in seconds. * * -------------------------------------------------------------------------- * int schd_val2datetime(char *string, time_t *when) * *      Convert a string of the form MM/DD/YYYY@HH:MM:SS to a time_t.  Uses *      strptime(3) function for parsing. * * -------------------------------------------------------------------------- * int schd_val2booltime(char *val, time_t *t) * *      Change a string into either a boolean (values 0 or 1), or a time_t *      if the string gives a time in the format "MM/DD/YYYY@HH:MM:SS". * * -------------------------------------------------------------------------- * int schd_register_file(char *filename) * int schd_file_has_changed(char *filename, int reset_stamp) * *      Routines to check if files have been changed, deleted, created, *      etc. since the last invocation. Used to automatically load new *      configuration and statistics data. * * -------------------------------------------------------------------------- * int schd_forget_file(char *filename) * *      "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). * * -------------------------------------------------------------------------- * char * schd_getat(char *at, Batch_Status *bs, char *rs) * *      Given a batch_status structure (bs), search the attributes for *      the requested attribute (at) and return it's value (v). If the *      attribute contains a resource list, then search the resource list *      for the requested resource (rs). The function returns the value *      if found or a NULL if the search is not successful. * * -------------------------------------------------------------------------- * void schd_timestamp(char *msg) * * -------------------------------------------------------------------------- * int schd_free_qlist(QueueList *qlist) * *      Free a set of QueueList structures that reference (via qptr->queue) *      an existing set of Queue structs. The Queues themselves are not *      affected. * * -------------------------------------------------------------------------- * int schd_destroy_qlist(QueueList *list) * *      This function differs from the schd_free_qlist() function in that *      it actually frees the Queue's themselves, while schd_free_qlist() *      simply destroys the list structures that point to the Queue's. * * -------------------------------------------------------------------------- * char * schd_strdup(char *string) * *      strdup(3) is not required for POSIX compliance, so we must provide *      a "lookalike". * * -------------------------------------------------------------------------- * char * schd_lowercase(char *string) * *      Convert characters of a string to lowercase.  Return a pointer to *      the original string. * * -------------------------------------------------------------------------- * char * schd_shorthost(char *fqdn) * *      Return a pointer to a copy of the host part of the fqdn presented. *      I.e. if fqdn is "foo.bar.com", copy the host part and return a *      pointer to it, with the contents "foo". If it is already short, *      return a copy anyway. * * -------------------------------------------------------------------------- * int schd_move_job_to(Job *thisjob, Queue *destq) * *      Move the internal representation of the given job from the list on *      its queue to the tail of the destination queue's list. If the *      destination queue is NULL, this is equivalent to deleting the job *      from the per-queue lists. * * -------------------------------------------------------------------------- * int schd_prime_time(time_t when) * *      It is important to be able to accurately determine when it is prime *      and non-prime time. This is accomplished by reading the holidays *      file and creating a table of prime and non-prime times. A quick *      search of the table can then determine whether we are in prime or *      non-prime time. * *      Given a time_t, determine if it is prime or nonprime time then. If *      the 'when' argument is 0, find out if it is primetime *now*. *      Return 1 for prime time, 0 for nonprime time. * * -------------------------------------------------------------------------- * static int day_prime_time(int dow, int now) * *      Based on time of day and day of week, is it prime time now? * * -------------------------------------------------------------------------- * int schd_read_holidays(void) * *      Initialize the holidays[] array from the contents of the holidays *      file  * * -------------------------------------------------------------------------- * void init_holidays(void) * *      Initialize weekdays array.  Default is "no primetime anytime", and *      no holidays.  Holidays are loaded from a compile time defined file, *      (see toolkit.h) which defaults to "/usr/lib/acct/holidays". * * -------------------------------------------------------------------------- * int schd_secs_til_prime(time_t when) * *      Calculate the number of seconds until the next prime time begins. *      If the 'when' argument is non-zero, determine how long from the *      time given. Otherwise, determine how long it is from now. * * -------------------------------------------------------------------------- * int schd_secs_til_nonprime(time_t when) * int schd_reset_observed_pt (QueueList *qlist) * int schd_reject_job(Job *job, char *reason) * *      Calculate the number of seconds until the next non-prime time *      begins. If the 'when' argument is non-zero, determine how long *      from the time given. Otherwise, determine how long it is from now. * * -------------------------------------------------------------------------- */#include <ctype.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <unistd.h>#include <errno.h>#include <sys/time.h>#include <sys/times.h>#include <sys/param.h>#include <sys/types.h>#include <sys/stat.h>#include "toolkit.h"#include "gblxvars.h"#include "pbs_error.h"#include "log.h"char	schd_VersionString[] = "Custom PBS Cluster Scheduler (version 2.3)\n";/* *      Given a state_count string, return the integer value of the *      state requested. */int schd_how_many(char *str, char *state){    /* char   *id = "how_many"; */    char   *avalue, *ptr1;    int     intval = 0;    /* Make a duplicate of the string since strtok() is destructive. */    avalue = schd_strdup(str);    if (avalue == NULL)	return (0);	/* XXX - return an error (malloc) here? */    /* Search for a token that matches the requested state */    for (ptr1 = strtok(avalue, " "); ptr1 != NULL; ptr1 = strtok(NULL, " "))	if (!strncmp(state, ptr1, strlen(state)))	    break;    if (ptr1 == NULL)	goto free_and_exit;	/* XXX return an error */    /* Locate the number after the colon */    ptr1 = strchr(ptr1, ':');    if (ptr1 == NULL)	goto free_and_exit;	/* XXX return an error? */    ptr1++;    intval = atoi(ptr1);free_and_exit:    free(avalue);		/* Free the memory schd_strdup() allocated. */    return (intval);}/* Power-of-two unit multipliers. */#define KILO ((size_t)1024)#define MEGA (KILO*1024)#define GIGA (MEGA*1024)#define TERA (GIGA*1024)/* * byte2val(bytes) * * Return a pointer to a static string that is the shortest string by which * the number of bytes can be accurately represented. i.e.: * *	1023			-> 1023b *	16384			-> 16kb *	1048576			-> 1mb *	16777216		-> 16mb *	16777217		-> 16777217b *	34359738368		-> 32gb */char *schd_byte2val(size_t bytes){    int     log_1024  = 0;	/* logarithm base 1024 of multiplier */    size_t  mult      = 1;	/* Initial multiplier */    size_t  next_mult = 1024;	/* multiplier of next-highest unit */    static char string[32];    char   *units[] = { 	"b", 		/* bytes     */	"kb", 		/* kilobytes */	"mb", 		/* megabytes */	"gb", 		/* gigabytes */	"tb", 		/* terabytes */	"pb", 		/* petabytes */	"eb"		/* exabytes  */    };    /*     * Find the first multiplier by which the given byte count is not      * evenly divisible.  If we overflow the next multiplier, we have     * gone far enough.     */    while (bytes && (bytes % next_mult) == 0) {	mult = next_mult;	next_mult <<= 10;	log_1024 ++;	if (next_mult == 0)	    break;    }    /*     * Make 'bytes' be the number of units being represented.     */    bytes /= mult;    /*     * Create a string from number of units, and the symbol for that unit.     */    sprintf(string, "%lu%s", (unsigned long)bytes, units[log_1024]);    /*     * Remember: this is a static string!     */    return (string);}/* * Convert seconds into "HH:MM:SS" format.  Note that the returned string * is a pointer to a static buffer.  The caller must copy the time string * into a holding buffer before the next call to sec2val() occurs. */char   *schd_sec2val(int seconds){    /* char   *id = "sec2val"; */    static char tval[16];    int     hours   = 0;    int     minutes = 0;    /* Hours */    if (seconds >= (60 * 60))	hours = seconds / (60 * 60);    seconds -= (hours * (60 * 60));    /* Minutes */    if (seconds >= 60)	minutes = seconds / 60;    /* Seconds */    seconds -= (minutes * 60);    (void)sprintf(tval, "%2.2d:%2.2d:%2.2d", hours, minutes, seconds);    return (&tval[0]);}/* Convert an allocation value string to its equivalent value in bytes. */size_t 

⌨️ 快捷键说明

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