#ifndef _MOM_MAIN_H
#define _MOM_MAIN_H
#include "license_pbs.h" /* See here for the software license */

#include "resmon.h" /* rm_attribute, config */
#include "pbs_job.h" /* job, pjobexec_t */
#include "resource.h" /* resource */
#include "mom_hierarchy.h" /* mom_hierarchy_t */
#include "tcp.h" /* tcp_chan */

#define NO_LAYOUT_FILE      -10
#define BAD_LAYOUT_FILE     -505
#define CHECK_POLL_TIME     45

#define PMAX_PORT                 32000
#define MAX_PORT_STRING_LEN       6
#define MAX_LOCK_FILE_NAME_LEN    15
#define MAX_RESEND_JOBS           512
#define DUMMY_JOB_PTR             1
#define MOM_THREADS               2
#define THREAD_INFINITE          -1

#ifndef MAX_LINE
#define MAX_LINE 1024
#endif

const char *nullproc(struct rm_attribute *attrib);

/* static char *arch(struct rm_attribute *attrib); */

/* static char *opsys(struct rm_attribute *attrib); */

const char * getuname(void);

/* static char *reqmsg(struct rm_attribute *attrib); */

/* static char *getjoblist(struct rm_attribute *attrib); */

/* static char *reqvarattr(struct rm_attribute *attrib); */

const char *reqgres(struct rm_attribute *attrib);

/* static char *reqstate(struct rm_attribute *attrib); */

/* static char *requname(struct rm_attribute *attrib); */

/* static char *validuser(struct rm_attribute *attrib); */

const char *loadave(struct rm_attribute *attrib);

struct config *rm_search(struct config *where, const char *what);

const char *dependent(const char *res, struct rm_attribute *attr);

void initialize(void);

void cleanup(void);

void die(int sig);

void memcheck(const char *buf);

void checkret(char **spot, long len);

char *skipwhite(char *str);

char *tokcpy(char *str, char *tok);

void rmnl(char *str);

/* static int setbool(char *value); */

u_long addclient(const char *name);

/* static u_long setpbsclient(char *value); */

/* static u_long setpbsserver(char *value); */

/* static u_long settmpdir(char *Value); */

/* static u_long setxauthpath(char *Value); */

/* static u_long setrcpcmd(char *Value); */

/* static u_long setlogevent(char *value); */

/* static u_long restricted(char *name); */

/* static u_long configversion(char *Value); */

/* static u_long setdownonerror(char *value); */

/* static u_long setenablemomrestart(char *value); */

/* static u_long cputmult(char *value); */

/* static u_long wallmult(char *value); */

/* static u_long usecp(char *value); */

/* static unsigned long prologalarm(char *value); */

/* static unsigned long setloglevel(char *value); */

/* static unsigned long setumask(char *value); */

/* static unsigned long setpreexec(char *value); */

/* static unsigned long setsourceloginbatch(char *value); */

/* static unsigned long setsourcelogininteractive(char *value); */

/* static unsigned long jobstartblocktime(char *value); */

/* static unsigned long setstatusupdatetime(char *value); */

/* static unsigned long setcheckpolltime(char *value); */

/* static void add_static(char *str, char *file, int linenum); */

/* static unsigned long setidealload(char *value); */

/* static unsigned long setignwalltime(char *value); */

/* static unsigned long setignmem(char *value); */

/* static unsigned long setigncput(char *value); */

/* static unsigned long setignvmem(char *value); */

/* static unsigned long setautoidealload(char *value); */

/* static unsigned long setallocparcmd(char *value); */

/* static unsigned long setautomaxload(char *value); */

/* static unsigned long setmaxconnecttimeout(char *value); */

/* static unsigned long setreduceprologchecks(char *value); */

/* static unsigned long setnodecheckscript(char *value); */

/* static unsigned long setnodecheckinterval(char *value); */

/* static unsigned long settimeout(char *value); */

/* static unsigned long setmaxload(char *value); */

/* static unsigned long setlogfilemaxsize(char *value); */

/* static unsigned long setlogfilerolldepth(char *value); */

/* static unsigned long setlogdirectory(char *value); */

/* static unsigned long setlogfilesuffix(char *value); */

/* static unsigned long setlogkeepdays(char *value); */

/* static u_long setvarattr(char *value); */

/* static unsigned long setthreadunlinkcalls(char *value); */

/* static unsigned long setnodefilesuffix(char *value); */

/* static unsigned long setmomhost(char *value); */

/* static u_long setrreconfig(char *value); */

/* static unsigned long setnospooldirlist(char *value); */

unsigned long aliasservername(const char *value);

/* static unsigned long setspoolasfinalname(char *value); */

unsigned long jobstarter(const char *value);

/* static unsigned long setremchkptdirlist(char *value); */

void check_log(void);

int read_config(char *file);

/* static u_long setusesmt(char *value); */

/* static u_long setmempressthr(char *value); */

/* static u_long setmempressdur(char *value); */

struct rm_attribute *momgetattr(char *str);

char *conf_res(char *resline, struct rm_attribute *attr);

/* static void catch_abort(int sig); */

/* static void catch_hup(int sig); */

/* static void process_hup(void); */

void toolong(int sig);

void log_verbose(char *id, char *buf, int len);

int bad_restrict(u_long ipadd);

/* static void mom_lock(int fds, int op); */

int rm_request(struct tcp_chan *chan, int version);

int do_tcp(int socket,struct sockaddr_in *pSockAddr);

void *tcp_request(void *sock_num);

const char *find_signal_name(int sig);

int kill_job(job *pjob, int sig, const char *killer_id_name, const char *why_killed_reason);

unsigned long getsize(resource *pres);

unsigned long gettime(resource *pres);

int job_over_limit(job *pjob);

void usage(char *prog);

char *MOMFindMyExe(char *argv0);

time_t MOMGetFileMtime(const char *fpath);

void MOMCheckRestart(void);

void initialize_globals(void);

/* static void stop_me(int sig); */

/* static void PBSAdjustLogLevel(int sig); */

char *mk_dirs(const char *base);

void parse_command_line(int argc, char *argv[]);

int setup_program_environment(void);

int TMOMJobGetStartInfo(job *pjob, pjobexec_t **TJEP);

int TMOMScanForStarting(void);

void examine_all_polled_jobs(void);

void examine_all_running_jobs(void);


void examine_all_jobs_to_resend(void);

void kill_all_running_jobs(void);

int mark_for_resend(job *pjob);

void prepare_child_tasks_for_delete();

void main_loop(void);

void restart_mom(int argc, char *argv[]);

int read_layout_file();

int setup_nodeboards();

/* int main(int argc, char *argv[]); */

int parse_mom_hierarchy_file(char *path, mom_hierarchy_t *nt);

#endif /* _MOM_MAIN_H */