Subject: Static-ls for fileutils 3-16

From: [email-masked] (Pedro Melo)
Date: Wed, 26 Mar 1997 13:32:59 GMT

Hi!

I have made a small procedure for compiling ls static on Solaris. Tested on
Solaris 2.5.1 with gcc and fileutils-3.16

Basically I adapted the current procedure to the new fileutils (old one was
for fileutils-3.13) and use the same static-ls.c from Emil.

It might be good to put it online so I'm CC'ing this to Darci who maintains
the HowTo for WuFtpd on Solaris

Melo

--------------
Ok, a small procedure to build a staitc ls.

1. get fileutils-3.16 from your favourite GNU mirror site.
2. Unpack
3. apply the patch (see below)
4. copy static-ls.c (see below) to the fileutils-3.16/src/ subdirectory. 
   static-ls contains some the functions that Solaris does not provide
   statically. This file is the work of Emil Isberg <[email-masked]> and 
   Brett Porter <[email-masked]>. Great work!
5. cd into fileutils-3.16
6. run configure
7. make
8. cd into src
9. test with truss ./ls -la 2> err
   err should not contain any references to any libs...
   file ls should report somethink like
ELF 32-bit MSB executable SPARC Version 1, statically linked, not stripped

10. (Optional) strip ls

You can now copy it into your bin directory.

Files needed.

---------cut here:  ls-static.patch------------
*** fileutils-3.16/src/Makefile.in	Mon Jan 27 02:26:57 1997
--- fileutils-3.16-prep/src/Makefile.in	Wed Mar 26 12:56:16 1997
***************
*** 74,79 ****
--- 74,80 ----
  cp_SOURCES = cp.c cp-aux.c cp-hash.c
  dir_SOURCES = ls.c ls-dir.c
  vdir_SOURCES = ls.c ls-vdir.c
+ static-ls_SOURCES = static-ls.c
  ls_SOURCES = ls.c ls-ls.c
  
  BUILT_SOURCES = dircolors.h
***************
*** 155,164 ****
  vdir_LDADD = $(LDADD)
  vdir_DEPENDENCIES =  ../lib/libfu.a
  vdir_LDFLAGS = 
! ls_OBJECTS =  ls.$o ls-ls.$o
  ls_LDADD = $(LDADD)
  ls_DEPENDENCIES =  ../lib/libfu.a
! ls_LDFLAGS = 
  mkdir_SOURCES = mkdir.c
  mkdir_OBJECTS =  mkdir.$o
  mkdir_LDADD = $(LDADD)
--- 156,166 ----
  vdir_LDADD = $(LDADD)
  vdir_DEPENDENCIES =  ../lib/libfu.a
  vdir_LDFLAGS = 
! static-ls_OBJECTS =  static-ls.$o
! ls_OBJECTS =  ls.$o ls-ls.$o $(static-ls_OBJECTS)
  ls_LDADD = $(LDADD)
  ls_DEPENDENCIES =  ../lib/libfu.a
! ls_LDFLAGS = -static
  mkdir_SOURCES = mkdir.c
  mkdir_OBJECTS =  mkdir.$o
  mkdir_LDADD = $(LDADD)
***************
*** 199,205 ****
  touch_LDADD = $(LDADD)
  touch_DEPENDENCIES =  ../lib/libfu.a
  touch_LDFLAGS = 
! CFLAGS = @CFLAGS@
  COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
  LINK = $(CC) $(LDFLAGS) -o $@
  HEADERS =  $(noinst_HEADERS)
--- 201,207 ----
  touch_LDADD = $(LDADD)
  touch_DEPENDENCIES =  ../lib/libfu.a
  touch_LDFLAGS = 
! CFLAGS = -static @CFLAGS@
  COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
  LINK = $(CC) $(LDFLAGS) -o $@
  HEADERS =  $(noinst_HEADERS)
----------- cut here ---------------------------

----------- cut here: static-ls.c --------------
/* static-ls.c rec.1, by Emil Isberg <[email-masked]> */
/* static-ls.c rev.2, by Brett Porter <[email-masked]>*/
/* static-ls.c rev.2.1, by Emil Isberg <[email-masked]> */
/*  for gnufileutils ..  under Solaris 2.5 */
/* To compile .. get the lates version of gnufileutil .. */
/*  add this file */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>

#define FPASSWD "/etc/passwd"
#define FGROUP  "/etc/group"

char *dlopen()  { return 0;}
int   dlclose() { return 0;}
char *dlsym()   { return 0;}
char *dlerror() { return "dynamic linking not loaded";}

typedef struct {
  uid_t uid;
  char *user_name;
} pw_entry;

typedef struct {
  gid_t gid;
  char *group_name;
} group_entry;

static pw_entry    *pw_array = NULL;
static group_entry *group_array = NULL;

static void fill_pw_array (void);
static void fill_group_array (void);

static void
fill_pw_array (void)
{
  int fd;
  int ok;
  static char *pw_buf;
  struct stat statbuf;
  char *cp;
  int n_entries;
  int n_read;
  int entry;

  fd = open (FPASSWD, O_RDONLY);
  if (fd < 0) {
    fprintf (stderr, "Error opening password file.\n");
    return;
  }

  ok = fstat (fd, &statbuf);
  if (ok != 0) {
    fprintf (stderr, "Error stat-ing passwd file.\n");
    close (fd);
    return;
  }

  pw_buf = malloc (statbuf.st_size + 1);
  if (pw_buf == NULL) {
    fprintf (stderr, "Error allocating memory.\n");
    close (fd);
    return;
  }

  n_read = read (fd, pw_buf, (size_t) statbuf.st_size);
  if (n_read !=  statbuf.st_size) {
    perror (NULL);
    fprintf (stderr, "Error reading password file.\n");
    free (pw_buf);
    close (fd);
    return;
  }
  pw_buf [statbuf.st_size] = '\0';
  close (fd);

  n_entries = 0;
  for (cp = pw_buf; *cp != '\0'; cp++) {
    if (*cp == '\n')
      n_entries++;
  }

  pw_array = (pw_entry *) malloc ((n_entries + 1) * sizeof (pw_entry));
  if (pw_array == NULL) {
    fprintf (stderr, "Error allocating memory.\n");
    free (pw_buf);
    return;
  }

  pw_array [n_entries].uid = -1;
  cp = pw_buf;
  for (entry = 0; entry < n_entries; entry++) {
    pw_array [entry].user_name = cp;
    while (*cp != ':')
      cp++;
    *cp++ = '\0';
    while (*cp != ':')
      cp++;
    cp++;
    pw_array [entry].uid = atoi (cp);
    while (*cp != '\n')
      cp++;
    cp++;
  }
}

static void
fill_group_array (void)
{
  int fd;
  int ok;
  static char *group_buf;
  struct stat statbuf;
  char *cp;
  int n_entries;
  int n_read;
  int entry;

  fd = open (FGROUP, O_RDONLY);
  if (fd < 0) {
    fprintf (stderr, "Error opening group file.\n");
    return;
  }

  ok = fstat (fd, &statbuf);
  if (ok != 0) {
    fprintf (stderr, "Error stat-ing group file.\n");
    close (fd);
    return;
  }

  group_buf = malloc (statbuf.st_size + 1);
  if (group_buf == NULL) {
    fprintf (stderr, "Error allocating memory.\n");
    close (fd);
    return;
  }

  n_read = read (fd, group_buf, (size_t) statbuf.st_size);
  if (n_read !=  statbuf.st_size) {
    perror (NULL);
    fprintf (stderr, "Error reading group file.\n");
    free (group_buf);
    close (fd);
    return;
  }
  group_buf [statbuf.st_size] = '\0';
  close (fd);

  n_entries = 0;
  for (cp = group_buf; *cp != '\0'; cp++) {
    if (*cp == '\n')
      n_entries++;
  }

  group_array =
    (group_entry *) malloc ((n_entries + 1) * sizeof (group_entry));
  if (group_array == NULL) {
    fprintf (stderr, "Error allocating memory.\n");
    free (group_buf);
    return;
  }

  group_array [n_entries].gid = -1;
  cp = group_buf;
  for (entry = 0; entry < n_entries; entry++) {
    group_array [entry].group_name = cp;
    while (*cp != ':')
      cp++;
    *cp++ = '\0';
    while (*cp != ':')
      cp++;
    cp++;
    group_array [entry].gid = atoi (cp);
    while (*cp != '\n')
      cp++;
    cp++;
  }
}

char *
getuser(uid_t uid)
{
  pw_entry *p_pw;
  static char uid_str [11];

  if (pw_array == NULL)
    fill_pw_array ();
  if (pw_array == NULL) {
    sprintf (uid_str, "%lu", uid);
    return uid_str;
  }

  for (p_pw = pw_array; p_pw->uid != -1; p_pw++) {
    if (p_pw->uid == uid)
      return p_pw->user_name;
  }
  sprintf (uid_str, "%lu", uid);
  return uid_str;
}
 
char *
getgroup(gid_t gid)
{
  group_entry *p_group;
  static char gid_str [11];

  if (group_array == NULL)
    fill_group_array ();
  if (group_array == NULL) {
    sprintf (gid_str, "%lu", gid);
    return gid_str;
  }

  for (p_group = group_array; p_group->gid != -1; p_group++) {
    if (p_group->gid == gid)
      return p_group->group_name;
  }
  sprintf (gid_str, "%lu", gid);
  return gid_str;
}
------------------ cut here --------------------
--
************** Pedro Melo ([email-masked]) BOFH ******************
*   TELENET, Servicos de Telecomunicacoes, SA - Tel +351 1 3139190   *
* finger [email-masked] or search key servers for PGP key *
*           It's management's job to support the geniuses,           *
*                      not to tell them what to do                   *
**********************************************************************

---

From: Paradise Cowgirl <[email-masked]>
Date: Wed, 26 Mar 1997 06:22:25 -0800 (PST)

> the HowTo for WuFtpd on Solaris

Pedro,

I will update the document/procedure later today, thanks for sending it to
me!

Cheers,
Darci Chapman

PS sorry about that bad URL, the document has now moved to:
http://www.teleport.com/~minerva/wu-fptd/wuftpd.shtml though it looks like
many of you were able to find it okay anyway ($^$@!!& ISP - couldn't get
here last night when I was in the middle of moving things around )-:

---

From: Kent Landfield <[email-masked]>
Date: Wed, 26 Mar 1997 09:17:59 -0600 (CST)

Melo wrote:

# I have made a small procedure for compiling ls static on Solaris. Tested on
# Solaris 2.5.1 with gcc and fileutils-3.16
# 
# Basically I adapted the current procedure to the new fileutils (old one was
# for fileutils-3.13) and use the same static-ls.c from Emil.
# 
# It might be good to put it online so I'm CC'ing this to Darci who maintains
# the HowTo for WuFtpd on Solaris

Thank you!  I tried to statically compile ls once before when I really didn't 
have the time to do it right... As it was not critical to my operations I
blew it off meaning to get back to it sometime, someday.

Since your message came across I thought it might be a good time to steal
a couple minutes and try again. I just tried your procedure and it worked 
great!  First shot. 10 minutes to unpack, change, compile and install. :-)

To anyone having troubles with Solaris and dynamically linked ls... Use this!

I've put a copy of your message in my archive as

	{http|ftp}:/www.landfield.com/wu-ftpd/support/static-ls.how-to

There is also a copy of fileutils-3.16 there for convenience.

THANKS Melo!

-- 
Kent Landfield                        Phone: 1-817-545-2502             
The Landfield Group                   FAX:   1-817-545-7650             
Email: [email-masked]             http://www.landfield.com/
Please send comp.sources.misc related mail to [email-masked].
Search the Usenet Hypertext FAQ Archive at http://www.faqs.org/faqs/