xref: /onnv-gate/usr/src/cmd/latencytop/common/util.c (revision 10673:b22eb20aa9ca)
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