/*
* To achieve a small memory footprint, this version of 'ls' doesn't do any
* file sorting, and only has the most essential command line switches
- * (i.e. the ones I couldn't live without :-) All features which involve
+ * (i.e., the ones I couldn't live without :-) All features which involve
* linking in substantial chunks of libc can be disabled.
*
* Although I don't really want to add new features to this program to
};
typedef struct dnode dnode_t;
-struct dnode **list_dir(char *);
-struct dnode **dnalloc(int);
-int list_single(struct dnode *);
+static struct dnode **list_dir(char *);
+static struct dnode **dnalloc(int);
+static int list_single(struct dnode *);
static unsigned int disp_opts;
static unsigned int style_fmt;
static int status = EXIT_SUCCESS;
#ifdef BB_FEATURE_HUMAN_READABLE
-unsigned long ls_disp_hr = 0;
+static unsigned long ls_disp_hr = 0;
#endif
static int my_stat(struct dnode *cur)
strcmp(dn->name, "..") != 0);
}
-int countdirs(struct dnode **dn, int nfiles)
+static int countdirs(struct dnode **dn, int nfiles)
{
int i, dirs;
return(dirs);
}
-int countsubdirs(struct dnode **dn, int nfiles)
+static int countsubdirs(struct dnode **dn, int nfiles)
{
int i, subdirs;
return subdirs;
}
-int countfiles(struct dnode **dnp)
+static int countfiles(struct dnode **dnp)
{
int nfiles;
struct dnode *cur;
}
/* get memory to hold an array of pointers */
-struct dnode **dnalloc(int num)
+static struct dnode **dnalloc(int num)
{
struct dnode **p;
return(p);
}
-void dfree(struct dnode **dnp)
+static void dfree(struct dnode **dnp)
{
struct dnode *cur, *next;
free(dnp); /* free the array holding the dnode pointers */
}
-struct dnode **splitdnarray(struct dnode **dn, int nfiles, int which)
+static struct dnode **splitdnarray(struct dnode **dn, int nfiles, int which)
{
int dncnt, i, d;
struct dnode **dnp;
/*----------------------------------------------------------------------*/
#ifdef BB_FEATURE_LS_SORTFILES
-int sortcmp(struct dnode *d1, struct dnode *d2)
+static int sortcmp(struct dnode *d1, struct dnode *d2)
{
int cmp, dif;
}
/*----------------------------------------------------------------------*/
-void shellsort(struct dnode **dn, int size)
+static void shellsort(struct dnode **dn, int size)
{
struct dnode *temp;
int gap, i, j;
#endif
/*----------------------------------------------------------------------*/
-void showfiles(struct dnode **dn, int nfiles)
+static void showfiles(struct dnode **dn, int nfiles)
{
int i, ncols, nrows, row, nc;
#ifdef BB_FEATURE_AUTOWIDTH
}
/*----------------------------------------------------------------------*/
-void showdirs(struct dnode **dn, int ndirs)
+static void showdirs(struct dnode **dn, int ndirs)
{
int i, nfiles;
struct dnode **subdnp;
}
/*----------------------------------------------------------------------*/
-struct dnode **list_dir(char *path)
+static struct dnode **list_dir(char *path)
{
struct dnode *dn, *cur, **dnp;
struct dirent *entry;
}
while ((entry = readdir(dir)) != NULL) {
/* are we going to list the file- it may be . or .. or a hidden file */
- if ((strcmp(entry->d_name, ".")==0) && !(disp_opts & DISP_DOT)) continue;
- if ((strcmp(entry->d_name, "..")==0) && !(disp_opts & DISP_DOT)) continue;
- if ((entry->d_name[0] == '.') && !(disp_opts & DISP_HIDDEN)) continue;
+ if ((strcmp(entry->d_name, ".")==0) && !(disp_opts & DISP_DOT))
+ continue;
+ if ((strcmp(entry->d_name, "..")==0) && !(disp_opts & DISP_DOT))
+ continue;
+ if ((entry->d_name[0] == '.') && !(disp_opts & DISP_HIDDEN))
+ continue;
cur= (struct dnode *)xmalloc(sizeof(struct dnode));
- cur->fullname = xmalloc(strlen(path)+1+strlen(entry->d_name)+1);
- strcpy(cur->fullname, path);
- if (cur->fullname[strlen(cur->fullname)-1] != '/')
- strcat(cur->fullname, "/");
- cur->name= cur->fullname + strlen(cur->fullname);
- strcat(cur->fullname, entry->d_name);
+ cur->fullname = concat_path_file(path, entry->d_name);
+ cur->name = cur->fullname +
+ (strlen(cur->fullname) - strlen(entry->d_name));
if (my_stat(cur))
continue;
cur->next= dn;
}
/*----------------------------------------------------------------------*/
-int list_single(struct dnode *dn)
+static int list_single(struct dnode *dn)
{
- int i, len;
+ int i;
char scratch[BUFSIZ + 1];
#ifdef BB_FEATURE_LS_TIMESTAMPS
char *filetime;
for (i=0; i<=31; i++) {
switch (list_fmt & (1<<i)) {
case LIST_INO:
- printf("%7ld ", dn->dstat.st_ino);
+ printf("%7ld ", (long int)dn->dstat.st_ino);
column += 8;
break;
case LIST_BLOCKS:
#ifdef BB_FEATURE_HUMAN_READABLE
- fprintf(stdout, "%5s ", make_human_readable_str(dn->dstat.st_blocks>>1,
- (ls_disp_hr==TRUE)? 0: 1));
+ fprintf(stdout, "%6s ", make_human_readable_str(dn->dstat.st_blocks>>1,
+ KILOBYTE, (ls_disp_hr==TRUE)? 0: KILOBYTE));
#else
#if _FILE_OFFSET_BITS == 64
printf("%4lld ", dn->dstat.st_blocks>>1);
column += 5;
break;
case LIST_MODEBITS:
- printf("%10s", (char *)mode_string(dn->dstat.st_mode));
+ printf("%-10s ", (char *)mode_string(dn->dstat.st_mode));
column += 10;
break;
case LIST_NLINKS:
- printf("%4d ", dn->dstat.st_nlink);
+ printf("%4ld ", (long)dn->dstat.st_nlink);
column += 10;
break;
case LIST_ID_NAME:
my_getpwuid(scratch, dn->dstat.st_uid);
printf("%-8.8s ", scratch);
my_getgrgid(scratch, dn->dstat.st_gid);
- printf("%-8.8s", scratch);
+ printf("%-8.8s ", scratch);
column += 17;
break;
#endif
printf("%4d, %3d ", (int)MAJOR(dn->dstat.st_rdev), (int)MINOR(dn->dstat.st_rdev));
} else {
#ifdef BB_FEATURE_HUMAN_READABLE
- fprintf(stdout, "%9s ", make_human_readable_str(dn->dstat.st_size,
- (ls_disp_hr==TRUE)? 0: 1));
-#else
+ if (ls_disp_hr==TRUE) {
+ fprintf(stdout, "%8s ", make_human_readable_str(dn->dstat.st_size, 1, 0));
+ } else
+#endif
+ {
#if _FILE_OFFSET_BITS == 64
- printf("%9lld ", dn->dstat.st_size>>1);
+ printf("%9lld ", (long long)dn->dstat.st_size);
#else
- printf("%9ld ", dn->dstat.st_size>>1);
-#endif
+ printf("%9ld ", dn->dstat.st_size);
#endif
+ }
}
column += 10;
break;
break;
case LIST_SYMLINK:
if (S_ISLNK(dn->dstat.st_mode)) {
- len= readlink(dn->fullname, scratch, (sizeof scratch)-1);
- if (len > 0) {
- scratch[len]= '\0';
- printf(" -> %s", scratch);
+ char *lpath = xreadlink(dn->fullname);
+ if (lpath) {
+ printf(" -> %s", lpath);
#ifdef BB_FEATURE_LS_FILETYPES
if (!stat(dn->fullname, &info)) {
append = append_char(info.st_mode);
}
#endif
- column += len+4;
+ column += strlen(lpath) + 4;
+ free(lpath);
}
}
break;