SUMMARY:static ls for ftpd, where?

From: Bevan Broun (bevanb@ee.uwa.edu.au)
Date: Fri Jan 08 1999 - 20:12:11 CST


Thanks to
Aki Sasaki <Aki.Sasaki@barra.com>
"J.J.Bailey" <jjb@bcc.com>
"Douglas C. Palmer" <palmer@nyed.uscourts.gov>
"Rose, Robert" <Robert.Rose@ag.gov.au>
Stephen Harris <sweh@mpn.com>
"Brion Leary" <brion@dia.state.ma.us>
Simon-Bernard Drolet <Simon-Bernard.Drolet@M3iSystems.com>
Renny Koshy <rkoshy@xl.com>

> There are summaries in the archives about this and I have read them.
> I have compiled wu-ftpd-2.4.2-beta-18 on solaris 2.6 and ls doesnt work
> for anon users. This is because the ls from /bin is dynamically linked
> and ftp for anon users is chrooted.
>
> So the neccasary libs can be copied to ~ftp (but what are these files
> for 2.6, it's not as simple as typing ldd /bin/ls)

The files needed are listed in the man page for solaris's in.ftpd.
This includes character special files needed in ~ftp/dev. I
have done this and now have working anon ftp.

> or better yet build a statically linked ls. I have tried to build
> the ls from ftp://ftp.funet.fi/pub/unix/src/ftpd-ls.tar.gz
>
> but get:
> Undefined first referenced
> symbol in file
> major print.o
> getwd ls.o
> minor print.o
> ld: fatal: Symbol referencing errors. No output written to ls
> make: *** [ls] Error 1

Aki Sasaki <Aki.Sasaki@barra.com> sent the proceedure, patch and
static-ls.c included at the end of this mail for building a static ls
on solaris based on the ls in gnu fileutils-3.16. I have just done
this and it works.

Thanks again

Bevan

-- 
Bevan Broun                                           ph (08) 9380 1587
Computer Systems Officer                             fax (08) 9380 1065
Dept. Electrical and Electronic Engineering      
University of Western Australia                                 rm. G70

Aki Sasaki <Aki.Sasaki@barra.com> 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 <eig@mds.mdh.se> and Brett Porter <porter@carbon.chem.nyu.edu>. 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 <eig@mds.mdh.se> */ /* static-ls.c rev.2, by Brett Porter <porter@carbon.chem.nyu.edu>*/ /* static-ls.c rev.2.1, by Emil Isberg <eig@mds.mdh.se> */ /* 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 --------------------



This archive was generated by hypermail 2.1.2 : Fri Sep 28 2001 - 23:13:13 CDT