Home | History | Annotate | Download | only in common
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  *	Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  *	Use is subject to license terms.
     24  */
     25 
     26 /*
     27  *	Copyright (c) 1988 AT&T
     28  *	  All Rights Reserved
     29  *
     30  */
     31 
     32 #ifndef	_INC_H
     33 #define	_INC_H
     34 
     35 #include <stdio.h>
     36 #include <sys/param.h>
     37 #include <ar.h>
     38 #include <errno.h>
     39 #include <ctype.h>
     40 #include <unistd.h>
     41 #include "sgs.h"
     42 #include <stdarg.h>
     43 #include <sys/mman.h>
     44 
     45 #ifndef	UID_NOBODY
     46 #define	UID_NOBODY	60001
     47 #endif
     48 
     49 #ifndef GID_NOBODY
     50 #define	GID_NOBODY	60001
     51 #endif
     52 
     53 #include <stdlib.h>
     54 
     55 #include "libelf.h"
     56 
     57 #include <signal.h>
     58 #include <sys/stat.h>
     59 #include <errno.h>
     60 #include <string.h>
     61 #include <fcntl.h>
     62 
     63 #include <time.h>
     64 #include <locale.h>
     65 
     66 #define	SUID	04000
     67 #define	SGID	02000
     68 #define	ROWN	0400
     69 #define	WOWN	0200
     70 #define	XOWN	0100
     71 #define	RGRP	040
     72 #define	WGRP	020
     73 #define	XGRP	010
     74 #define	ROTH	04
     75 #define	WOTH	02
     76 #define	XOTH	01
     77 #define	STXT	01000
     78 
     79 #define	opt_FLAG(_x, ch)	((_x->opt_flgs & ch))
     80 #define	CHUNK		500
     81 #define	SYMCHUNK	1000
     82 #define	SNAME		16
     83 #define	ROUNDUP(x)	(((x) + 1) & ~1)
     84 
     85 #define	LONGDIRNAME	"//              "
     86 #define	SYMDIRNAME	"/               "	/* symbol directory filename */
     87 #define	FNFORMAT	"%-16s"				/* filename format */
     88 #define	TLFORMAT	"%-12ld%-6u%-6u%-8o%-10ld%-2s"	/* trailer format */
     89 #define	FORMAT		FNFORMAT TLFORMAT
     90 #define	DATESIZE	60	 /*  sizeof (struct ar_hdr)  */
     91 
     92 #define	PLAIN_ERROR	0
     93 #define	LIBELF_ERROR	1
     94 #define	SYSTEM_ERROR	2
     95 
     96 typedef struct arfile ARFILE;
     97 typedef ARFILE * ARFILEP;
     98 
     99 #define	AR_MAX_BYTES_IN_MEM		0x20000000 /* 512 Mb */
    100 
    101 struct arfile
    102 {
    103 	char	ar_name[SNAME];		/* info from archive member header */
    104 	time_t	ar_date;
    105 	int	ar_uid;
    106 	int	ar_gid;
    107 	unsigned long	ar_mode;
    108 	long	ar_size;
    109 	char    *ar_longname;
    110 	char    *ar_rawname;
    111 	Elf 	*ar_elf;		/* My elf descriptor */
    112 	char	*ar_pathname;
    113 	char	*ar_contents;
    114 	long	ar_offset;		/* The member offset */
    115 	unsigned char ar_flag;
    116 	unsigned char ar_padding;	/* padding for CLASS64 */
    117 	ARFILE	*ar_next;
    118 };
    119 
    120 typedef struct cmd_info {
    121 	char *arnam;	/* Archive file name */
    122 	int afd;	/* fd for the archive file */
    123 	Elf *arf;	/* Elf descriptor for the archive */
    124 	char *ponam;
    125 	char **namv;
    126 	int namc;
    127 	int opt_flgs;	/* lower case options */
    128 	int OPT_flgs;	/* upper case options */
    129 	int (*comfun)();
    130 	int modified;
    131 	unsigned long bytes_in_mem;
    132 } Cmd_info;
    133 
    134 /*
    135  * options
    136  */
    137 #define	a_FLAG	0x0001
    138 #define	b_FLAG	0x0002
    139 #define	c_FLAG	0x0004
    140 #define	d_FLAG	0x0008
    141 #define	l_FLAG	0x0020
    142 #define	m_FLAG	0x0040
    143 #define	p_FLAG	0x0080
    144 #define	q_FLAG	0x0100
    145 #define	r_FLAG	0x0200
    146 #define	s_FLAG	0x0400
    147 #define	t_FLAG	0x0800
    148 #define	u_FLAG	0x1000
    149 #define	v_FLAG	0x2000
    150 #define	x_FLAG	0x4000
    151 #define	z_FLAG	0x8000
    152 
    153 #define	C_FLAG	0x0001
    154 #define	M_FLAG	0x0002
    155 #define	T_FLAG	0x0004
    156 
    157 /*
    158  * Where is the file contents from ?
    159  */
    160 #define	F_ELFRAW	0x01		/* Mmaped via elf_raw() */
    161 #define	F_MMAPED	0x02		/* Mmaped file contents */
    162 #define	F_MALLOCED	0x04		/* Malloced file contents */
    163 #define	F_CLASS32	0x08		/* This is ELFCLASS32 */
    164 #define	F_CLASS64	0x10		/* This is ELFCLASS64 */
    165 
    166 /*
    167  * Function prototypes
    168  */
    169 int qcmd(Cmd_info *);
    170 int rcmd(Cmd_info *);
    171 int dcmd(Cmd_info *);
    172 int xcmd(Cmd_info *);
    173 int pcmd(Cmd_info *);
    174 int mcmd(Cmd_info *);
    175 int tcmd(Cmd_info *);
    176 
    177 int getaf(Cmd_info *);
    178 char *writefile(Cmd_info *cmd_info);
    179 void error_message(int, ...);
    180 
    181 ARFILE *getfile(Cmd_info *);
    182 ARFILE *newfile();
    183 
    184 char *trim(char *);
    185 
    186 /*
    187  * Error definitions
    188  */
    189 #define	MALLOC_ERROR		0
    190 #define	USAGE_01_ERROR		1
    191 #define	NOT_FOUND_01_ERROR	2
    192 #define	USAGE_02_ERROR		3
    193 #define	USAGE_03_ERROR		4
    194 #define	USAGE_04_ERROR		5
    195 #define	SYS_OPEN_ERROR		6
    196 #define	SYS_READ_ERROR		7
    197 #define	NOT_FOUND_02_ERROR	8
    198 #define	PATHCONF_ERROR		9
    199 #define	SYS_WRITE_ERROR		10
    200 #define	LOCALTIME_ERROR		11
    201 #define	USAGE_05_ERROR		12
    202 #define	ELF_VERSION_ERROR	13
    203 #define	NOT_ARCHIVE_ERROR 	14
    204 #define	USAGE_06_ERROR		15
    205 #define	ELF_MALARCHIVE_ERROR	16
    206 #define	SYS_LSEEK_ERROR		17
    207 #define	NOT_FOUND_03_ERROR	18
    208 #define	SYS_LSEEK_02_ERROR	19
    209 #define	SYS_LSEEK_03_ERROR	20
    210 #define	SYS_LSEEK_04_ERROR	21
    211 #define	DEBUG_INFO_01_ERROR	22
    212 #define	DEBUG_INFO_02_ERROR	23
    213 #define	ELF_INTERNAL_RAND_ERROR	24
    214 #define	ELF_BEGIN_01_ERROR	25
    215 #define	DEBUG_INFO_03_ERROR	26
    216 #define	ELF_BEGIN_02_ERROR	27
    217 #define	ELF_BEGIN_03_ERROR	28
    218 #define	ARCHIVE_IN_ARCHIVE_ERROR	29
    219 #define	ARCHIVE_USAGE_ERROR	30
    220 #define	INTERNAL_01_ERROR	31
    221 #define	ELF_GETSCN_01_ERROR	32
    222 #define	ELF_GETSCN_02_ERROR	33
    223 #define	ELF_GETDATA_01_ERROR	34
    224 #define	ELF_GETDATA_02_ERROR	35
    225 #define	W_ELF_NO_DATA_01_ERROR	36
    226 #define	W_ELF_NO_DATA_02_ERROR	37
    227 #define	INTERNAL_02_ERROR	38
    228 #define	DIAG_01_ERROR		39
    229 #define	BER_MES_CREATE_ERROR	40
    230 #define	SYS_CREATE_01_ERROR	41
    231 #define	SYS_WRITE_02_ERROR	42
    232 #define	BER_MES_WRITE_ERROR	43
    233 #define	SYS_WRITE_03_ERROR	44
    234 #define	SBROW_01_ERROR		45
    235 #define	SBROW_02_ERROR		46
    236 #define	SBROW_03_ERROR		47
    237 #define	SYMTAB_01_ERROR		48
    238 #define	SYMTAB_02_ERROR		49
    239 #define	SYMTAB_03_ERROR		50
    240 #define	SYMTAB_04_ERROR		51
    241 #define	SYMTAB_05_ERROR		52
    242 #define	SYMTAB_06_ERROR		53
    243 #define	SYMTAB_07_ERROR		54
    244 #define	ELF_01_ERROR		55
    245 #define	ELF_02_ERROR		56
    246 #define	OVERRIDE_WARN_ERROR	57
    247 #define	SYS_WRITE_04_ERROR	58
    248 #define	WARN_USER_ERROR		59
    249 #define	ELF_RAWFILE_ERROR	60
    250 
    251 #endif	/* _INC_H */
    252