X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fftp-ls.c;h=062d57e36f71f89ab21f5635333adedc615c5bee;hp=748bd788a9df591e3388ef49d77bfca09aada6bf;hb=7d2066b2213bd8ee5705dfdf6ed4297e91d694d7;hpb=2fe72be505d2d91fc0bbbd22cc19f3d288813671 diff --git a/src/ftp-ls.c b/src/ftp-ls.c index 748bd788..062d57e3 100644 --- a/src/ftp-ls.c +++ b/src/ftp-ls.c @@ -41,8 +41,8 @@ so, delete this exception statement from your version. */ #include "utils.h" #include "ftp.h" #include "url.h" -#include "convert.h" /* for html_quote_string prototype */ -#include "retr.h" /* for output_stream */ +#include "convert.h" /* for html_quote_string prototype */ +#include "retr.h" /* for output_stream */ /* Converts symbolic permissions to number-style ones, e.g. string rwxr-xr-x to 755. For now, it knows nothing of @@ -58,7 +58,7 @@ symperms (const char *s) { perms <<= 3; perms += (((s[0] == 'r') << 2) + ((s[1] == 'w') << 1) + - (s[2] == 'x' || s[2] == 's')); + (s[2] == 'x' || s[2] == 's')); } return perms; } @@ -98,12 +98,12 @@ ftp_parse_unix_ls (const char *file, int ignore_perms) "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; int next, len, i, error, ignore; - int year, month, day; /* for time analysis */ + int year, month, day; /* for time analysis */ int hour, min, sec; struct tm timestruct, *tnow; time_t timenow; - char *line, *tok, *ptok; /* tokenizer */ + char *line, *tok, *ptok; /* tokenizer */ struct fileinfo *dir, *l, cur; /* list creation */ fp = fopen (file, "rb"); @@ -120,270 +120,270 @@ ftp_parse_unix_ls (const char *file, int ignore_perms) len = clean_line (line); /* Skip if total... */ if (!strncasecmp (line, "total", 5)) - { - xfree (line); - continue; - } + { + xfree (line); + continue; + } /* Get the first token (permissions). */ tok = strtok (line, " "); if (!tok) - { - xfree (line); - continue; - } + { + xfree (line); + continue; + } cur.name = NULL; cur.linkto = NULL; /* Decide whether we deal with a file or a directory. */ switch (*tok) - { - case '-': - cur.type = FT_PLAINFILE; - DEBUGP (("PLAINFILE; ")); - break; - case 'd': - cur.type = FT_DIRECTORY; - DEBUGP (("DIRECTORY; ")); - break; - case 'l': - cur.type = FT_SYMLINK; - DEBUGP (("SYMLINK; ")); - break; - default: - cur.type = FT_UNKNOWN; - DEBUGP (("UNKNOWN; ")); - break; - } + { + case '-': + cur.type = FT_PLAINFILE; + DEBUGP (("PLAINFILE; ")); + break; + case 'd': + cur.type = FT_DIRECTORY; + DEBUGP (("DIRECTORY; ")); + break; + case 'l': + cur.type = FT_SYMLINK; + DEBUGP (("SYMLINK; ")); + break; + default: + cur.type = FT_UNKNOWN; + DEBUGP (("UNKNOWN; ")); + break; + } if (ignore_perms) - { - switch (cur.type) - { - case FT_PLAINFILE: - cur.perms = 0644; - break; - case FT_DIRECTORY: - cur.perms = 0755; - break; - default: - /*cur.perms = 1023;*/ /* #### What is this? --hniksic */ - cur.perms = 0644; - } - DEBUGP (("implicit perms %0o; ", cur.perms)); - } + { + switch (cur.type) + { + case FT_PLAINFILE: + cur.perms = 0644; + break; + case FT_DIRECTORY: + cur.perms = 0755; + break; + default: + /*cur.perms = 1023;*/ /* #### What is this? --hniksic */ + cur.perms = 0644; + } + DEBUGP (("implicit perms %0o; ", cur.perms)); + } else { - cur.perms = symperms (tok + 1); - DEBUGP (("perms %0o; ", cur.perms)); - } + cur.perms = symperms (tok + 1); + DEBUGP (("perms %0o; ", cur.perms)); + } error = ignore = 0; /* Erroneous and ignoring entries are - treated equally for now. */ + treated equally for now. */ year = hour = min = sec = 0; /* Silence the compiler. */ month = day = 0; next = -1; /* While there are tokens on the line, parse them. Next is the - number of tokens left until the filename. + number of tokens left until the filename. - Use the month-name token as the "anchor" (the place where the - position wrt the file name is "known"). When a month name is - encountered, `next' is set to 5. Also, the preceding - characters are parsed to get the file size. + Use the month-name token as the "anchor" (the place where the + position wrt the file name is "known"). When a month name is + encountered, `next' is set to 5. Also, the preceding + characters are parsed to get the file size. - This tactic is quite dubious when it comes to - internationalization issues (non-English month names), but it - works for now. */ + This tactic is quite dubious when it comes to + internationalization issues (non-English month names), but it + works for now. */ tok = line; while (ptok = tok, - (tok = strtok (NULL, " ")) != NULL) - { - --next; - if (next < 0) /* a month name was not encountered */ - { - for (i = 0; i < 12; i++) - if (!strcmp (tok, months[i])) - break; - /* If we got a month, it means the token before it is the - size, and the filename is three tokens away. */ - if (i != 12) - { - wgint size; - - /* Parse the previous token with str_to_wgint. */ - if (ptok == line) - { - /* Something has gone wrong during parsing. */ - error = 1; - break; - } - errno = 0; - size = str_to_wgint (ptok, NULL, 10); - if (size == WGINT_MAX && errno == ERANGE) - /* Out of range -- ignore the size. #### Should - we refuse to start the download. */ - cur.size = 0; - else - cur.size = size; - DEBUGP (("size: %s; ", number_to_static_string(cur.size))); - - month = i; - next = 5; - DEBUGP (("month: %s; ", months[month])); - } - } - else if (next == 4) /* days */ - { - if (tok[1]) /* two-digit... */ - day = 10 * (*tok - '0') + tok[1] - '0'; - else /* ...or one-digit */ - day = *tok - '0'; - DEBUGP (("day: %d; ", day)); - } - else if (next == 3) - { - /* This ought to be either the time, or the year. Let's - be flexible! - - If we have a number x, it's a year. If we have x:y, - it's hours and minutes. If we have x:y:z, z are - seconds. */ - year = 0; - min = hour = sec = 0; - /* We must deal with digits. */ - if (ISDIGIT (*tok)) - { - /* Suppose it's year. */ - for (; ISDIGIT (*tok); tok++) - year = (*tok - '0') + 10 * year; - if (*tok == ':') - { - /* This means these were hours! */ - hour = year; - year = 0; - ++tok; - /* Get the minutes... */ - for (; ISDIGIT (*tok); tok++) - min = (*tok - '0') + 10 * min; - if (*tok == ':') - { - /* ...and the seconds. */ - ++tok; - for (; ISDIGIT (*tok); tok++) - sec = (*tok - '0') + 10 * sec; - } - } - } - if (year) - DEBUGP (("year: %d (no tm); ", year)); - else - DEBUGP (("time: %02d:%02d:%02d (no yr); ", hour, min, sec)); - } - else if (next == 2) /* The file name */ - { - int fnlen; - char *p; - - /* Since the file name may contain a SPC, it is possible - for strtok to handle it wrong. */ - fnlen = strlen (tok); - if (fnlen < len - (tok - line)) - { - /* So we have a SPC in the file name. Restore the - original. */ - tok[fnlen] = ' '; - /* If the file is a symbolic link, it should have a - ` -> ' somewhere. */ - if (cur.type == FT_SYMLINK) - { - p = strstr (tok, " -> "); - if (!p) - { - error = 1; - break; - } - cur.linkto = xstrdup (p + 4); - DEBUGP (("link to: %s\n", cur.linkto)); - /* And separate it from the file name. */ - *p = '\0'; - } - } - /* If we have the filename, add it to the list of files or - directories. */ - /* "." and ".." are an exception! */ - if (!strcmp (tok, ".") || !strcmp (tok, "..")) - { - DEBUGP (("\nIgnoring `.' and `..'; ")); - ignore = 1; - break; - } - /* Some FTP sites choose to have ls -F as their default - LIST output, which marks the symlinks with a trailing - `@', directory names with a trailing `/' and - executables with a trailing `*'. This is no problem - unless encountering a symbolic link ending with `@', - or an executable ending with `*' on a server without - default -F output. I believe these cases are very - rare. */ - fnlen = strlen (tok); /* re-calculate `fnlen' */ - cur.name = xmalloc (fnlen + 1); - memcpy (cur.name, tok, fnlen + 1); - if (fnlen) - { - if (cur.type == FT_DIRECTORY && cur.name[fnlen - 1] == '/') - { - cur.name[fnlen - 1] = '\0'; - DEBUGP (("trailing `/' on dir.\n")); - } - else if (cur.type == FT_SYMLINK && cur.name[fnlen - 1] == '@') - { - cur.name[fnlen - 1] = '\0'; - DEBUGP (("trailing `@' on link.\n")); - } - else if (cur.type == FT_PLAINFILE - && (cur.perms & 0111) - && cur.name[fnlen - 1] == '*') - { - cur.name[fnlen - 1] = '\0'; - DEBUGP (("trailing `*' on exec.\n")); - } - } /* if (fnlen) */ - else - error = 1; - break; - } - else - abort (); - } /* while */ + (tok = strtok (NULL, " ")) != NULL) + { + --next; + if (next < 0) /* a month name was not encountered */ + { + for (i = 0; i < 12; i++) + if (!strcmp (tok, months[i])) + break; + /* If we got a month, it means the token before it is the + size, and the filename is three tokens away. */ + if (i != 12) + { + wgint size; + + /* Parse the previous token with str_to_wgint. */ + if (ptok == line) + { + /* Something has gone wrong during parsing. */ + error = 1; + break; + } + errno = 0; + size = str_to_wgint (ptok, NULL, 10); + if (size == WGINT_MAX && errno == ERANGE) + /* Out of range -- ignore the size. #### Should + we refuse to start the download. */ + cur.size = 0; + else + cur.size = size; + DEBUGP (("size: %s; ", number_to_static_string(cur.size))); + + month = i; + next = 5; + DEBUGP (("month: %s; ", months[month])); + } + } + else if (next == 4) /* days */ + { + if (tok[1]) /* two-digit... */ + day = 10 * (*tok - '0') + tok[1] - '0'; + else /* ...or one-digit */ + day = *tok - '0'; + DEBUGP (("day: %d; ", day)); + } + else if (next == 3) + { + /* This ought to be either the time, or the year. Let's + be flexible! + + If we have a number x, it's a year. If we have x:y, + it's hours and minutes. If we have x:y:z, z are + seconds. */ + year = 0; + min = hour = sec = 0; + /* We must deal with digits. */ + if (ISDIGIT (*tok)) + { + /* Suppose it's year. */ + for (; ISDIGIT (*tok); tok++) + year = (*tok - '0') + 10 * year; + if (*tok == ':') + { + /* This means these were hours! */ + hour = year; + year = 0; + ++tok; + /* Get the minutes... */ + for (; ISDIGIT (*tok); tok++) + min = (*tok - '0') + 10 * min; + if (*tok == ':') + { + /* ...and the seconds. */ + ++tok; + for (; ISDIGIT (*tok); tok++) + sec = (*tok - '0') + 10 * sec; + } + } + } + if (year) + DEBUGP (("year: %d (no tm); ", year)); + else + DEBUGP (("time: %02d:%02d:%02d (no yr); ", hour, min, sec)); + } + else if (next == 2) /* The file name */ + { + int fnlen; + char *p; + + /* Since the file name may contain a SPC, it is possible + for strtok to handle it wrong. */ + fnlen = strlen (tok); + if (fnlen < len - (tok - line)) + { + /* So we have a SPC in the file name. Restore the + original. */ + tok[fnlen] = ' '; + /* If the file is a symbolic link, it should have a + ` -> ' somewhere. */ + if (cur.type == FT_SYMLINK) + { + p = strstr (tok, " -> "); + if (!p) + { + error = 1; + break; + } + cur.linkto = xstrdup (p + 4); + DEBUGP (("link to: %s\n", cur.linkto)); + /* And separate it from the file name. */ + *p = '\0'; + } + } + /* If we have the filename, add it to the list of files or + directories. */ + /* "." and ".." are an exception! */ + if (!strcmp (tok, ".") || !strcmp (tok, "..")) + { + DEBUGP (("\nIgnoring `.' and `..'; ")); + ignore = 1; + break; + } + /* Some FTP sites choose to have ls -F as their default + LIST output, which marks the symlinks with a trailing + `@', directory names with a trailing `/' and + executables with a trailing `*'. This is no problem + unless encountering a symbolic link ending with `@', + or an executable ending with `*' on a server without + default -F output. I believe these cases are very + rare. */ + fnlen = strlen (tok); /* re-calculate `fnlen' */ + cur.name = xmalloc (fnlen + 1); + memcpy (cur.name, tok, fnlen + 1); + if (fnlen) + { + if (cur.type == FT_DIRECTORY && cur.name[fnlen - 1] == '/') + { + cur.name[fnlen - 1] = '\0'; + DEBUGP (("trailing `/' on dir.\n")); + } + else if (cur.type == FT_SYMLINK && cur.name[fnlen - 1] == '@') + { + cur.name[fnlen - 1] = '\0'; + DEBUGP (("trailing `@' on link.\n")); + } + else if (cur.type == FT_PLAINFILE + && (cur.perms & 0111) + && cur.name[fnlen - 1] == '*') + { + cur.name[fnlen - 1] = '\0'; + DEBUGP (("trailing `*' on exec.\n")); + } + } /* if (fnlen) */ + else + error = 1; + break; + } + else + abort (); + } /* while */ if (!cur.name || (cur.type == FT_SYMLINK && !cur.linkto)) - error = 1; + error = 1; DEBUGP (("%s\n", cur.name ? cur.name : "")); if (error || ignore) - { - DEBUGP (("Skipping.\n")); - xfree_null (cur.name); - xfree_null (cur.linkto); - xfree (line); - continue; - } + { + DEBUGP (("Skipping.\n")); + xfree_null (cur.name); + xfree_null (cur.linkto); + xfree (line); + continue; + } if (!dir) - { - l = dir = xnew (struct fileinfo); - memcpy (l, &cur, sizeof (cur)); - l->prev = l->next = NULL; - } + { + l = dir = xnew (struct fileinfo); + memcpy (l, &cur, sizeof (cur)); + l->prev = l->next = NULL; + } else - { - cur.prev = l; - l->next = xnew (struct fileinfo); - l = l->next; - memcpy (l, &cur, sizeof (cur)); - l->next = NULL; - } + { + cur.prev = l; + l->next = xnew (struct fileinfo); + l = l->next; + memcpy (l, &cur, sizeof (cur)); + l->next = NULL; + } /* Get the current time. */ timenow = time (NULL); tnow = localtime (&timenow); @@ -394,21 +394,21 @@ ftp_parse_unix_ls (const char *file, int ignore_perms) timestruct.tm_mday = day; timestruct.tm_mon = month; if (year == 0) - { - /* Some listings will not specify the year if it is "obvious" - that the file was from the previous year. E.g. if today - is 97-01-12, and you see a file of Dec 15th, its year is - 1996, not 1997. Thanks to Vladimir Volovich for - mentioning this! */ - if (month > tnow->tm_mon) - timestruct.tm_year = tnow->tm_year - 1; - else - timestruct.tm_year = tnow->tm_year; - } + { + /* Some listings will not specify the year if it is "obvious" + that the file was from the previous year. E.g. if today + is 97-01-12, and you see a file of Dec 15th, its year is + 1996, not 1997. Thanks to Vladimir Volovich for + mentioning this! */ + if (month > tnow->tm_mon) + timestruct.tm_year = tnow->tm_year - 1; + else + timestruct.tm_year = tnow->tm_year; + } else - timestruct.tm_year = year; + timestruct.tm_year = year; if (timestruct.tm_year >= 1900) - timestruct.tm_year -= 1900; + timestruct.tm_year -= 1900; timestruct.tm_wday = 0; timestruct.tm_yday = 0; timestruct.tm_isdst = -1; @@ -458,7 +458,7 @@ ftp_parse_winnt_ls (const char *file) DEBUGP(("Name: '%s'\n", cur.name)); /* First column: mm-dd-yy. Should atoi() on the month fail, january - will be assumed. */ + will be assumed. */ tok = strtok(line, "-"); if (tok == NULL) continue; month = atoi(tok) - 1; @@ -512,43 +512,43 @@ ftp_parse_winnt_ls (const char *file) while ((tok != NULL) && (*tok == '\0')) tok = strtok(NULL, " "); if (tok == NULL) continue; if (*tok == '<') - { - cur.type = FT_DIRECTORY; - cur.size = 0; - cur.perms = 0755; - DEBUGP(("Directory\n")); - } + { + cur.type = FT_DIRECTORY; + cur.size = 0; + cur.perms = 0755; + DEBUGP(("Directory\n")); + } else - { - wgint size; - cur.type = FT_PLAINFILE; - errno = 0; - size = str_to_wgint (tok, NULL, 10); - if (size == WGINT_MAX && errno == ERANGE) - cur.size = 0; /* overflow */ - else - cur.size = size; - cur.perms = 0644; - DEBUGP(("File, size %s bytes\n", number_to_static_string (cur.size))); - } + { + wgint size; + cur.type = FT_PLAINFILE; + errno = 0; + size = str_to_wgint (tok, NULL, 10); + if (size == WGINT_MAX && errno == ERANGE) + cur.size = 0; /* overflow */ + else + cur.size = size; + cur.perms = 0644; + DEBUGP(("File, size %s bytes\n", number_to_static_string (cur.size))); + } cur.linkto = NULL; /* And put everything into the linked list */ if (!dir) - { - l = dir = xnew (struct fileinfo); - memcpy (l, &cur, sizeof (cur)); - l->prev = l->next = NULL; - } + { + l = dir = xnew (struct fileinfo); + memcpy (l, &cur, sizeof (cur)); + l->prev = l->next = NULL; + } else - { - cur.prev = l; - l->next = xnew (struct fileinfo); - l = l->next; - memcpy (l, &cur, sizeof (cur)); - l->next = NULL; - } + { + cur.prev = l; + l->next = xnew (struct fileinfo); + l = l->next; + memcpy (l, &cur, sizeof (cur)); + l->next = NULL; + } xfree (line); } @@ -595,7 +595,7 @@ ftp_parse_vms_ls (const char *file) int hour, min, sec; struct tm timestruct; - char *line, *tok; /* tokenizer */ + char *line, *tok; /* tokenizer */ struct fileinfo *dir, *l, cur; /* list creation */ fp = fopen (file, "rb"); @@ -624,10 +624,10 @@ ftp_parse_vms_ls (const char *file) char *p; i = clean_line (line); if (!i) - { - xfree (line); - break; - } + { + xfree (line); + break; + } /* First column: Name. A bit of black magic again. The name my be either ABCD.EXT or ABCD.EXT;NUM and it might be on a separate @@ -641,7 +641,7 @@ ftp_parse_vms_ls (const char *file) if (tok == NULL) tok = line; DEBUGP(("file name: '%s'\n", tok)); for (p = tok ; *p && *p != ';' ; p++) - ; + ; if (*p == ';') *p = '\0'; p = tok + strlen(tok) - 4; if (!strcmp(p, ".DIR")) *p = '\0'; @@ -685,7 +685,7 @@ ftp_parse_vms_ls (const char *file) if (!i) { DEBUGP(("confusing VMS listing item, leaving listing parser\n")); - xfree (line); + xfree (line); break; } tok = strtok(line, " "); @@ -706,7 +706,7 @@ ftp_parse_vms_ls (const char *file) the first strtok(NULL, "-") will return everything until the end of the line and only the next strtok() call will return NULL. */ DEBUGP(("nonsense in VMS listing, skipping this line\n")); - xfree (line); + xfree (line); break; } for (i=0; i<12; i++) if (!strcmp(tok,months[i])) break; @@ -724,13 +724,13 @@ ftp_parse_vms_ls (const char *file) p = tok; hour = atoi (p); for (; *p && *p != ':'; ++p) - ; + ; if (*p) - min = atoi (++p); + min = atoi (++p); for (; *p && *p != ':'; ++p) - ; + ; if (*p) - sec = atoi (++p); + sec = atoi (++p); DEBUGP(("YYYY/MM/DD HH:MM:SS - %d/%02d/%02d %02d:%02d:%02d\n", year+1900, month, day, hour, min, sec)); @@ -762,7 +762,7 @@ ftp_parse_vms_ls (const char *file) if (tok == NULL) { DEBUGP(("confusing VMS permissions, skipping line\n")); - xfree (line); + xfree (line); continue; } /* Permissons have the format "RWED,RWED,RE" */ @@ -810,21 +810,21 @@ ftp_parse_ls (const char *file, const enum stype system_type) return ftp_parse_unix_ls (file, 0); case ST_WINNT: { - /* Detect whether the listing is simulating the UNIX format */ - FILE *fp; - int c; - fp = fopen (file, "rb"); - if (!fp) - { - logprintf (LOG_NOTQUIET, "%s: %s\n", file, strerror (errno)); - return NULL; + /* Detect whether the listing is simulating the UNIX format */ + FILE *fp; + int c; + fp = fopen (file, "rb"); + if (!fp) + { + logprintf (LOG_NOTQUIET, "%s: %s\n", file, strerror (errno)); + return NULL; } - c = fgetc(fp); - fclose(fp); - /* If the first character of the file is '0'-'9', it's WINNT - format. */ - if (c >= '0' && c <='9') - return ftp_parse_winnt_ls (file); + c = fgetc(fp); + fclose(fp); + /* If the first character of the file is '0'-'9', it's WINNT + format. */ + if (c >= '0' && c <='9') + return ftp_parse_winnt_ls (file); else return ftp_parse_unix_ls (file, 1); } @@ -849,16 +849,16 @@ ftp_index (const char *file, struct url *u, struct fileinfo *f) { FILE *fp; char *upwd; - char *htclfile; /* HTML-clean file name */ + char *htclfile; /* HTML-clean file name */ if (!output_stream) { fp = fopen (file, "wb"); if (!fp) - { - logprintf (LOG_NOTQUIET, "%s: %s\n", file, strerror (errno)); - return FOPENERR; - } + { + logprintf (LOG_NOTQUIET, "%s: %s\n", file, strerror (errno)); + return FOPENERR; + } } else fp = output_stream; @@ -869,9 +869,9 @@ ftp_index (const char *file, struct url *u, struct fileinfo *f) tmpu = url_escape (u->user); tmpp = u->passwd ? url_escape (u->passwd) : NULL; if (tmpp) - upwd = concat_strings (tmpu, ":", tmpp, "@", (char *) 0); + upwd = concat_strings (tmpu, ":", tmpp, "@", (char *) 0); else - upwd = concat_strings (tmpu, "@", (char *) 0); + upwd = concat_strings (tmpu, "@", (char *) 0); xfree (tmpu); xfree_null (tmpp); } @@ -887,57 +887,57 @@ ftp_index (const char *file, struct url *u, struct fileinfo *f) { fprintf (fp, " "); if (f->tstamp != -1) - { - /* #### Should we translate the months? Or, even better, use - ISO 8601 dates? */ - static const char *months[] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" - }; - struct tm *ptm = localtime ((time_t *)&f->tstamp); - - fprintf (fp, "%d %s %02d ", ptm->tm_year + 1900, months[ptm->tm_mon], - ptm->tm_mday); - if (ptm->tm_hour) - fprintf (fp, "%02d:%02d ", ptm->tm_hour, ptm->tm_min); - else - fprintf (fp, " "); - } + { + /* #### Should we translate the months? Or, even better, use + ISO 8601 dates? */ + static const char *months[] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }; + struct tm *ptm = localtime ((time_t *)&f->tstamp); + + fprintf (fp, "%d %s %02d ", ptm->tm_year + 1900, months[ptm->tm_mon], + ptm->tm_mday); + if (ptm->tm_hour) + fprintf (fp, "%02d:%02d ", ptm->tm_hour, ptm->tm_min); + else + fprintf (fp, " "); + } else - fprintf (fp, _("time unknown ")); + fprintf (fp, _("time unknown ")); switch (f->type) - { - case FT_PLAINFILE: - fprintf (fp, _("File ")); - break; - case FT_DIRECTORY: - fprintf (fp, _("Directory ")); - break; - case FT_SYMLINK: - fprintf (fp, _("Link ")); - break; - default: - fprintf (fp, _("Not sure ")); - break; - } + { + case FT_PLAINFILE: + fprintf (fp, _("File ")); + break; + case FT_DIRECTORY: + fprintf (fp, _("Directory ")); + break; + case FT_SYMLINK: + fprintf (fp, _("Link ")); + break; + default: + fprintf (fp, _("Not sure ")); + break; + } htclfile = html_quote_string (f->name); fprintf (fp, "host, u->port); if (*u->dir != '/') - putc ('/', fp); + putc ('/', fp); fprintf (fp, "%s", u->dir); if (*u->dir) - putc ('/', fp); + putc ('/', fp); fprintf (fp, "%s", htclfile); if (f->type == FT_DIRECTORY) - putc ('/', fp); + putc ('/', fp); fprintf (fp, "\">%s", htclfile); if (f->type == FT_DIRECTORY) - putc ('/', fp); + putc ('/', fp); fprintf (fp, " "); if (f->type == FT_PLAINFILE) - fprintf (fp, _(" (%s bytes)"), number_to_static_string (f->size)); + fprintf (fp, _(" (%s bytes)"), number_to_static_string (f->size)); else if (f->type == FT_SYMLINK) - fprintf (fp, "-> %s", f->linkto ? f->linkto : "(nil)"); + fprintf (fp, "-> %s", f->linkto ? f->linkto : "(nil)"); putc ('\n', fp); xfree (htclfile); f = f->next;