brandelf.c revision 18962
152419Sjulian/*-
252419Sjulian * Copyright (c) 1996 S�ren Schmidt
352419Sjulian * All rights reserved.
452419Sjulian *
552419Sjulian * Redistribution and use in source and binary forms, with or without
670700Sjulian * modification, are permitted provided that the following conditions
752419Sjulian * are met:
852419Sjulian * 1. Redistributions of source code must retain the above copyright
952419Sjulian *    notice, this list of conditions and the following disclaimer
1052419Sjulian *    in this position and unchanged.
1152419Sjulian * 2. Redistributions in binary form must reproduce the above copyright
1252419Sjulian *    notice, this list of conditions and the following disclaimer in the
1352419Sjulian *    documentation and/or other materials provided with the distribution.
1452419Sjulian * 3. The name of the author may not be used to endorse or promote products
1552419Sjulian *    derived from this software withough specific prior written permission
1652419Sjulian *
1770700Sjulian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1852419Sjulian * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1952419Sjulian * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2052419Sjulian * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2152419Sjulian * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2252419Sjulian * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2352419Sjulian * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2452419Sjulian * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2552419Sjulian * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2652419Sjulian * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2752419Sjulian *
2852419Sjulian *  $Id$
2952419Sjulian */
3052419Sjulian
3152419Sjulian#include <stdlib.h>
3252419Sjulian#include <stdio.h>
3352419Sjulian#include <fcntl.h>
3452419Sjulian#include <sys/imgact_elf.h>
3552419Sjulian
3667506Sjulianint usage();
3767506Sjulian
3852419Sjulianmain(int argc, char **argv)
3952419Sjulian{
4052419Sjulian	extern char *optarg;
4152419Sjulian	extern int optind;
4252419Sjulian
4352419Sjulian	char type[10] = "FreeBSD";
4452419Sjulian	int ch, change = 0, verbose = 0;
4552419Sjulian
4652419Sjulian	while ((ch = getopt(argc, argv, "t:v")) != EOF)
4752419Sjulian		switch (ch) {
4852419Sjulian		case 'v':
4952419Sjulian			verbose = 1;
5052419Sjulian			break;
5152419Sjulian		case 't':
5252419Sjulian			change = 1;
5370700Sjulian			strcpy(type, optarg);
5452419Sjulian			break;
5552419Sjulian		default:
5652419Sjulian			usage();
5752843Sphk	}
5852816Sarchie	argc -= optind;
5952419Sjulian	argv += optind;
6052419Sjulian	if (!argc) {
6152419Sjulian		fprintf(stderr, "No file(s) specified.\n");
6252419Sjulian		exit(1);
6352419Sjulian	}
6453913Sarchie	while (argc) {
6552419Sjulian		int fd;
6659756Speter		char buffer[EI_NINDENT];
6759756Speter		char string[(EI_NINDENT-EI_SPARE)+1];
6870784Sjulian
6970700Sjulian		if ((fd = open(argv[0], O_RDWR, 0)) < 0) {
7070700Sjulian			fprintf(stderr, "No such file %s.\n", argv[0]);
7152419Sjulian			goto fail;
7270784Sjulian
7370784Sjulian		}
7470784Sjulian		if (read(fd, buffer, EI_NINDENT) < EI_NINDENT) {
7570784Sjulian			fprintf(stderr, "File '%s' too short.\n", argv[0]);
7670784Sjulian			goto fail;
7770784Sjulian		}
7870784Sjulian		if (buffer[0] != ELFMAG0 || buffer[1] != ELFMAG1 ||
7970784Sjulian		    buffer[2] != ELFMAG2 || buffer[3] != ELFMAG3) {
8070784Sjulian			fprintf(stderr, "File '%s' is not ELF format.\n",
8170784Sjulian				argv[0]);
8270784Sjulian			goto fail;
8370784Sjulian		}
8470784Sjulian		if (!change) {
8570700Sjulian			bzero(string, sizeof(string));
8670700Sjulian			strncpy(string, &buffer[EI_SPARE], EI_NINDENT-EI_SPARE);
8770700Sjulian			if (strlen(string)) {
8870700Sjulian				fprintf(stdout, "File '%s' is of brand '%s'.\n",
8952419Sjulian					argv[0], string);
9070700Sjulian			}
9170700Sjulian			else
9252419Sjulian				fprintf(stdout, "File '%s' has no branding.\n",
9370700Sjulian					argv[0]);
9470700Sjulian		}
9552722Sjulian		else {
9670700Sjulian			strncpy(&buffer[EI_SPARE], type, EI_NINDENT-EI_SPARE);
9770700Sjulian			lseek(fd, 0, SEEK_SET);
9852722Sjulian			if (write(fd, buffer, EI_NINDENT) != EI_NINDENT) {
9970700Sjulian				fprintf(stderr, "Error writing %s\n", argv[0]);
10070700Sjulian				goto fail;
10170700Sjulian			}
10270700Sjulian		}
10352419Sjulianfail:
10452419Sjulian		argc--;
10552419Sjulian		argv++;
10652419Sjulian	}
10770700Sjulian}
10852722Sjulian
10952419Sjulianint
11070700Sjulianusage()
11152419Sjulian{
11270700Sjulian	fprintf(stderr, "Usage: brandelf [-t string] file ...\n");
11370700Sjulian}
11470700Sjulian