ReactOS 0.4.16-dev-91-g764881a
ls.c File Reference
#include "syshdrs.h"
#include "util.h"
#include "ls.h"
#include "trace.h"
Include dependency graph for ls.c:

Go to the source code of this file.

Functions

void InitLsCache (void)
 
void InitLsMonths (void)
 
void InitLs (void)
 
static void FlushLsCacheItem (int i)
 
void FlushLsCache (void)
 
int LsCacheLookup (const char *const itempath)
 
static void LsCacheAdd (const char *const itempath, FileInfoListPtr files)
 
static void LsC (FileInfoListPtr dirp, int endChars, FILE *stream)
 
void LsDate (char *dstr, time_t ts)
 
void LsL (FileInfoListPtr dirp, int endChars, int linkedTo, FILE *stream)
 
void Ls1 (FileInfoListPtr dirp, int endChars, FILE *stream)
 
void Ls (const char *const item, int listmode, const char *const options, FILE *stream)
 

Variables

time_t gNowMinus6Mon
 
time_t gNowPlus1Hr
 
char gLsMon [13][4]
 
LsCacheItem gLsCache [kLsCacheSize]
 
int gOldestLsCacheItem
 
int gLsCacheItemLifetime = kLsCacheItemLifetime
 
FTPConnectionInfo gConn
 
char gRemoteCWD [512]
 
int gScreenColumns
 
int gDebug
 

Function Documentation

◆ FlushLsCache()

void FlushLsCache ( void  )

Definition at line 94 of file ls.c.

95{
96 int i;
97
98 for (i=0; i<kLsCacheSize; i++) {
99 if (gLsCache[i].expiration != (time_t) 0) {
101 }
102 }
103} /* FlushLsCache */
__kernel_time_t time_t
Definition: linux.h:252
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static void FlushLsCacheItem(int i)
Definition: ls.c:79
LsCacheItem gLsCache[kLsCacheSize]
Definition: ls.c:26
#define kLsCacheSize
Definition: ls.h:17

Referenced by ChmodCmd(), DeleteCmd(), GetCmd(), MkdirCmd(), OpenCmd(), PutCmd(), RenameCmd(), RmdirCmd(), and SymlinkCmd().

◆ FlushLsCacheItem()

static void FlushLsCacheItem ( int  i)
static

Definition at line 79 of file ls.c.

80{
81 Trace(1, "flush ls cache item: %s\n", gLsCache[i].itempath);
82 if (gLsCache[i].itempath != NULL)
83 free(gLsCache[i].itempath);
87} /* FlushLsCacheItem */
#define free
Definition: debug_ros.c:5
#define NULL
Definition: types.h:112
#define Trace(x)
Definition: inflate.c:42
void DisposeFileInfoListContents(FileInfoListPtr list)
Definition: linelist.c:152
char * itempath
Definition: ls.h:11
time_t expiration
Definition: ls.h:13

Referenced by FlushLsCache(), LsCacheAdd(), and LsCacheLookup().

◆ InitLs()

void InitLs ( void  )

Definition at line 68 of file ls.c.

69{
72} /* InitLs */
void InitLsMonths(void)
Definition: ls.c:47
void InitLsCache(void)
Definition: ls.c:36

Referenced by PreInit().

◆ InitLsCache()

void InitLsCache ( void  )

Definition at line 36 of file ls.c.

37{
38 (void) memset(gLsCache, 0, sizeof(gLsCache));
40} /* InitLsCache */
int gOldestLsCacheItem
Definition: ls.c:27
#define memset(x, y, z)
Definition: compat.h:39

Referenced by InitLs().

◆ InitLsMonths()

void InitLsMonths ( void  )

Definition at line 47 of file ls.c.

48{
49 time_t now;
50 struct tm *ltp;
51 int i;
52
53 (void) time(&now);
54 ltp = localtime(&now); /* Fill up the structure. */
55 ltp->tm_mday = 15;
56 ltp->tm_hour = 12;
57 for (i=0; i<12; i++) {
58 ltp->tm_mon = i;
59 (void) strftime(gLsMon[i], sizeof(gLsMon[i]), "%b", ltp);
60 gLsMon[i][sizeof(gLsMon[i]) - 1] = '\0';
61 }
62 (void) strcpy(gLsMon[i], "BUG");
63} /* InitLsMonths */
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
time_t now
Definition: finger.c:65
char gLsMon[13][4]
Definition: ls.c:21
__u16 time
Definition: mkdosfs.c:8
_CRTIMP struct tm *__cdecl localtime(const time_t *_Time)
Definition: time.h:416
size_t CDECL strftime(char *str, size_t max, const char *format, const struct tm *mstm)
Definition: strftime.c:294
Definition: time.h:68
int tm_mon
Definition: time.h:73
int tm_hour
Definition: time.h:71
int tm_mday
Definition: time.h:72

Referenced by InitLs().

◆ Ls()

void Ls ( const char *const  item,
int  listmode,
const char *const  options,
FILE stream 
)

Definition at line 465 of file ls.c.

466{
467 char itempath[512];
468 FileInfoList fil;
469 FileInfoListPtr filp;
470 LinePtr linePtr, nextLinePtr;
471 LineList dirContents;
472 int parsed;
473 int linkedTo;
474 int endChars;
475 int rlisted;
476 int opt;
477 const char *cp;
478 int sortBy;
479 int sortOrder;
480 int unknownOpts;
481 char optstr[32];
482 char unoptstr[32];
483 int doNotUseCache;
484 int wasInCache;
485 int mlsd;
486 int ci;
487
488 InitLineList(&dirContents);
489 InitFileInfoList(&fil);
490
491 sortBy = 'n'; /* Sort by filename. */
492 sortOrder = 'a'; /* Sort in ascending order. */
493 linkedTo = 0;
494 endChars = (listmode == 'C') ? 1 : 0;
495 unknownOpts = 0;
496 memset(unoptstr, 0, sizeof(unoptstr));
497 unoptstr[0] = '-';
498 doNotUseCache = 0;
499 rlisted = 0;
500
501 for (cp = options; *cp != '\0'; cp++) {
502 opt = *cp;
503 switch (opt) {
504 case 't':
505 sortBy = 't'; /* Sort by modification time. */
506 break;
507 case 'S':
508 sortBy = 's'; /* Sort by size. */
509 break;
510 case 'r':
511 sortOrder = 'd'; /* descending order */
512 break;
513 case 'L':
514 linkedTo = 1;
515 break;
516 case 'f':
517 doNotUseCache = 1;
518 break;
519 case 'F':
520 case 'p':
521 endChars = 1;
522 break;
523 case '1':
524 case 'C':
525 case 'l':
526 listmode = opt;
527 break;
528 case '-':
529 break;
530 default:
531 if (unknownOpts < ((int) sizeof(unoptstr) - 2))
532 unoptstr[unknownOpts + 1] = opt;
533 unknownOpts++;
534 break;
535 }
536 }
537
538 /* Create a possibly relative path into an absolute path. */
539 PathCat(itempath, sizeof(itempath), gRemoteCWD,
540 (item == NULL) ? "." : item);
541
542 if (unknownOpts > 0) {
543 /* Can't handle these -- pass them through
544 * to the server.
545 */
546
547 Trace(0, "ls caching not used because of ls flags: %s\n", unoptstr);
548 optstr[0] = '-';
549 optstr[1] = listmode;
550 optstr[2] = '\0';
551 (void) STRNCAT(optstr, options);
552 if ((FTPListToMemory2(&gConn, (item == NULL) ? "" : item, &dirContents, optstr, 1, 0)) < 0) {
553 if (stream != NULL)
554 (void) fprintf(stderr, "List failed.\n");
555 return;
556 }
557
558 rlisted = 1;
559 parsed = -1;
560 wasInCache = 0;
561 filp = NULL;
562 } else if ((doNotUseCache != 0) || ((ci = LsCacheLookup(itempath)) < 0)) {
563 /* Not in cache. */
564 wasInCache = 0;
565
566 mlsd = 1;
567 if ((FTPListToMemory2(&gConn, (item == NULL) ? "" : item, &dirContents, "-l", 1, &mlsd)) < 0) {
568 if (stream != NULL)
569 (void) fprintf(stderr, "List failed.\n");
570 return;
571 }
572
573 rlisted = 1;
574 filp = &fil;
575 if (mlsd != 0) {
576 parsed = UnMlsD(filp, &dirContents);
577 if (parsed < 0) {
578 Trace(0, "UnMlsD: %d\n", parsed);
579 }
580 } else {
581 parsed = UnLslR(filp, &dirContents, gConn.serverType);
582 if (parsed < 0) {
583 Trace(0, "UnLslR: %d\n", parsed);
584 }
585 }
586 if (parsed >= 0) {
588 if (filp->vec == NULL) {
589 if (stream != NULL)
590 (void) fprintf(stderr, "List processing failed.\n");
591 return;
592 }
593 }
594 } else {
595 filp = &gLsCache[ci].fil;
596 wasInCache = 1;
597 parsed = 1;
598 Trace(0, "ls cache hit: %s\n", itempath);
599 }
600
601 if (rlisted != 0) {
602 Trace(0, "Remote listing contents {\n");
603 for (linePtr = dirContents.first;
604 linePtr != NULL;
605 linePtr = nextLinePtr)
606 {
607 nextLinePtr = linePtr->next;
608 Trace(0, " %s\n", linePtr->line);
609 }
610 Trace(0, "}\n");
611 }
612
613 if (parsed >= 0) {
614 SortFileInfoList(filp, sortBy, sortOrder);
615 if (stream != NULL) {
616 if (listmode == 'l')
617 LsL(filp, endChars, linkedTo, stream);
618 else if (listmode == '1')
619 Ls1(filp, endChars, stream);
620 else
621 LsC(filp, endChars, stream);
622 }
623 if (wasInCache == 0) {
624 LsCacheAdd(itempath, filp);
625 }
626 } else if (stream != NULL) {
627 for (linePtr = dirContents.first;
628 linePtr != NULL;
629 linePtr = nextLinePtr)
630 {
631 nextLinePtr = linePtr->next;
632 (void) fprintf(stream, "%s\n", linePtr->line);
633 Trace(0, " %s\n", linePtr->line);
634 }
635 }
636
637 DisposeLineListContents(&dirContents);
638} /* Ls */
#define STRNCAT(d, s)
Definition: Strn.h:48
int UnMlsD(FileInfoListPtr filp, LineListPtr llp)
Definition: glob.c:827
int UnLslR(FileInfoListPtr filp, LineListPtr llp, int serverType)
Definition: glob.c:561
#define stderr
Definition: stdio.h:100
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
void InitLineList(LineListPtr list)
Definition: linelist.c:54
void InitFileInfoList(FileInfoListPtr list)
Definition: linelist.c:193
void VectorizeFileInfoList(FileInfoListPtr list)
Definition: linelist.c:423
void DisposeLineListContents(LineListPtr list)
Definition: linelist.c:33
void SortFileInfoList(FileInfoListPtr list, int sortKey, int sortOrder)
Definition: linelist.c:353
FTPConnectionInfo gConn
Definition: main.c:37
char gRemoteCWD[512]
Definition: cmds.c:33
void LsL(FileInfoListPtr dirp, int endChars, int linkedTo, FILE *stream)
Definition: ls.c:284
void Ls1(FileInfoListPtr dirp, int endChars, FILE *stream)
Definition: ls.c:419
static void LsC(FileInfoListPtr dirp, int endChars, FILE *stream)
Definition: ls.c:182
int LsCacheLookup(const char *const itempath)
Definition: ls.c:110
static void LsCacheAdd(const char *const itempath, FileInfoListPtr files)
Definition: ls.c:139
POINT cp
Definition: magnifier.c:59
int FTPListToMemory2(const FTPCIPtr cip, const char *const pattern, const LineListPtr llines, const char *const lsflags, const int blankLines, int *const tryMLSD)
Definition: io.c:366
void PathCat(char *const dst, const size_t dsize, const char *const cwd, const char *const src)
Definition: util.c:368
static ATOM item
Definition: dde.c:856
FileInfoVec vec
Definition: ncftp.h:266
Definition: ncftp.h:84
Definition: ncftp.h:79
char * line
Definition: ncftp.h:81
LinePtr next
Definition: ncftp.h:80
FileInfoList fil
Definition: ls.h:12
Definition: parse.h:23

Referenced by capGetDriverDescriptionW(), GetLsCacheFileList(), and ListCmd().

◆ Ls1()

void Ls1 ( FileInfoListPtr  dirp,
int  endChars,
FILE stream 
)

Definition at line 419 of file ls.c.

420{
421 char fTail[2];
422 int i;
423 int fType;
424 FileInfoVec diritemv;
425 FileInfoPtr diritemp;
426
427 fTail[0] = '\0';
428 fTail[1] = '\0';
429 diritemv = dirp->vec;
430
431 for (i=0; ; i++) {
432 diritemp = diritemv[i];
433 if (diritemp == NULL)
434 break;
435
436 fType = (int) diritemp->type;
437 if (endChars != 0) {
438 if (fType == 'd')
439 fTail[0] = '/';
440 else
441 fTail[0] = '\0';
442 }
443
444 (void) fprintf(stream, "%s%s\n",
445 diritemp->relname,
446 fTail
447 );
448
449 Trace(0, "%s%s\n",
450 diritemp->relname,
451 fTail
452 );
453 }
454} /* Ls1 */
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
if(dx< 0)
Definition: linetemp.h:194
int type
Definition: ncftp.h:258
char * relname
Definition: ncftp.h:253

Referenced by Ls().

◆ LsC()

static void LsC ( FileInfoListPtr  dirp,
int  endChars,
FILE stream 
)
static

Definition at line 182 of file ls.c.

183{
184 char buf[400];
185 char buf2[400];
186 int ncol, nrow;
187 int i, j, k, l;
188 int colw;
189 int n;
190 FileInfoVec itemv;
191 FileInfoPtr itemp;
192 char *cp1, *cp2, *lim;
193 int screenColumns;
194
195 screenColumns = gScreenColumns;
196 if (screenColumns > 400)
197 screenColumns = 400;
198 ncol = (screenColumns - 1) / ((int) dirp->maxFileLen + 2 + /*1or0*/ endChars);
199 if (ncol < 1)
200 ncol = 1;
201 colw = (screenColumns - 1) / ncol;
202 n = dirp->nFileInfos;
203 nrow = n / ncol;
204 if ((n % ncol) != 0)
205 nrow++;
206
207 for (i=0; i<(int) sizeof(buf2); i++)
208 buf2[i] = ' ';
209
210 itemv = dirp->vec;
211
212 for (j=0; j<nrow; j++) {
213 (void) memcpy(buf, buf2, sizeof(buf));
214 for (i=0, k=j, l=0; i<ncol; i++, k += nrow, l += colw) {
215 if (k >= n)
216 continue;
217 itemp = itemv[k];
218 cp1 = buf + l;
219 lim = cp1 + (int) (itemp->relnameLen);
220 cp2 = itemp->relname;
221 while (cp1 < lim)
222 *cp1++ = *cp2++;
223 if (endChars != 0) {
224 if (itemp->type == 'l') {
225 /* Regular ls always uses @
226 * for a symlink tail, even if
227 * the linked item is a directory.
228 */
229 *cp1++ = '@';
230 } else if (itemp->type == 'd') {
231 *cp1++ = '/';
232 }
233 }
234 }
235 for (cp1 = buf + sizeof(buf); *--cp1 == ' '; ) {}
236 ++cp1;
237 *cp1++ = '\n';
238 *cp1 = '\0';
239 (void) fprintf(stream, "%s", buf);
240 Trace(0, "%s", buf);
241 }
242} /* LsC */
r l[0]
Definition: byte_order.h:168
GLdouble n
Definition: glext.h:7729
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
int gScreenColumns
Definition: cmds.c:78
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
int k
Definition: mpi.c:3369
int nFileInfos
Definition: ncftp.h:269
size_t maxFileLen
Definition: ncftp.h:267
size_t relnameLen
Definition: ncftp.h:261

Referenced by Ls().

◆ LsCacheAdd()

static void LsCacheAdd ( const char *const  itempath,
FileInfoListPtr  files 
)
static

Definition at line 139 of file ls.c.

140{
141 char *cp;
142 int j;
143
144 /* Never cache empty listings in case of errors */
145 if (files->nFileInfos == 0)
146 return;
147
148 j = LsCacheLookup(itempath);
149 if (j >= 0) {
150 /* Directory was already in there;
151 * Replace it with the new
152 * contents.
153 */
155 }
156
157 cp = StrDup(itempath);
158 if (cp == NULL)
159 return;
160
162 (void) memcpy(&gLsCache[j].fil, files, sizeof(FileInfoList));
163 (void) time(&gLsCache[j].expiration);
165 gLsCache[j].hits = 0;
167 Trace(1, "ls cache add: %s\n", itempath);
168
169 /* Increment the pointer. This is a circular array, so if it
170 * hits the end it wraps over to the other side.
171 */
175} /* LsCacheAdd */
int gLsCacheItemLifetime
Definition: ls.c:28
#define StrDup
Definition: shlwapi.h:1533
int hits
Definition: ls.h:14

Referenced by Ls().

◆ LsCacheLookup()

int LsCacheLookup ( const char *const  itempath)

Definition at line 110 of file ls.c.

111{
112 int i, j;
113 time_t now;
114
115 (void) time(&now);
116 for (i=0, j=gOldestLsCacheItem; i<kLsCacheSize; i++) {
117 if (--j < 0)
118 j = kLsCacheSize - 1;
119 if ((gLsCache[j].expiration != (time_t) 0) && (gLsCache[j].itempath != NULL)) {
120 if (strcmp(itempath, gLsCache[j].itempath) == 0) {
121 if (now > gLsCache[j].expiration) {
122 /* Found it, but it was expired. */
124 return (-1);
125 }
126 gLsCache[j].hits++;
127 return (j);
128 }
129 }
130 }
131 return (-1);
132} /* LsCacheLookup */
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469

Referenced by GetLsCacheFileList(), Ls(), and LsCacheAdd().

◆ LsDate()

void LsDate ( char dstr,
time_t  ts 
)

Definition at line 250 of file ls.c.

251{
252 struct tm *gtp;
253
254 if (ts == kModTimeUnknown) {
255 (void) strcpy(dstr, " ");
256 return;
257 }
258 gtp = localtime(&ts);
259 if (gtp == NULL) {
260 (void) strcpy(dstr, "Jan 0 1900");
261 return;
262 }
263 if ((ts > gNowPlus1Hr) || (ts < gNowMinus6Mon)) {
264 (void) sprintf(dstr, "%s %2d %4d",
265 gLsMon[gtp->tm_mon],
266 gtp->tm_mday,
267 gtp->tm_year + 1900
268 );
269 } else {
270 (void) sprintf(dstr, "%s %2d %02d:%02d",
271 gLsMon[gtp->tm_mon],
272 gtp->tm_mday,
273 gtp->tm_hour,
274 gtp->tm_min
275 );
276 }
277} /* LsDate */
time_t gNowMinus6Mon
Definition: ls.c:18
time_t gNowPlus1Hr
Definition: ls.c:18
#define sprintf(buf, format,...)
Definition: sprintf.c:55
#define kModTimeUnknown
Definition: ncftp.h:377
int tm_year
Definition: time.h:74
int tm_min
Definition: time.h:70

Referenced by LsL().

◆ LsL()

void LsL ( FileInfoListPtr  dirp,
int  endChars,
int  linkedTo,
FILE stream 
)

Definition at line 284 of file ls.c.

285{
286 FileInfoPtr diritemp;
287 FileInfoVec diritemv;
288 int i;
289 char fTail[2];
290 int fType;
291 const char *l1, *l2;
292 char datestr[16];
293 char sizestr[32];
294 char plugspec[16];
295 char plugstr[64];
296 const char *expad;
297
298 fTail[0] = '\0';
299 fTail[1] = '\0';
300
302 gNowMinus6Mon = gNowPlus1Hr - 15552000;
303 gNowPlus1Hr += 3600;
304
305 diritemv = dirp->vec;
306#ifdef HAVE_SNPRINTF
307 (void) snprintf(
308 plugspec,
309 sizeof(plugspec) - 1,
310#else
311 (void) sprintf(
312 plugspec,
313#endif
314 "%%-%ds",
315 (int) dirp->maxPlugLen
316 );
317
318 if (dirp->maxPlugLen < 29) {
319 /* We have some extra space to work with,
320 * so we can space out the columns a little.
321 */
322 expad = " ";
323 } else {
324 expad = "";
325 }
326
327 for (i=0; ; i++) {
328 diritemp = diritemv[i];
329 if (diritemp == NULL)
330 break;
331
332 fType = (int) diritemp->type;
333 if (endChars != 0) {
334 if (fType == 'd')
335 fTail[0] = '/';
336 else
337 fTail[0] = '\0';
338 }
339
340 if (diritemp->rlinkto != NULL) {
341 if (linkedTo != 0) {
342 l1 = "";
343 l2 = "";
344 } else {
345 l1 = " -> ";
346 l2 = diritemp->rlinkto;
347 }
348 } else {
349 l1 = "";
350 l2 = "";
351 }
352
353 LsDate(datestr, diritemp->mdtm);
354
355 if (diritemp->size == kSizeUnknown) {
356 *sizestr = '\0';
357 } else {
358#ifdef HAVE_SNPRINTF
359 (void) snprintf(
360 sizestr,
361 sizeof(sizestr) - 1,
362#else
363 (void) sprintf(
364 sizestr,
365#endif
366#if defined(HAVE_LONG_LONG) && defined(PRINTF_LONG_LONG)
368#else
369 "%ld",
370#endif
371 (longest_int) diritemp->size
372 );
373 }
374
375#ifdef HAVE_SNPRINTF
376 (void) snprintf(
377 plugstr,
378 sizeof(plugstr) - 1,
379#else
380 (void) sprintf(
381 plugstr,
382#endif
383 plugspec,
384 diritemp->plug
385 );
386
387 (void) fprintf(stream, "%s %12s %s%s %s%s%s%s%s\n",
388 plugstr,
389 sizestr,
390 expad,
391 datestr,
392 expad,
393 diritemp->relname,
394 l1,
395 l2,
396 fTail
397 );
398 Trace(0, "%s %12s %s%s %s%s%s%s%s\n",
399 plugstr,
400 sizestr,
401 expad,
402 datestr,
403 expad,
404 diritemp->relname,
405 l1,
406 l2,
407 fTail
408 );
409 }
410} /* LsL */
#define PRINTF_LONG_LONG
Definition: wincfg.h:31
#define HAVE_LONG_LONG
Definition: wincfg.h:29
void LsDate(char *dstr, time_t ts)
Definition: ls.c:250
#define kSizeUnknown
Definition: ncftp.h:376
#define longest_int
Definition: ncftp.h:68
size_t maxPlugLen
Definition: ncftp.h:268
longest_int size
Definition: ncftp.h:260
char * rlinkto
Definition: ncftp.h:255
time_t mdtm
Definition: ncftp.h:259
char * plug
Definition: ncftp.h:257
#define snprintf
Definition: wintirpc.h:48

Referenced by Ls().

Variable Documentation

◆ gConn

FTPConnectionInfo gConn
extern

Definition at line 37 of file main.c.

Referenced by Ls().

◆ gDebug

int gDebug

Definition at line 32 of file ls.c.

◆ gLsCache

◆ gLsCacheItemLifetime

int gLsCacheItemLifetime = kLsCacheItemLifetime

Definition at line 28 of file ls.c.

Referenced by LsCacheAdd().

◆ gLsMon

char gLsMon[13][4]

Definition at line 21 of file ls.c.

Referenced by InitLsMonths(), and LsDate().

◆ gNowMinus6Mon

time_t gNowMinus6Mon

Definition at line 18 of file ls.c.

Referenced by LsDate(), and LsL().

◆ gNowPlus1Hr

time_t gNowPlus1Hr

Definition at line 18 of file ls.c.

Referenced by LsDate(), and LsL().

◆ gOldestLsCacheItem

int gOldestLsCacheItem

Definition at line 27 of file ls.c.

Referenced by InitLsCache(), LsCacheAdd(), and LsCacheLookup().

◆ gRemoteCWD

char gRemoteCWD[512]
extern

Definition at line 33 of file cmds.c.

Referenced by Ls().

◆ gScreenColumns

int gScreenColumns
extern

Definition at line 78 of file cmds.c.

Referenced by LsC().