ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/sgps/sgps.c
Revision: 1.3
Committed: Mon Apr 25 11:01:19 2005 UTC (19 years, 8 months ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +0 -0 lines
State: FILE REMOVED
Log Message:
Nuke sgps - Pete's decided it's actually rather pointless as it doesn't
offer anything that other ps programs don't.

File Contents

# Content
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <strings.h>
5 #include <pwd.h>
6 #include "statgrab.h"
7
8 char usage(char *progname){
9 fprintf(stderr," Usage: %s [-efAnh] [-u user] [-o sort]\n\n", progname);
10 fprintf(stderr, "\t-h\tDisplays this help\n");
11 fprintf(stderr, "\t-e\tAll processes\n");
12 fprintf(stderr, "\t-f\tFull listing\n");
13 fprintf(stderr, "\t-a\tAll processes (same as -e)\n");
14 fprintf(stderr, "\t-n\tDont look up usernames\n");
15 fprintf(stderr, "\t-u\tLook for just this user\n");
16 fprintf(stderr, "\t-o\tSorting method. Valid are cpu, mem, pid, uid, gid and size\n");
17 fprintf(stderr, "\n");
18 exit(1);
19 }
20
21 char *size_conv(long long number){
22 char type[] = {'B', 'K', 'M', 'G', 'T'};
23 int x=0;
24 static char string[10];
25
26 for(;x<5;x++){
27 if( (number/1024) < (100)) {
28 break;
29 }
30 number = (number/1024);
31 }
32
33 snprintf(string, 10, "%lld%c", number, type[x]);
34 return string;
35
36 }
37
38 char *username(uid_t uid){
39 static struct passwd *pass;
40
41 pass = getpwuid(uid);
42 if(pass == NULL){
43 return "NULL";
44 }
45
46 return pass->pw_name;
47 }
48
49 char *proc_state(sg_process_state state){
50 static char *pstat = "Unk";
51
52 if(state == SG_PROCESS_STATE_RUNNING){
53 pstat="Run";
54 }
55
56 if(state == SG_PROCESS_STATE_SLEEPING){
57 pstat="Sleep";
58 }
59
60 if(state == SG_PROCESS_STATE_STOPPED){
61 pstat="Stop";
62 }
63
64 if(state == SG_PROCESS_STATE_ZOMBIE){
65 pstat="Zomb";
66 }
67
68 if(state == SG_PROCESS_STATE_UNKNOWN){
69 pstat="Unk";
70 }
71
72 return pstat;
73 }
74
75 int main(int argc, char **argv){
76 extern char *optarg;
77 int c;
78 int x;
79 int full=0;
80 int detailed=0;
81 int nolookup=0;
82 struct passwd *pwd_ent;
83 uid_t uid = -1;
84
85 int (*sortby_ptr)(const void *va, const void *vb);
86
87 int entries;
88 extern char *optarg;
89
90
91 sg_process_stats *sg_proc = NULL;
92 /* Default behaviour - sort by pid */
93 sortby_ptr = sg_process_compare_pid;
94
95 while ((c = getopt(argc, argv, "hneAfU:u:o:")) != -1){
96 switch (c){
97 case 'e':
98 case 'A':
99 full=1;
100 break;
101 case 'f':
102 detailed=1;
103 break;
104 case 'n':
105 nolookup=1;
106 break;
107 case 'U':
108 case 'u':
109 pwd_ent = getpwnam(optarg);
110 if (pwd_ent == NULL){
111 fprintf(stderr, "Error: user %s does not exist\n", optarg);
112 exit(1);
113 }
114 uid = pwd_ent->pw_uid;
115 break;
116 case 'o':
117 if(!strncasecmp(optarg, "cpu", 3)){
118 sortby_ptr = sg_process_compare_cpu;
119 break;
120 }
121 if(!strncasecmp(optarg, "size", 3)){
122 sortby_ptr = sg_process_compare_size;
123 break;
124 }
125 if(!strncasecmp(optarg, "pid", 3)){
126 sortby_ptr = sg_process_compare_pid;
127 break;
128 }
129 if(!strncasecmp(optarg, "mem", 3)){
130 sortby_ptr = sg_process_compare_res;
131 break;
132 }
133 if(!strncasecmp(optarg, "res", 3)){
134 sortby_ptr = sg_process_compare_res;
135 break;
136 }
137 if(!strncasecmp(optarg, "uid", 3)){
138 sortby_ptr = sg_process_compare_uid;
139 break;
140 }
141 if(!strncasecmp(optarg, "gid", 3)){
142 sortby_ptr = sg_process_compare_gid;
143 break;
144 }
145 case 'h':
146 default:
147 usage(argv[0]);
148 break;
149 exit(1);
150 }
151 }
152
153 /* Get the procs - and sort them */
154 sg_proc = sg_get_process_stats(&entries);
155 qsort(sg_proc, entries, sizeof *sg_proc, sortby_ptr);
156
157 /* Print the headers out on stderr, so should someone want to use this in a script, they wont need to
158 * strip out the first line.
159 */
160 if (full){
161 fprintf(stderr, "%9s %6s %6s %6s %7s %7s %4s %s\n", "User", "pid", "parent", "state", "size", "res", "CPU", "Process");
162 }else{
163 fprintf(stderr, "%6s %7s %4s %s\n", "pid", "size", "CPU", "Process");
164 }
165
166 for(x=0; x<entries; x++){
167 char *proc_out=NULL;
168 if (detailed) {
169 proc_out = sg_proc->proctitle;
170 }else{
171 proc_out = sg_proc->process_name;
172 }
173
174 if((uid == -1) || (uid == sg_proc->uid)){
175 if(full){
176 printf("%9s %6d %6d %6s %7s %7s %2.2f %s\n", username(sg_proc->uid), (int)sg_proc->pid, (int)sg_proc->parent, proc_state(sg_proc->state), size_conv(sg_proc->proc_size), size_conv(sg_proc->proc_resident), sg_proc->cpu_percent, proc_out);
177 }else{
178 printf("%6d %7s %2.2f %s\n", (int)sg_proc->pid, size_conv(sg_proc->proc_size), sg_proc->cpu_percent, proc_out);
179 }
180 }
181
182 sg_proc++;
183 }
184
185 return 0;
186 }