hall@cod.NOSC.MIL (Robert R. Hall) (05/19/89)
It was stated in a previous article that the Minix ls doesn't
print in columns. Chris Wee posted a patch for version 1.2
which had the -w option to print in 4 coloumns
and the -x option to print "/" after directory names.
These options did not get included into the version 1.3 update
and thus got dropped.
Here is a patch to add these options to version 1.3 LS again.
-------------------- ls.cdiff ------------------------------
*** /usr/v1.3d/commands/ls.c Fri May 12 10:30:31 1989
--- ls.c Thu May 18 13:11:02 1989
***************
*** 1,19 ****
/* ls - list files and directories Author: Andy Tanenbaum */
/* Version: Minix 1.3 */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <minix/const.h>
#include <minix/type.h>
! #include <fs/const.h>
! #include <fs/type.h>
#define DIRNAMELEN 14 /* # chars in a directory entry name */
#define NFILE 256 /* max files in arg list to ls */
#define MAXPATHLEN 256 /* max chars in a path name */
#define NDIRBLOCKS 16 /* max length of a directory */
! #define LEGAL 0x0E0969L /* legal flags to ls */
struct file {
char *name;
--- 1,27 ----
/* ls - list files and directories Author: Andy Tanenbaum */
/* Version: Minix 1.3 */
+ /* modified: Chris Wee
+ * date: 7 May 1988
+ */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <minix/const.h>
#include <minix/type.h>
! #include "../fs/const.h"
! #include "../fs/type.h"
#define DIRNAMELEN 14 /* # chars in a directory entry name */
#define NFILE 256 /* max files in arg list to ls */
#define MAXPATHLEN 256 /* max chars in a path name */
#define NDIRBLOCKS 16 /* max length of a directory */
! #define LEGAL 0xDE096DL /* legal flags to ls */
! /* xw_utsr_____l__i_gf_dc_a */
! #define N_COLUMNS 4
! #define COLWIDTH 20 /* enuf for 4 cols on 80-col display */
!
! int column = 0; /* column # */
struct file {
char *name;
***************
*** 83,88 ****
--- 91,98 ----
}
if (topfiles == 0) print_total(0, nrfiles);
print(0, nrfiles, expand_flag, "");
+ if (column) /* if not in first column, then another newline */
+ fprintf(stdout,"\n");
fflush(stdout);
exit(0);
}
***************
*** 99,106 ****
k = argc - topfiles;
statflag = (topfiles == 0 ? 0 : 1);
! if (present('c') || present('t') || present('u')) statflag = 1;
! if (present('s') || present('l')) statflag = 1;
while (k < argc) fill_file("", argv[k++], statflag,1);
}
--- 109,117 ----
k = argc - topfiles;
statflag = (topfiles == 0 ? 0 : 1);
! if (present('c') || present('t') || present('u') ||
! present('s') || present('l') || present('x'))
! statflag = 1;
while (k < argc) fill_file("", argv[k++], statflag,1);
}
***************
*** 265,273 ****
fprintf(stdout, "Directory %s too long\n", fp->name);
return;
}
! statflag = 0;
! if (present('c') || present('t') || present('u')) statflag = 1;
! if (present('s') || present('l')) statflag = 1;
for (k = 0; k < klim; k++) {
if (dir[k].inum != 0) {
--- 276,284 ----
fprintf(stdout, "Directory %s too long\n", fp->name);
return;
}
!
! statflag = ( present('c') || present('t') || present('u') ||
! present('s') || present('l') || present('x') ) ? 1 : 0;
for (k = 0; k < klim; k++) {
if (dir[k].inum != 0) {
***************
*** 319,325 ****
struct file *fp;
int is_path;
{
! int blks, m, prot, s;
char *p1, *p2, *p3, c;
if (present('i')) fprintf(stdout, "%5d ", fp->inumber);
--- 330,336 ----
struct file *fp;
int is_path;
{
! int blks, m, lenght, prot, s;
char *p1, *p2, *p3, c;
if (present('i')) fprintf(stdout, "%5d ", fp->inumber);
***************
*** 359,392 ****
s = (short) fp->size;
fprintf(stdout, "%3d, %3d ", (s>>8)&0377, s&0377);
} else {
! fprintf(stdout, "%8D ", fp->size);
}
date(fp->modtime);
}
/* Print file name. */
! m = 0;
! pfname(fp->name,fp->is_path);
! fprintf(stdout, "\n");
! }
!
! pfname(ptr,pathflag)
! char *ptr;
! int pathflag;
! {
! int m;
! if (pathflag) {
! fprintf(stdout,"%s",ptr);
! } else {
! /* dirname entry is null terminated if length < 14 */
! m = 0;
! while (*ptr && m < DIRNAMELEN) {
! putc(*ptr++, stdout);
! ++m;
! }
}
}
owngrp(fp)
--- 370,423 ----
s = (short) fp->size;
fprintf(stdout, "%3d, %3d ", (s>>8)&0377, s&0377);
} else {
! fprintf(stdout, "%7D ", fp->size);
}
date(fp->modtime);
}
/* Print file name. */
! lenght = len(fp->name);
! m = 0;
! pfname(fp->name,fp->is_path);
!
! /*
! * print tailing file indicator symbol if -F flag is present
! */
! if (present('x') && ((fp->mode & I_TYPE) == I_DIRECTORY)) {
! fprintf(stdout,"/");
! lenght++;
! }
!
! /*
! * print filenames in columns as default
! */
! if (present('l') || !present('w') || (++column == N_COLUMNS)) {
! column = 0; /* reset column # */
! fprintf(stdout, "\n");
! }
! else {
! for (lenght = COLWIDTH - lenght; lenght > 0 ; lenght--)
! fprintf(stdout," ");
}
}
+ pfname(ptr,pathflag)
+ char *ptr;
+ int pathflag;
+ {
+ int m;
+ if (pathflag) {
+ fprintf(stdout,"%s",ptr);
+ } else {
+ /* dirname entry is null terminated if length < 14 */
+ m = 0;
+ while (*ptr && m < DIRNAMELEN) {
+ putc(*ptr++, stdout);
+ ++m;
+ }
+ }
+ }
+
owngrp(fp)
***************
*** 402,408 ****
}
buf = getuidgid(xid);
if (buf != 0)
! fprintf(stdout, "%6s ",buf);
else
fprintf(stdout, "%6d ",xid);
}
--- 433,440 ----
}
buf = getuidgid(xid);
if (buf != 0)
! /* Assuming the number 8 is not a good idea. */
! fprintf(stdout, "%-8.8s ",buf);
else
fprintf(stdout, "%6d ",xid);
}