Subject: Re: Static-ls

From: [email-masked]
Date: Wed, 26 Mar 1997 16:11:27 -0600 (CST)

Has anyone else noticed peculiar /bin/ls behavior under IRIX5.3?
I have guest,anonymous, and real accounts set in the ftpaccess...the last
two operate correctly.  The one for the guestgroup (set up exactly as per
M.Brennen's guest-howto; TNX**googol BTW) "appears" to work in every way
except the /bin/ls delivers a null return for even 555 files and directories
quite happily without complaint, even in debug mode.  All other commands
appear to function correctly.  Limitations function correctly.

Under IRIX there is no equivalent library to the one in the build below so I
am sad to say I cannot even try this.

M.Bergstrom

At 01:32 PM 3/26/97 GMT, you wrote:
>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: "Jeff Hanson" <[email-masked]>
Date: Thu, 27 Mar 1997 09:55:26 -0500

Have you built a static ls from gnu?  It is much easier under IRIX to build
staticlly linked executables than under Solaris.  Use the -non_shared on the
compile and link line and you have to have installed the non shared libaries
which are in c_dev.sw.speclib and compiler_dev.sw.speclib and
dev.sw.irix_speclibs.

-- 
---------------------------------------------------------------------------
 Jeff Hanson ([email-masked]) - Computing Wizard for HSSO
 NYMA, Inc., Senior Member of the Technical Staff
 NASA Lewis Research Center, MS 77-10, Cleveland, Ohio 44135
 Telephone - (216) 433-2284            Fax - (216) 433-3918