Fix ls behavior for broken or very narrow terminals. Fix my_*

functions so they comply with the original interface (i.e. don't
exit on error, stringify uids and gids when no amtching name found).
 -Erik
This commit is contained in:
Eric Andersen 2001-01-30 18:03:11 +00:00
parent 201dc0d5a9
commit e57d54b456
3 changed files with 58 additions and 42 deletions

View File

@ -41,9 +41,12 @@
* 1. requires lstat (BSD) - how do you do it without?
*/
static const int TERMINAL_WIDTH = 80; /* use 79 if your terminal has linefold bug */
static const int COLUMN_WIDTH = 14; /* default if AUTOWIDTH not defined */
static const int COLUMN_GAP = 2; /* includes the file type char, if present */
enum {
TERMINAL_WIDTH = 80, /* use 79 if terminal has linefold bug */
COLUMN_WIDTH = 14, /* default if AUTOWIDTH not defined */
COLUMN_GAP = 2, /* includes the file type char */
};
/************************************************************************/
@ -173,9 +176,9 @@ static unsigned int follow_links=FALSE;
static unsigned short column = 0;
#ifdef BB_FEATURE_AUTOWIDTH
static unsigned short terminal_width;
static unsigned short column_width;
static unsigned short tabstops;
static unsigned short terminal_width = TERMINAL_WIDTH;
static unsigned short column_width = COLUMN_WIDTH;
static unsigned short tabstops = COLUMN_GAP;
#else
static unsigned short column_width = COLUMN_WIDTH;
#endif
@ -434,9 +437,15 @@ void showfiles(struct dnode **dn, int nfiles)
((list_fmt & LIST_INO) ? 8 : 0) +
((list_fmt & LIST_BLOCKS) ? 5 : 0)
;
if (column_width < len) column_width= len;
if (column_width < len)
column_width= len;
}
if (column_width >= 6)
ncols = (int)(terminal_width / (column_width + COLUMN_GAP));
else {
ncols = 1;
column_width = COLUMN_WIDTH;
}
ncols= (int)(terminal_width / (column_width + COLUMN_GAP));
#else
ncols= TERMINAL_WIDTH;
#endif
@ -447,7 +456,12 @@ void showfiles(struct dnode **dn, int nfiles)
break;
}
nrows= nfiles / ncols;
if (ncols > 1) {
nrows = nfiles / ncols;
} else {
nrows = nfiles;
ncols = 1;
}
if ((nrows * ncols) < nfiles) nrows++; /* round up fractionals */
if (nrows > nfiles) nrows= nfiles;
@ -617,15 +631,9 @@ int list_single(struct dnode *dn)
case LIST_ID_NAME:
#ifdef BB_FEATURE_LS_USERNAME
my_getpwuid(scratch, dn->dstat.st_uid);
if (*scratch)
printf("%-8.8s ", scratch);
else
printf("%-8d ", dn->dstat.st_uid);
printf("%-8.8s ", scratch);
my_getgrgid(scratch, dn->dstat.st_gid);
if (*scratch)
printf("%-8.8s", scratch);
else
printf("%-8d", dn->dstat.st_gid);
printf("%-8.8s", scratch);
column += 17;
break;
#endif

42
ls.c
View File

@ -41,9 +41,12 @@
* 1. requires lstat (BSD) - how do you do it without?
*/
static const int TERMINAL_WIDTH = 80; /* use 79 if your terminal has linefold bug */
static const int COLUMN_WIDTH = 14; /* default if AUTOWIDTH not defined */
static const int COLUMN_GAP = 2; /* includes the file type char, if present */
enum {
TERMINAL_WIDTH = 80, /* use 79 if terminal has linefold bug */
COLUMN_WIDTH = 14, /* default if AUTOWIDTH not defined */
COLUMN_GAP = 2, /* includes the file type char */
};
/************************************************************************/
@ -173,9 +176,9 @@ static unsigned int follow_links=FALSE;
static unsigned short column = 0;
#ifdef BB_FEATURE_AUTOWIDTH
static unsigned short terminal_width;
static unsigned short column_width;
static unsigned short tabstops;
static unsigned short terminal_width = TERMINAL_WIDTH;
static unsigned short column_width = COLUMN_WIDTH;
static unsigned short tabstops = COLUMN_GAP;
#else
static unsigned short column_width = COLUMN_WIDTH;
#endif
@ -434,9 +437,15 @@ void showfiles(struct dnode **dn, int nfiles)
((list_fmt & LIST_INO) ? 8 : 0) +
((list_fmt & LIST_BLOCKS) ? 5 : 0)
;
if (column_width < len) column_width= len;
if (column_width < len)
column_width= len;
}
if (column_width >= 6)
ncols = (int)(terminal_width / (column_width + COLUMN_GAP));
else {
ncols = 1;
column_width = COLUMN_WIDTH;
}
ncols= (int)(terminal_width / (column_width + COLUMN_GAP));
#else
ncols= TERMINAL_WIDTH;
#endif
@ -447,7 +456,12 @@ void showfiles(struct dnode **dn, int nfiles)
break;
}
nrows= nfiles / ncols;
if (ncols > 1) {
nrows = nfiles / ncols;
} else {
nrows = nfiles;
ncols = 1;
}
if ((nrows * ncols) < nfiles) nrows++; /* round up fractionals */
if (nrows > nfiles) nrows= nfiles;
@ -617,15 +631,9 @@ int list_single(struct dnode *dn)
case LIST_ID_NAME:
#ifdef BB_FEATURE_LS_USERNAME
my_getpwuid(scratch, dn->dstat.st_uid);
if (*scratch)
printf("%-8.8s ", scratch);
else
printf("%-8d ", dn->dstat.st_uid);
printf("%-8.8s ", scratch);
my_getgrgid(scratch, dn->dstat.st_gid);
if (*scratch)
printf("%-8.8s", scratch);
else
printf("%-8d", dn->dstat.st_gid);
printf("%-8.8s", scratch);
column += 17;
break;
#endif

View File

@ -871,7 +871,7 @@ long my_getpwnam(char *name)
myuser = getpwnam(name);
if (myuser==NULL)
error_msg_and_die( "unknown username: %s\n", name);
return(-1);
return myuser->pw_uid;
}
@ -883,7 +883,7 @@ long my_getgrnam(char *name)
mygroup = getgrnam(name);
if (mygroup==NULL)
error_msg_and_die( "unknown group: %s\n", name);
return(-1);
return (mygroup->gr_gid);
}
@ -895,9 +895,9 @@ void my_getpwuid(char *name, long uid)
myuser = getpwuid(uid);
if (myuser==NULL)
error_msg_and_die( "unknown uid %ld\n", (long)uid);
strcpy(name, myuser->pw_name);
sprintf(name, "%-8ld ", (long)uid);
else
strcpy(name, myuser->pw_name);
}
/* gets a groupname given a gid */
@ -907,9 +907,9 @@ void my_getgrgid(char *group, long gid)
mygroup = getgrgid(gid);
if (mygroup==NULL)
error_msg_and_die( "unknown gid %ld\n", (long)gid);
strcpy(group, mygroup->gr_name);
sprintf(group, "%-8ld ", (long)gid);
else
strcpy(group, mygroup->gr_name);
}
#if defined BB_ID