Copyright (C) 1999-2000 Steinar H. Gunderson
This program is is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License, version 2 if the
+ it under the terms of the GNU General Public License, version 2 of the
License as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
#include <config.h>
#endif
-#if HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-
#if HAVE_STROPTS_H
#include <stropts.h>
#endif
#include <fcntl.h>
#endif
-#if HAVE_PWD_H
-#include <pwd.h>
-#endif
-
#if HAVE_GRP_H
#include <grp.h>
#endif
#include <sys/ioctl.h>
#endif
-#if HAVE_SYS_SOCKET_H
-#include <sys/socket.h>
-#endif
-
#if HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#include <sys/conf.h>
#endif
-#if HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-
#if HAVE_SHADOW_H
#include <shadow.h>
#endif
#if WANT_DCACHE
{
- struct dcache *d = NULL, *next = first_dcache->next_dcache;
- struct stat buf;
-
- if (stat(cwd, &buf) > -1) {
- /* run through the linked list */
- while (next != NULL) {
- d = next;
- next = d->next_dcache;
-
- if (buf.st_mtime <= d->generated &&
- strcmp(d->dir_name, cwd) == 0 &&
- strcmp(d->pattern, ptr) == 0 &&
- memcmp(&(d->lo), lo,
- sizeof(struct list_options)) == 0) {
- d->use_count++;
- f->dir_cache = d;
- f->file_data = d->dir_data;
- f->size = d->dir_size;
- f->dir_listing = 1;
- f->pos = 0;
- prepare_for_transfer(f);
- return;
- }
- }
+ struct dcache *d = find_dcache(cwd, ptr, lo);
+ if (d != NULL) {
+ d->use_count++;
+ f->dir_cache = d;
+ f->file_data = d->dir_data;
+ f->size = d->dir_size;
+ f->dir_listing = 1;
+ f->pos = 0;
+
+ prepare_for_transfer(f);
+ return;
}
}
#endif
}
/* if no argument, choose all files */
- if (fptr == NULL || fptr[0] == 0) fptr = "*";
+ if (fptr == NULL || fptr[0] == 0) {
+ fptr = "*";
+ } else {
+ /* we need to check if the last part is a directory (no -d switch) */
+ struct stat buf;
+ if (stat(fptr, &buf) == 0 && S_ISDIR(buf.st_mode)) {
+ TRAP_ERROR(chdir(fptr) == -1, 550, return -1);
+ fptr = "*";
+ }
+ }
*ptr = fptr;
#if WANT_NONROOT