Add special handling of nonexistant files with extensions
{,.tar}{,.gz,Z}. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@770 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -344,9 +344,9 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
/* (void) freopen(_PATH_DEVNULL, "w", stderr); */
|
/* (void) freopen(_PATH_DEVNULL, "w", stderr); */
|
||||||
(void) signal(SIGPIPE, lostconn);
|
signal(SIGPIPE, lostconn);
|
||||||
(void) signal(SIGCHLD, SIG_IGN);
|
signal(SIGCHLD, SIG_IGN);
|
||||||
if ((long)signal(SIGURG, myoob) < 0)
|
if ((int)signal(SIGURG, myoob) < 0)
|
||||||
syslog(LOG_ERR, "signal: %m");
|
syslog(LOG_ERR, "signal: %m");
|
||||||
|
|
||||||
auth_init();
|
auth_init();
|
||||||
@@ -773,18 +773,54 @@ set_buffer_size(int fd, int read)
|
|||||||
void
|
void
|
||||||
retrieve(char *cmd, char *name)
|
retrieve(char *cmd, char *name)
|
||||||
{
|
{
|
||||||
FILE *fin, *dout;
|
FILE *fin = NULL, *dout;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int (*closefunc) (FILE *);
|
int (*closefunc) (FILE *);
|
||||||
|
|
||||||
if (cmd == 0) {
|
|
||||||
fin = fopen(name, "r"), closefunc = fclose;
|
|
||||||
st.st_size = 0;
|
|
||||||
} else {
|
|
||||||
char line[BUFSIZ];
|
char line[BUFSIZ];
|
||||||
|
|
||||||
(void) sprintf(line, cmd, name), name = line;
|
|
||||||
fin = ftpd_popen(line, "r"), closefunc = ftpd_pclose;
|
if (cmd == 0) {
|
||||||
|
fin = fopen(name, "r");
|
||||||
|
closefunc = fclose;
|
||||||
|
st.st_size = 0;
|
||||||
|
if(fin == NULL){
|
||||||
|
struct cmds {
|
||||||
|
char *ext;
|
||||||
|
char *cmd;
|
||||||
|
} cmds[] = {
|
||||||
|
/* XXX -- fix below if %s is not last element */
|
||||||
|
".tar", "/bin/gtar cPf - %s",
|
||||||
|
".tar.gz", "/bin/gtar zcPf - %s",
|
||||||
|
".tar.Z", "/bin/gtar ZcPf - %s",
|
||||||
|
".gz", "/bin/gzip -c %s",
|
||||||
|
".Z", "/bin/compress -c %s",
|
||||||
|
NULL, NULL
|
||||||
|
};
|
||||||
|
struct cmds *p;
|
||||||
|
for(p = cmds; p->ext; p++){
|
||||||
|
char *tail = name + strlen(name) - strlen(p->ext);
|
||||||
|
|
||||||
|
if(strcmp(tail, p->ext) == 0){
|
||||||
|
sprintf(line, p->cmd, name);
|
||||||
|
/* XXX */
|
||||||
|
line[tail - name] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(p->ext){
|
||||||
|
fin = ftpd_popen(line, "r", 0);
|
||||||
|
closefunc = ftpd_pclose;
|
||||||
|
st.st_size = -1;
|
||||||
|
#ifdef HAVE_ST_BLKSIZE
|
||||||
|
st.st_blksize = BUFSIZ;
|
||||||
|
cmd = line;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sprintf(line, cmd, name), name = line;
|
||||||
|
fin = ftpd_popen(line, "r", 1);
|
||||||
|
closefunc = ftpd_pclose;
|
||||||
st.st_size = -1;
|
st.st_size = -1;
|
||||||
#ifdef HAVE_ST_BLKSIZE
|
#ifdef HAVE_ST_BLKSIZE
|
||||||
st.st_blksize = BUFSIZ;
|
st.st_blksize = BUFSIZ;
|
||||||
@@ -1260,7 +1296,7 @@ statfilecmd(char *filename)
|
|||||||
char line[LINE_MAX];
|
char line[LINE_MAX];
|
||||||
|
|
||||||
sprintf(line, "/bin/ls -lA %s", filename);
|
sprintf(line, "/bin/ls -lA %s", filename);
|
||||||
fin = ftpd_popen(line, "r");
|
fin = ftpd_popen(line, "r", 1);
|
||||||
lreply(211, "status of %s:", filename);
|
lreply(211, "status of %s:", filename);
|
||||||
while ((c = getc(fin)) != EOF) {
|
while ((c = getc(fin)) != EOF) {
|
||||||
if (c == '\n') {
|
if (c == '\n') {
|
||||||
|
Reference in New Issue
Block a user