1*10673SKrishnendu.Sadhukhan@Sun.COM /*
2*10673SKrishnendu.Sadhukhan@Sun.COM * CDDL HEADER START
3*10673SKrishnendu.Sadhukhan@Sun.COM *
4*10673SKrishnendu.Sadhukhan@Sun.COM * The contents of this file are subject to the terms of the
5*10673SKrishnendu.Sadhukhan@Sun.COM * Common Development and Distribution License (the "License").
6*10673SKrishnendu.Sadhukhan@Sun.COM * You may not use this file except in compliance with the License.
7*10673SKrishnendu.Sadhukhan@Sun.COM *
8*10673SKrishnendu.Sadhukhan@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10673SKrishnendu.Sadhukhan@Sun.COM * or http://www.opensolaris.org/os/licensing.
10*10673SKrishnendu.Sadhukhan@Sun.COM * See the License for the specific language governing permissions
11*10673SKrishnendu.Sadhukhan@Sun.COM * and limitations under the License.
12*10673SKrishnendu.Sadhukhan@Sun.COM *
13*10673SKrishnendu.Sadhukhan@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
14*10673SKrishnendu.Sadhukhan@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10673SKrishnendu.Sadhukhan@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
16*10673SKrishnendu.Sadhukhan@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
17*10673SKrishnendu.Sadhukhan@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
18*10673SKrishnendu.Sadhukhan@Sun.COM *
19*10673SKrishnendu.Sadhukhan@Sun.COM * CDDL HEADER END
20*10673SKrishnendu.Sadhukhan@Sun.COM */
21*10673SKrishnendu.Sadhukhan@Sun.COM /*
22*10673SKrishnendu.Sadhukhan@Sun.COM * Copyright (c) 2008-2009, Intel Corporation.
23*10673SKrishnendu.Sadhukhan@Sun.COM * All Rights Reserved.
24*10673SKrishnendu.Sadhukhan@Sun.COM */
25*10673SKrishnendu.Sadhukhan@Sun.COM
26*10673SKrishnendu.Sadhukhan@Sun.COM #include <unistd.h>
27*10673SKrishnendu.Sadhukhan@Sun.COM #include <libintl.h>
28*10673SKrishnendu.Sadhukhan@Sun.COM #include <stdio.h>
29*10673SKrishnendu.Sadhukhan@Sun.COM #include <stdlib.h>
30*10673SKrishnendu.Sadhukhan@Sun.COM #include <string.h>
31*10673SKrishnendu.Sadhukhan@Sun.COM #include <ctype.h>
32*10673SKrishnendu.Sadhukhan@Sun.COM #include <procfs.h>
33*10673SKrishnendu.Sadhukhan@Sun.COM #include <fcntl.h>
34*10673SKrishnendu.Sadhukhan@Sun.COM #include <sys/types.h>
35*10673SKrishnendu.Sadhukhan@Sun.COM #include <sys/stat.h>
36*10673SKrishnendu.Sadhukhan@Sun.COM
37*10673SKrishnendu.Sadhukhan@Sun.COM #include "latencytop.h"
38*10673SKrishnendu.Sadhukhan@Sun.COM
39*10673SKrishnendu.Sadhukhan@Sun.COM /* Pipe that breaks the event loop (and exits early) */
40*10673SKrishnendu.Sadhukhan@Sun.COM static int signal_pipe[2];
41*10673SKrishnendu.Sadhukhan@Sun.COM
42*10673SKrishnendu.Sadhukhan@Sun.COM /*
43*10673SKrishnendu.Sadhukhan@Sun.COM * Get current system time in milliseconds (1e-3).
44*10673SKrishnendu.Sadhukhan@Sun.COM */
45*10673SKrishnendu.Sadhukhan@Sun.COM uint64_t
lt_millisecond(void)46*10673SKrishnendu.Sadhukhan@Sun.COM lt_millisecond(void)
47*10673SKrishnendu.Sadhukhan@Sun.COM {
48*10673SKrishnendu.Sadhukhan@Sun.COM struct timeval p;
49*10673SKrishnendu.Sadhukhan@Sun.COM (void) gettimeofday(&p, NULL);
50*10673SKrishnendu.Sadhukhan@Sun.COM return ((uint64_t)p.tv_sec * 1000 + p.tv_usec / 1000);
51*10673SKrishnendu.Sadhukhan@Sun.COM }
52*10673SKrishnendu.Sadhukhan@Sun.COM
53*10673SKrishnendu.Sadhukhan@Sun.COM /*
54*10673SKrishnendu.Sadhukhan@Sun.COM * Check if we are out of memory.
55*10673SKrishnendu.Sadhukhan@Sun.COM */
56*10673SKrishnendu.Sadhukhan@Sun.COM void
lt_check_null(void * p)57*10673SKrishnendu.Sadhukhan@Sun.COM lt_check_null(void *p)
58*10673SKrishnendu.Sadhukhan@Sun.COM {
59*10673SKrishnendu.Sadhukhan@Sun.COM if (p == NULL) {
60*10673SKrishnendu.Sadhukhan@Sun.COM (void) fprintf(stderr, "Out of memory!\n");
61*10673SKrishnendu.Sadhukhan@Sun.COM g_assert(0);
62*10673SKrishnendu.Sadhukhan@Sun.COM exit(2);
63*10673SKrishnendu.Sadhukhan@Sun.COM }
64*10673SKrishnendu.Sadhukhan@Sun.COM }
65*10673SKrishnendu.Sadhukhan@Sun.COM
66*10673SKrishnendu.Sadhukhan@Sun.COM /*
67*10673SKrishnendu.Sadhukhan@Sun.COM * Safe malloc.
68*10673SKrishnendu.Sadhukhan@Sun.COM */
69*10673SKrishnendu.Sadhukhan@Sun.COM void *
lt_malloc(size_t size)70*10673SKrishnendu.Sadhukhan@Sun.COM lt_malloc(size_t size)
71*10673SKrishnendu.Sadhukhan@Sun.COM {
72*10673SKrishnendu.Sadhukhan@Sun.COM void *ret = malloc(size);
73*10673SKrishnendu.Sadhukhan@Sun.COM
74*10673SKrishnendu.Sadhukhan@Sun.COM lt_check_null(ret);
75*10673SKrishnendu.Sadhukhan@Sun.COM
76*10673SKrishnendu.Sadhukhan@Sun.COM return (ret);
77*10673SKrishnendu.Sadhukhan@Sun.COM }
78*10673SKrishnendu.Sadhukhan@Sun.COM
79*10673SKrishnendu.Sadhukhan@Sun.COM /*
80*10673SKrishnendu.Sadhukhan@Sun.COM * Safe alloc with memory cleared.
81*10673SKrishnendu.Sadhukhan@Sun.COM * It is named "zalloc" because its signature is different from
82*10673SKrishnendu.Sadhukhan@Sun.COM * calloc() in stdlib.
83*10673SKrishnendu.Sadhukhan@Sun.COM */
84*10673SKrishnendu.Sadhukhan@Sun.COM void *
lt_zalloc(size_t size)85*10673SKrishnendu.Sadhukhan@Sun.COM lt_zalloc(size_t size)
86*10673SKrishnendu.Sadhukhan@Sun.COM {
87*10673SKrishnendu.Sadhukhan@Sun.COM void *ret = calloc(size, 1);
88*10673SKrishnendu.Sadhukhan@Sun.COM
89*10673SKrishnendu.Sadhukhan@Sun.COM lt_check_null(ret);
90*10673SKrishnendu.Sadhukhan@Sun.COM
91*10673SKrishnendu.Sadhukhan@Sun.COM return (ret);
92*10673SKrishnendu.Sadhukhan@Sun.COM }
93*10673SKrishnendu.Sadhukhan@Sun.COM
94*10673SKrishnendu.Sadhukhan@Sun.COM /*
95*10673SKrishnendu.Sadhukhan@Sun.COM * Safe strdup.
96*10673SKrishnendu.Sadhukhan@Sun.COM */
97*10673SKrishnendu.Sadhukhan@Sun.COM char *
lt_strdup(const char * str)98*10673SKrishnendu.Sadhukhan@Sun.COM lt_strdup(const char *str)
99*10673SKrishnendu.Sadhukhan@Sun.COM {
100*10673SKrishnendu.Sadhukhan@Sun.COM char *ret = strdup(str);
101*10673SKrishnendu.Sadhukhan@Sun.COM
102*10673SKrishnendu.Sadhukhan@Sun.COM lt_check_null(ret);
103*10673SKrishnendu.Sadhukhan@Sun.COM
104*10673SKrishnendu.Sadhukhan@Sun.COM return (ret);
105*10673SKrishnendu.Sadhukhan@Sun.COM }
106*10673SKrishnendu.Sadhukhan@Sun.COM
107*10673SKrishnendu.Sadhukhan@Sun.COM /*
108*10673SKrishnendu.Sadhukhan@Sun.COM * Get string for current time, e.g. YYYY-MM-DD
109*10673SKrishnendu.Sadhukhan@Sun.COM */
110*10673SKrishnendu.Sadhukhan@Sun.COM void
lt_time_str(char * buffer,int len)111*10673SKrishnendu.Sadhukhan@Sun.COM lt_time_str(char *buffer, int len)
112*10673SKrishnendu.Sadhukhan@Sun.COM {
113*10673SKrishnendu.Sadhukhan@Sun.COM struct tm tms;
114*10673SKrishnendu.Sadhukhan@Sun.COM time_t t;
115*10673SKrishnendu.Sadhukhan@Sun.COM int i;
116*10673SKrishnendu.Sadhukhan@Sun.COM
117*10673SKrishnendu.Sadhukhan@Sun.COM (void) time(&t);
118*10673SKrishnendu.Sadhukhan@Sun.COM (void) gmtime_r(&t, &tms);
119*10673SKrishnendu.Sadhukhan@Sun.COM (void) asctime_r(&tms, buffer, len);
120*10673SKrishnendu.Sadhukhan@Sun.COM
121*10673SKrishnendu.Sadhukhan@Sun.COM for (i = strlen(buffer)-1; i > 0; --i) {
122*10673SKrishnendu.Sadhukhan@Sun.COM
123*10673SKrishnendu.Sadhukhan@Sun.COM if (isspace(buffer[i])) {
124*10673SKrishnendu.Sadhukhan@Sun.COM buffer[i] = '\0';
125*10673SKrishnendu.Sadhukhan@Sun.COM } else {
126*10673SKrishnendu.Sadhukhan@Sun.COM break;
127*10673SKrishnendu.Sadhukhan@Sun.COM }
128*10673SKrishnendu.Sadhukhan@Sun.COM }
129*10673SKrishnendu.Sadhukhan@Sun.COM }
130*10673SKrishnendu.Sadhukhan@Sun.COM
131*10673SKrishnendu.Sadhukhan@Sun.COM /*
132*10673SKrishnendu.Sadhukhan@Sun.COM * Retrieves the process's executable name and arguments from /proc.
133*10673SKrishnendu.Sadhukhan@Sun.COM */
134*10673SKrishnendu.Sadhukhan@Sun.COM char *
lt_get_proc_field(pid_t pid,lt_field_t field)135*10673SKrishnendu.Sadhukhan@Sun.COM lt_get_proc_field(pid_t pid, lt_field_t field)
136*10673SKrishnendu.Sadhukhan@Sun.COM {
137*10673SKrishnendu.Sadhukhan@Sun.COM char name[PATH_MAX];
138*10673SKrishnendu.Sadhukhan@Sun.COM int fd;
139*10673SKrishnendu.Sadhukhan@Sun.COM int ret;
140*10673SKrishnendu.Sadhukhan@Sun.COM psinfo_t psinfo;
141*10673SKrishnendu.Sadhukhan@Sun.COM
142*10673SKrishnendu.Sadhukhan@Sun.COM (void) snprintf(name, PATH_MAX, "/proc/%d/psinfo", (int)pid);
143*10673SKrishnendu.Sadhukhan@Sun.COM fd = open(name, O_RDONLY);
144*10673SKrishnendu.Sadhukhan@Sun.COM
145*10673SKrishnendu.Sadhukhan@Sun.COM if (fd == -1) {
146*10673SKrishnendu.Sadhukhan@Sun.COM return (NULL);
147*10673SKrishnendu.Sadhukhan@Sun.COM }
148*10673SKrishnendu.Sadhukhan@Sun.COM
149*10673SKrishnendu.Sadhukhan@Sun.COM ret = read(fd, (char *)&psinfo, sizeof (psinfo_t));
150*10673SKrishnendu.Sadhukhan@Sun.COM (void) close(fd);
151*10673SKrishnendu.Sadhukhan@Sun.COM
152*10673SKrishnendu.Sadhukhan@Sun.COM if (ret < 0) {
153*10673SKrishnendu.Sadhukhan@Sun.COM return (NULL);
154*10673SKrishnendu.Sadhukhan@Sun.COM }
155*10673SKrishnendu.Sadhukhan@Sun.COM
156*10673SKrishnendu.Sadhukhan@Sun.COM switch (field) {
157*10673SKrishnendu.Sadhukhan@Sun.COM case LT_FIELD_FNAME:
158*10673SKrishnendu.Sadhukhan@Sun.COM return (lt_strdup(psinfo.pr_fname));
159*10673SKrishnendu.Sadhukhan@Sun.COM case LT_FIELD_PSARGS:
160*10673SKrishnendu.Sadhukhan@Sun.COM return (lt_strdup(psinfo.pr_psargs));
161*10673SKrishnendu.Sadhukhan@Sun.COM }
162*10673SKrishnendu.Sadhukhan@Sun.COM return (NULL);
163*10673SKrishnendu.Sadhukhan@Sun.COM }
164*10673SKrishnendu.Sadhukhan@Sun.COM
165*10673SKrishnendu.Sadhukhan@Sun.COM /*
166*10673SKrishnendu.Sadhukhan@Sun.COM * Helper function to update the data structure.
167*10673SKrishnendu.Sadhukhan@Sun.COM */
168*10673SKrishnendu.Sadhukhan@Sun.COM void
lt_update_stat_value(lt_stat_data_t * entry,lt_stat_type_t type,uint64_t value)169*10673SKrishnendu.Sadhukhan@Sun.COM lt_update_stat_value(lt_stat_data_t *entry,
170*10673SKrishnendu.Sadhukhan@Sun.COM lt_stat_type_t type, uint64_t value)
171*10673SKrishnendu.Sadhukhan@Sun.COM {
172*10673SKrishnendu.Sadhukhan@Sun.COM switch (type) {
173*10673SKrishnendu.Sadhukhan@Sun.COM case LT_STAT_COUNT:
174*10673SKrishnendu.Sadhukhan@Sun.COM entry->lt_s_count += value;
175*10673SKrishnendu.Sadhukhan@Sun.COM break;
176*10673SKrishnendu.Sadhukhan@Sun.COM case LT_STAT_SUM:
177*10673SKrishnendu.Sadhukhan@Sun.COM entry->lt_s_total += value;
178*10673SKrishnendu.Sadhukhan@Sun.COM break;
179*10673SKrishnendu.Sadhukhan@Sun.COM case LT_STAT_MAX:
180*10673SKrishnendu.Sadhukhan@Sun.COM if (value > entry->lt_s_max) {
181*10673SKrishnendu.Sadhukhan@Sun.COM entry->lt_s_max = value;
182*10673SKrishnendu.Sadhukhan@Sun.COM }
183*10673SKrishnendu.Sadhukhan@Sun.COM break;
184*10673SKrishnendu.Sadhukhan@Sun.COM default:
185*10673SKrishnendu.Sadhukhan@Sun.COM break;
186*10673SKrishnendu.Sadhukhan@Sun.COM }
187*10673SKrishnendu.Sadhukhan@Sun.COM }
188*10673SKrishnendu.Sadhukhan@Sun.COM
189*10673SKrishnendu.Sadhukhan@Sun.COM /*
190*10673SKrishnendu.Sadhukhan@Sun.COM * Helper function to sort on total.
191*10673SKrishnendu.Sadhukhan@Sun.COM */
192*10673SKrishnendu.Sadhukhan@Sun.COM int
lt_sort_by_total_desc(lt_stat_entry_t * a,lt_stat_entry_t * b)193*10673SKrishnendu.Sadhukhan@Sun.COM lt_sort_by_total_desc(lt_stat_entry_t *a, lt_stat_entry_t *b)
194*10673SKrishnendu.Sadhukhan@Sun.COM {
195*10673SKrishnendu.Sadhukhan@Sun.COM g_assert(a != NULL && b != NULL);
196*10673SKrishnendu.Sadhukhan@Sun.COM /*
197*10673SKrishnendu.Sadhukhan@Sun.COM * lt_s_total is of type int64_t, so we can't simply return
198*10673SKrishnendu.Sadhukhan@Sun.COM * (b->lt_se_data.lt_s_total - a->lt_se_data.lt_s_total).
199*10673SKrishnendu.Sadhukhan@Sun.COM */
200*10673SKrishnendu.Sadhukhan@Sun.COM if (b->lt_se_data.lt_s_total > a->lt_se_data.lt_s_total) {
201*10673SKrishnendu.Sadhukhan@Sun.COM return (1);
202*10673SKrishnendu.Sadhukhan@Sun.COM } else if (b->lt_se_data.lt_s_total < a->lt_se_data.lt_s_total) {
203*10673SKrishnendu.Sadhukhan@Sun.COM return (-1);
204*10673SKrishnendu.Sadhukhan@Sun.COM } else {
205*10673SKrishnendu.Sadhukhan@Sun.COM return (0);
206*10673SKrishnendu.Sadhukhan@Sun.COM }
207*10673SKrishnendu.Sadhukhan@Sun.COM }
208*10673SKrishnendu.Sadhukhan@Sun.COM
209*10673SKrishnendu.Sadhukhan@Sun.COM /*
210*10673SKrishnendu.Sadhukhan@Sun.COM * Helper function to sort on max.
211*10673SKrishnendu.Sadhukhan@Sun.COM */
212*10673SKrishnendu.Sadhukhan@Sun.COM int
lt_sort_by_max_desc(lt_stat_entry_t * a,lt_stat_entry_t * b)213*10673SKrishnendu.Sadhukhan@Sun.COM lt_sort_by_max_desc(lt_stat_entry_t *a, lt_stat_entry_t *b)
214*10673SKrishnendu.Sadhukhan@Sun.COM {
215*10673SKrishnendu.Sadhukhan@Sun.COM g_assert(a != NULL && b != NULL);
216*10673SKrishnendu.Sadhukhan@Sun.COM
217*10673SKrishnendu.Sadhukhan@Sun.COM if (b->lt_se_data.lt_s_max > a->lt_se_data.lt_s_max) {
218*10673SKrishnendu.Sadhukhan@Sun.COM return (1);
219*10673SKrishnendu.Sadhukhan@Sun.COM } else if (b->lt_se_data.lt_s_max < a->lt_se_data.lt_s_max) {
220*10673SKrishnendu.Sadhukhan@Sun.COM return (-1);
221*10673SKrishnendu.Sadhukhan@Sun.COM } else {
222*10673SKrishnendu.Sadhukhan@Sun.COM return (0);
223*10673SKrishnendu.Sadhukhan@Sun.COM }
224*10673SKrishnendu.Sadhukhan@Sun.COM }
225*10673SKrishnendu.Sadhukhan@Sun.COM
226*10673SKrishnendu.Sadhukhan@Sun.COM /*
227*10673SKrishnendu.Sadhukhan@Sun.COM * Helper function to sort on count.
228*10673SKrishnendu.Sadhukhan@Sun.COM */
229*10673SKrishnendu.Sadhukhan@Sun.COM int
lt_sort_by_count_desc(lt_stat_entry_t * a,lt_stat_entry_t * b)230*10673SKrishnendu.Sadhukhan@Sun.COM lt_sort_by_count_desc(lt_stat_entry_t *a, lt_stat_entry_t *b)
231*10673SKrishnendu.Sadhukhan@Sun.COM {
232*10673SKrishnendu.Sadhukhan@Sun.COM g_assert(a != NULL && b != NULL);
233*10673SKrishnendu.Sadhukhan@Sun.COM
234*10673SKrishnendu.Sadhukhan@Sun.COM if (b->lt_se_data.lt_s_count > a->lt_se_data.lt_s_count) {
235*10673SKrishnendu.Sadhukhan@Sun.COM return (1);
236*10673SKrishnendu.Sadhukhan@Sun.COM } else if (b->lt_se_data.lt_s_count < a->lt_se_data.lt_s_count) {
237*10673SKrishnendu.Sadhukhan@Sun.COM return (-1);
238*10673SKrishnendu.Sadhukhan@Sun.COM } else {
239*10673SKrishnendu.Sadhukhan@Sun.COM return (0);
240*10673SKrishnendu.Sadhukhan@Sun.COM }
241*10673SKrishnendu.Sadhukhan@Sun.COM }
242*10673SKrishnendu.Sadhukhan@Sun.COM
243*10673SKrishnendu.Sadhukhan@Sun.COM /*
244*10673SKrishnendu.Sadhukhan@Sun.COM * Helper function to sort on average.
245*10673SKrishnendu.Sadhukhan@Sun.COM */
246*10673SKrishnendu.Sadhukhan@Sun.COM int
lt_sort_by_avg_desc(lt_stat_entry_t * a,lt_stat_entry_t * b)247*10673SKrishnendu.Sadhukhan@Sun.COM lt_sort_by_avg_desc(lt_stat_entry_t *a, lt_stat_entry_t *b)
248*10673SKrishnendu.Sadhukhan@Sun.COM {
249*10673SKrishnendu.Sadhukhan@Sun.COM double avg_a, avg_b;
250*10673SKrishnendu.Sadhukhan@Sun.COM
251*10673SKrishnendu.Sadhukhan@Sun.COM g_assert(a != NULL && b != NULL);
252*10673SKrishnendu.Sadhukhan@Sun.COM
253*10673SKrishnendu.Sadhukhan@Sun.COM avg_a = (double)a->lt_se_data.lt_s_total / a->lt_se_data.lt_s_count;
254*10673SKrishnendu.Sadhukhan@Sun.COM avg_b = (double)b->lt_se_data.lt_s_total / b->lt_se_data.lt_s_count;
255*10673SKrishnendu.Sadhukhan@Sun.COM
256*10673SKrishnendu.Sadhukhan@Sun.COM if (avg_b > avg_a) {
257*10673SKrishnendu.Sadhukhan@Sun.COM return (1);
258*10673SKrishnendu.Sadhukhan@Sun.COM } else if (avg_b < avg_a) {
259*10673SKrishnendu.Sadhukhan@Sun.COM return (-1);
260*10673SKrishnendu.Sadhukhan@Sun.COM } else {
261*10673SKrishnendu.Sadhukhan@Sun.COM return (0);
262*10673SKrishnendu.Sadhukhan@Sun.COM }
263*10673SKrishnendu.Sadhukhan@Sun.COM }
264*10673SKrishnendu.Sadhukhan@Sun.COM
265*10673SKrishnendu.Sadhukhan@Sun.COM /*
266*10673SKrishnendu.Sadhukhan@Sun.COM * Create pipe for signal handler and wakeup.
267*10673SKrishnendu.Sadhukhan@Sun.COM */
268*10673SKrishnendu.Sadhukhan@Sun.COM void
lt_gpipe_init(void)269*10673SKrishnendu.Sadhukhan@Sun.COM lt_gpipe_init(void)
270*10673SKrishnendu.Sadhukhan@Sun.COM {
271*10673SKrishnendu.Sadhukhan@Sun.COM (void) pipe(signal_pipe);
272*10673SKrishnendu.Sadhukhan@Sun.COM }
273*10673SKrishnendu.Sadhukhan@Sun.COM
274*10673SKrishnendu.Sadhukhan@Sun.COM /*
275*10673SKrishnendu.Sadhukhan@Sun.COM * Close the pipe used in signal handler.
276*10673SKrishnendu.Sadhukhan@Sun.COM */
277*10673SKrishnendu.Sadhukhan@Sun.COM void
lt_gpipe_deinit(void)278*10673SKrishnendu.Sadhukhan@Sun.COM lt_gpipe_deinit(void)
279*10673SKrishnendu.Sadhukhan@Sun.COM {
280*10673SKrishnendu.Sadhukhan@Sun.COM (void) close(signal_pipe[0]);
281*10673SKrishnendu.Sadhukhan@Sun.COM (void) close(signal_pipe[1]);
282*10673SKrishnendu.Sadhukhan@Sun.COM }
283*10673SKrishnendu.Sadhukhan@Sun.COM
284*10673SKrishnendu.Sadhukhan@Sun.COM /*
285*10673SKrishnendu.Sadhukhan@Sun.COM * Break early from the main loop.
286*10673SKrishnendu.Sadhukhan@Sun.COM */
287*10673SKrishnendu.Sadhukhan@Sun.COM void
lt_gpipe_break(const char * ch)288*10673SKrishnendu.Sadhukhan@Sun.COM lt_gpipe_break(const char *ch)
289*10673SKrishnendu.Sadhukhan@Sun.COM {
290*10673SKrishnendu.Sadhukhan@Sun.COM (void) write(signal_pipe[1], ch, 1);
291*10673SKrishnendu.Sadhukhan@Sun.COM }
292*10673SKrishnendu.Sadhukhan@Sun.COM
293*10673SKrishnendu.Sadhukhan@Sun.COM int
lt_gpipe_readfd(void)294*10673SKrishnendu.Sadhukhan@Sun.COM lt_gpipe_readfd(void)
295*10673SKrishnendu.Sadhukhan@Sun.COM {
296*10673SKrishnendu.Sadhukhan@Sun.COM return (signal_pipe[0]);
297*10673SKrishnendu.Sadhukhan@Sun.COM }
298*10673SKrishnendu.Sadhukhan@Sun.COM
299*10673SKrishnendu.Sadhukhan@Sun.COM /*
300*10673SKrishnendu.Sadhukhan@Sun.COM * Check if the given file exists.
301*10673SKrishnendu.Sadhukhan@Sun.COM */
302*10673SKrishnendu.Sadhukhan@Sun.COM int
lt_file_exist(const char * name)303*10673SKrishnendu.Sadhukhan@Sun.COM lt_file_exist(const char *name)
304*10673SKrishnendu.Sadhukhan@Sun.COM {
305*10673SKrishnendu.Sadhukhan@Sun.COM struct stat64 st;
306*10673SKrishnendu.Sadhukhan@Sun.COM
307*10673SKrishnendu.Sadhukhan@Sun.COM if (stat64(name, &st) == 0) {
308*10673SKrishnendu.Sadhukhan@Sun.COM return (1);
309*10673SKrishnendu.Sadhukhan@Sun.COM } else {
310*10673SKrishnendu.Sadhukhan@Sun.COM return (0);
311*10673SKrishnendu.Sadhukhan@Sun.COM }
312*10673SKrishnendu.Sadhukhan@Sun.COM }
313