xref: /titanic_52/usr/src/cmd/make/lib/makestate/ld_file.c (revision 10d63b7db37a83b39c7f511cf9426c9d03ea0760)
1*10d63b7dSRichard Lowe /*
2*10d63b7dSRichard Lowe  * CDDL HEADER START
3*10d63b7dSRichard Lowe  *
4*10d63b7dSRichard Lowe  * The contents of this file are subject to the terms of the
5*10d63b7dSRichard Lowe  * Common Development and Distribution License (the "License").
6*10d63b7dSRichard Lowe  * You may not use this file except in compliance with the License.
7*10d63b7dSRichard Lowe  *
8*10d63b7dSRichard Lowe  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10d63b7dSRichard Lowe  * or http://www.opensolaris.org/os/licensing.
10*10d63b7dSRichard Lowe  * See the License for the specific language governing permissions
11*10d63b7dSRichard Lowe  * and limitations under the License.
12*10d63b7dSRichard Lowe  *
13*10d63b7dSRichard Lowe  * When distributing Covered Code, include this CDDL HEADER in each
14*10d63b7dSRichard Lowe  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10d63b7dSRichard Lowe  * If applicable, add the following below this CDDL HEADER, with the
16*10d63b7dSRichard Lowe  * fields enclosed by brackets "[]" replaced with your own identifying
17*10d63b7dSRichard Lowe  * information: Portions Copyright [yyyy] [name of copyright owner]
18*10d63b7dSRichard Lowe  *
19*10d63b7dSRichard Lowe  * CDDL HEADER END
20*10d63b7dSRichard Lowe  */
21*10d63b7dSRichard Lowe /*
22*10d63b7dSRichard Lowe  * Copyright 1998 Sun Microsystems, Inc. All rights reserved.
23*10d63b7dSRichard Lowe  * Use is subject to license terms.
24*10d63b7dSRichard Lowe  */
25*10d63b7dSRichard Lowe 
26*10d63b7dSRichard Lowe #pragma init(ld_support_init)
27*10d63b7dSRichard Lowe 
28*10d63b7dSRichard Lowe #include <stdio.h>
29*10d63b7dSRichard Lowe #include <unistd.h>
30*10d63b7dSRichard Lowe #include <stdlib.h>
31*10d63b7dSRichard Lowe #include <string.h>
32*10d63b7dSRichard Lowe #include <libelf.h>
33*10d63b7dSRichard Lowe #include <sys/param.h>
34*10d63b7dSRichard Lowe #include <link.h>
35*10d63b7dSRichard Lowe 
36*10d63b7dSRichard Lowe #define	SUNPRO_DEPENDENCIES	"SUNPRO_DEPENDENCIES"
37*10d63b7dSRichard Lowe 
38*10d63b7dSRichard Lowe /*
39*10d63b7dSRichard Lowe  * Linked list of strings - used to keep lists of names
40*10d63b7dSRichard Lowe  * of directories or files.
41*10d63b7dSRichard Lowe  */
42*10d63b7dSRichard Lowe 
43*10d63b7dSRichard Lowe struct Stritem {
44*10d63b7dSRichard Lowe 	char *		str;
45*10d63b7dSRichard Lowe 	void *		next;
46*10d63b7dSRichard Lowe };
47*10d63b7dSRichard Lowe 
48*10d63b7dSRichard Lowe typedef struct Stritem 	Stritem;
49*10d63b7dSRichard Lowe 
50*10d63b7dSRichard Lowe static char 		* depend_file = NULL;
51*10d63b7dSRichard Lowe static Stritem		* list = NULL;
52*10d63b7dSRichard Lowe 
53*10d63b7dSRichard Lowe 
54*10d63b7dSRichard Lowe void mk_state_init()
55*10d63b7dSRichard Lowe {
56*10d63b7dSRichard Lowe 	depend_file = getenv(SUNPRO_DEPENDENCIES);
57*10d63b7dSRichard Lowe } /* mk_state_init() */
58*10d63b7dSRichard Lowe 
59*10d63b7dSRichard Lowe 
60*10d63b7dSRichard Lowe 
61*10d63b7dSRichard Lowe static void
62*10d63b7dSRichard Lowe prepend_str(Stritem **list, const char * str)
63*10d63b7dSRichard Lowe {
64*10d63b7dSRichard Lowe 	Stritem * new;
65*10d63b7dSRichard Lowe 	char 	* newstr;
66*10d63b7dSRichard Lowe 
67*10d63b7dSRichard Lowe 	if (!(new = calloc(1, sizeof (Stritem)))) {
68*10d63b7dSRichard Lowe 		perror("libmakestate.so");
69*10d63b7dSRichard Lowe 		return;
70*10d63b7dSRichard Lowe 	} /* if */
71*10d63b7dSRichard Lowe 
72*10d63b7dSRichard Lowe 	if (!(newstr = malloc(strlen(str) + 1))) {
73*10d63b7dSRichard Lowe 		perror("libmakestate.so");
74*10d63b7dSRichard Lowe 		return;
75*10d63b7dSRichard Lowe 	} /* if */
76*10d63b7dSRichard Lowe 
77*10d63b7dSRichard Lowe 	new->str = strcpy(newstr, str);
78*10d63b7dSRichard Lowe 	new->next = *list;
79*10d63b7dSRichard Lowe 	*list = new;
80*10d63b7dSRichard Lowe 
81*10d63b7dSRichard Lowe } /* prepend_str() */
82*10d63b7dSRichard Lowe 
83*10d63b7dSRichard Lowe 
84*10d63b7dSRichard Lowe void
85*10d63b7dSRichard Lowe mk_state_collect_dep(const char * file)
86*10d63b7dSRichard Lowe {
87*10d63b7dSRichard Lowe 	/*
88*10d63b7dSRichard Lowe 	 * SUNPRO_DEPENDENCIES wasn't set, we don't collect .make.state
89*10d63b7dSRichard Lowe 	 * information.
90*10d63b7dSRichard Lowe 	 */
91*10d63b7dSRichard Lowe 	if (!depend_file)
92*10d63b7dSRichard Lowe 		return;
93*10d63b7dSRichard Lowe 
94*10d63b7dSRichard Lowe 	prepend_str(&list, file);
95*10d63b7dSRichard Lowe 
96*10d63b7dSRichard Lowe }  /* mk_state_collect_dep() */
97*10d63b7dSRichard Lowe 
98*10d63b7dSRichard Lowe 
99*10d63b7dSRichard Lowe void
100*10d63b7dSRichard Lowe mk_state_update_exit()
101*10d63b7dSRichard Lowe {
102*10d63b7dSRichard Lowe 	Stritem 	* cur;
103*10d63b7dSRichard Lowe 	char		  lockfile[MAXPATHLEN],	* err, * space, * target;
104*10d63b7dSRichard Lowe 	FILE		* ofp;
105*10d63b7dSRichard Lowe 	extern char 	* file_lock(char *, char *, int);
106*10d63b7dSRichard Lowe 
107*10d63b7dSRichard Lowe 	if (!depend_file)
108*10d63b7dSRichard Lowe 		return;
109*10d63b7dSRichard Lowe 
110*10d63b7dSRichard Lowe 	if ((space = strchr(depend_file, ' ')) == NULL)
111*10d63b7dSRichard Lowe 		return;
112*10d63b7dSRichard Lowe 	*space = '\0';
113*10d63b7dSRichard Lowe 	target = &space[1];
114*10d63b7dSRichard Lowe 
115*10d63b7dSRichard Lowe 	(void) sprintf(lockfile, "%s.lock", depend_file);
116*10d63b7dSRichard Lowe 	if ((err = file_lock(depend_file, lockfile, 0))) {
117*10d63b7dSRichard Lowe 		(void) fprintf(stderr, "%s\n", err);
118*10d63b7dSRichard Lowe 		return;
119*10d63b7dSRichard Lowe 	} /* if */
120*10d63b7dSRichard Lowe 
121*10d63b7dSRichard Lowe 	if (!(ofp = fopen(depend_file, "a")))
122*10d63b7dSRichard Lowe 		return;
123*10d63b7dSRichard Lowe 
124*10d63b7dSRichard Lowe 	if (list)
125*10d63b7dSRichard Lowe 		(void) fprintf(ofp, "%s: ", target);
126*10d63b7dSRichard Lowe 
127*10d63b7dSRichard Lowe 	for (cur = list; cur; cur = cur->next)
128*10d63b7dSRichard Lowe 		(void) fprintf(ofp, " %s", cur->str);
129*10d63b7dSRichard Lowe 
130*10d63b7dSRichard Lowe 	(void) fputc('\n', ofp);
131*10d63b7dSRichard Lowe 
132*10d63b7dSRichard Lowe 	(void) fclose(ofp);
133*10d63b7dSRichard Lowe 	(void) unlink(lockfile);
134*10d63b7dSRichard Lowe 	*space = ' ';
135*10d63b7dSRichard Lowe 
136*10d63b7dSRichard Lowe } /* mk_state_update_exit() */
137*10d63b7dSRichard Lowe 
138*10d63b7dSRichard Lowe static void
139*10d63b7dSRichard Lowe /* LINTED static unused */
140*10d63b7dSRichard Lowe ld_support_init()
141*10d63b7dSRichard Lowe {
142*10d63b7dSRichard Lowe 	mk_state_init();
143*10d63b7dSRichard Lowe 
144*10d63b7dSRichard Lowe } /* ld_support_init() */
145*10d63b7dSRichard Lowe 
146*10d63b7dSRichard Lowe /* ARGSUSED */
147*10d63b7dSRichard Lowe void
148*10d63b7dSRichard Lowe ld_file(const char * file, const Elf_Kind ekind, int flags, Elf *elf)
149*10d63b7dSRichard Lowe {
150*10d63b7dSRichard Lowe 	if(! ((flags & LD_SUP_DERIVED) && !(flags & LD_SUP_EXTRACTED)))
151*10d63b7dSRichard Lowe 		return;
152*10d63b7dSRichard Lowe 
153*10d63b7dSRichard Lowe 	mk_state_collect_dep(file);
154*10d63b7dSRichard Lowe 
155*10d63b7dSRichard Lowe } /* ld_file */
156*10d63b7dSRichard Lowe 
157*10d63b7dSRichard Lowe void
158*10d63b7dSRichard Lowe ld_atexit(int exit_code)
159*10d63b7dSRichard Lowe {
160*10d63b7dSRichard Lowe 	if (exit_code)
161*10d63b7dSRichard Lowe 	   return;
162*10d63b7dSRichard Lowe 
163*10d63b7dSRichard Lowe 	mk_state_update_exit();
164*10d63b7dSRichard Lowe 
165*10d63b7dSRichard Lowe } /* ld_atexit() */
166*10d63b7dSRichard Lowe 
167*10d63b7dSRichard Lowe /*
168*10d63b7dSRichard Lowe  * Supporting 64-bit objects
169*10d63b7dSRichard Lowe  */
170*10d63b7dSRichard Lowe void
171*10d63b7dSRichard Lowe ld_file64(const char * file, const Elf_Kind ekind, int flags, Elf *elf)
172*10d63b7dSRichard Lowe {
173*10d63b7dSRichard Lowe 	if(! ((flags & LD_SUP_DERIVED) && !(flags & LD_SUP_EXTRACTED)))
174*10d63b7dSRichard Lowe 		return;
175*10d63b7dSRichard Lowe 
176*10d63b7dSRichard Lowe 	mk_state_collect_dep(file);
177*10d63b7dSRichard Lowe 
178*10d63b7dSRichard Lowe } /* ld_file64 */
179*10d63b7dSRichard Lowe 
180*10d63b7dSRichard Lowe void
181*10d63b7dSRichard Lowe ld_atexit64(int exit_code)
182*10d63b7dSRichard Lowe {
183*10d63b7dSRichard Lowe 	if (exit_code)
184*10d63b7dSRichard Lowe 	   return;
185*10d63b7dSRichard Lowe 
186*10d63b7dSRichard Lowe 	mk_state_update_exit();
187*10d63b7dSRichard Lowe 
188*10d63b7dSRichard Lowe } /* ld_atexit64() */
189