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