Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libcs/csstat.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1990-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#pragma prototyped
21
/*
22
* Glenn Fowler
23
* AT&T Research
24
*
25
* return host status given name
26
*/
27
28
#include "cslib.h"
29
30
#include <proc.h>
31
32
static int
33
initiate(register Cs_t* state, const char* name, char* buf)
34
{
35
char* av[3];
36
37
if (!pathpath(CS_STAT_DAEMON, "", PATH_REGULAR|PATH_EXECUTE, buf, PATH_MAX))
38
{
39
messagef((state->id, NiL, -1, "stat: %s: %s: cannot find stat daemon", name, CS_STAT_DAEMON));
40
return -1;
41
}
42
av[0] = buf;
43
av[1] = (char*)name;
44
av[2] = 0;
45
procclose(procopen(av[0], av, NiL, NiL, 0));
46
return 0;
47
}
48
49
int
50
csstat(register Cs_t* state, const char* name, register Csstat_t* sp)
51
{
52
register int n;
53
register int i;
54
char* s;
55
unsigned long a;
56
unsigned long m;
57
struct stat st;
58
char buf[PATH_MAX];
59
60
static int init;
61
static char* dir;
62
63
messagef((state->id, NiL, -8, "stat(%s) call", name));
64
CSTIME();
65
if (!name || streq(name, CS_HOST_LOCAL))
66
name = (const char*)csname(state, 0);
67
if (!strchr(name, '/'))
68
{
69
if (!init)
70
{
71
init = 1;
72
if (pathpath(CS_STAT_DIR, "", PATH_EXECUTE, buf, sizeof(buf)))
73
dir = strdup(buf);
74
}
75
if (!dir)
76
return -1;
77
sfsprintf(buf, sizeof(buf), "%s/%s", dir, name);
78
if ((n = stat(buf, &st)) || (state->time - CS_STAT_DOWN) > (unsigned long)st.st_ctime)
79
{
80
if (initiate(state, name, buf))
81
return -1;
82
for (i = 1; i < CS_STAT_DOWN / 20; i <<= 1)
83
{
84
sleep(i);
85
if (!(n = stat(buf, &st)))
86
break;
87
}
88
if (n)
89
{
90
messagef((state->id, NiL, -1, "stat: %s: %s: stat error", name, buf));
91
return -1;
92
}
93
}
94
}
95
else
96
n = stat(name, &st);
97
if (n)
98
{
99
memzero(sp, sizeof(*sp));
100
sp->up = -CS_STAT_DOWN;
101
}
102
else
103
{
104
a = st.st_atime;
105
m = st.st_mtime;
106
if (!(sp->up = (((a >> 16) & 0x7ff) << ((a >> 27) & 0x1f))))
107
{
108
memzero(sp, sizeof(*sp));
109
sp->up = -(((a & 0x7ff) << ((a >> 11) & 0x1f)) + (long)(state->time - (unsigned long)st.st_ctime));
110
s = csname(state, 0);
111
if (streq(name, s))
112
initiate(state, name, buf);
113
}
114
else
115
{
116
sp->load = ((m >> 24) & 0xff) << 3;
117
sp->pctsys = (m >> 16) & 0xff;
118
sp->pctusr = (m >> 8) & 0xff;
119
sp->users = m & 0xff;
120
sp->idle = sp->users ? ((a & 0x7ff) << ((a >> 11) & 0x1f)) : ~0;
121
}
122
}
123
return 0;
124
}
125
126
int
127
_cs_stat(const char* name, Csstat_t* sp)
128
{
129
return csstat(&cs, name, sp);
130
}
131
132