|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T r
Length: 4550 (0x11c6)
Types: TextFile
Names: »ranlib.c«
└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89
└─⟦4ef0278ca⟧ »./binutils.tar.Z«
└─⟦3761b9c35⟧
└─⟦this⟧ »binutils/ranlib.c«
/* Dummy ranlib program for GNU. All it does is
`ar rs LIBRARY' for each library specified.
Copyright (C) 1989 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <ar.h>
#include <sys/types.h>
#include <sys/file.h>
#include <stdio.h>
#include <fcntl.h>
#include "getopt.h"
#ifndef L_SET
#define L_SET 0
#define L_INCR 1
#endif
#ifdef USG
#define bzero(s, n) (memset ((s), 0, (n)))
#define gettimeofday(TV,TZ) (time (TV))
#define seconds(TV) TV
long time();
#else
#define seconds(TV) TV.tv_sec
#include <sys/time.h>
#endif
void touch_symdefs ();
/* The makefile generates a -D switch to define AR_PROG
as the location of the GNU AR program. */
char *prog = AR_PROG;
int
main (argc, argv)
int argc;
char **argv;
{
static int touch = 0, verbose = 0;
int lose = 0;
static char short_opts[] = "tv";
static struct option long_opts[] =
{
{ "touch", 0, &touch },
{ "verbose", 0, &verbose },
{ 0, 0, 0 }
};
extern int optind;
register int c;
char *args;
int jak;
while ((c = getopt_long (argc, argv, short_opts, long_opts, &jak)) != EOF)
switch (c)
{
case 't':
touch = 1;
break;
case 'v':
verbose = 1;
break;
default:
lose = 1;
break;
}
if (lose)
exit (1);
args = verbose ? "rsv" : "rs";
if (touch)
touch_symdefs (argc - optind, argv + optind);
else
{
register int i;
for (i = optind; i < argc; ++i)
{
#ifdef USG
#define vfork fork
#endif
extern int vfork ();
int pid;
if (verbose)
printf ("%s %s %s\n", prog, args, argv[i]);
fflush (stdout);
fflush (stderr);
pid = vfork ();
if (pid < 0)
perror ("vfork");
else if (pid == 0)
{
/* Child side. */
(void) execl (prog, prog, args, argv[i], 0);
perror (prog);
exit (1);
}
else
{
/* Parent side. */
int status;
if (wait (&status) != pid)
perror ("wait");
if ((status & 0x7f) != 0)
{
psignal (prog, status & 0x7f);
exit (1);
}
else if (((status & 0xff00) >> 8) != 0)
exit ((status & 0xff00) >> 8);
}
}
}
exit (0);
}
/* Take a list of archive files to "touch". This subroutine will then
find the first symdef member in them and update the date to the
current one. */
void
touch_symdefs (largc, largv)
int largc;
char **largv;
{
#ifdef USG
long tv;
#else
struct timeval tv;
struct timezone tz;
#endif
struct ar_hdr archive_header;
int i, rr;
gettimeofday (&tv, &tz);
while (largc--)
{
int fd = open (*largv, O_RDWR);
if (fd < 0)
{
fprintf (stderr, "Couldn't open \"%s\" read/write", *largv);
perror ("");
largv++;
continue;
}
lseek (fd, SARMAG, L_SET);
rr = read (fd, &archive_header, sizeof (archive_header));
/* In the general case this loop would be sped up by buffering,
but in almost all cases the symdef will be the first member, so
I'm not going to bother. */
while (rr == sizeof (archive_header))
{
if (!strncmp ("__.SYMDEF", archive_header.ar_name,
sizeof ("__.SYMDEF") - 1))
{
bzero ((char *) archive_header.ar_date,
sizeof (archive_header.ar_date));
sprintf (archive_header.ar_date, "%d", seconds (tv));
for (i = 0; i < sizeof archive_header.ar_date; i++)
if (archive_header.ar_date[i] == '\0')
archive_header.ar_date[i] = ' ';
lseek (fd, - rr, L_INCR);
write (fd, &archive_header, sizeof (archive_header));
close (fd);
break;
}
lseek (fd, atoi (archive_header.ar_size), L_INCR);
rr = read (fd, &archive_header, sizeof (archive_header));
}
if (rr != sizeof (archive_header))
/* We reached the end of the file. */
fprintf (stderr, "Couldn't find \"__.SYMDEF\" member in %s.\n",
*largv);
largv++;
}
}