--- afd-1.3.5/src/fd/get_remote_file_names_http.c.old 2007-03-01 08:47:01.000000000 +0100 +++ afd-1.3.5/src/fd/get_remote_file_names_http.c 2007-10-12 15:37:35.000000000 +0200 @@ -204,7 +204,8 @@ check_name(char *), eval_html_dir_list(char *, int *, off_t *); static off_t convert_size(char *, off_t *); -static void remove_ls_data(void); +static void expand_filter_http(char *, char *, time_t), + remove_ls_data(void); /* #define MALLOC_INSTEAD_OF_MMAP_TEST */ @@ -216,6 +217,7 @@ i, j, status; + time_t now; struct tm *p_tm; /* Get all file masks for this directory. */ @@ -235,9 +237,14 @@ { /* Note: FTP returns GMT so we need to convert this to GMT! */ current_time = time(NULL); + now = current_time; p_tm = gmtime(¤t_time); current_time = mktime(p_tm); } + else + { + now = 0; + } /* * First determine if user wants to try and get a filename @@ -427,14 +434,25 @@ { time_t file_mtime; off_t file_size; - char *p_mask; + char *p_mask, + tmp_mask[MAX_FILENAME_LENGTH];; + + if (now == 0) + { + now = time(NULL); + } for (i = 0; i < nfg; i++) { p_mask = fml[i].file_list; for (j = 0; j < fml[i].fc; j++) { - if ((status = http_head(db.hostname, db.target_dir, p_mask, + /* + * We cannot just take the mask as is. We must check if we + * need to expand the mask and then use the expansion. + */ + expand_filter_http(p_mask, tmp_mask, now); + if ((status = http_head(db.hostname, db.target_dir, tmp_mask, &file_size, &file_mtime)) == SUCCESS) { off_t exact_size; @@ -455,7 +473,7 @@ "Date for %s is %lld, size = %lld bytes.", # endif #endif - p_mask, (pri_time_t)file_mtime, + tmp_mask, (pri_time_t)file_mtime, (pri_off_t)file_size); } if (file_size == -1) @@ -466,7 +484,7 @@ { exact_size = 1; } - if (check_list(p_mask, file_mtime, exact_size, file_size, + if (check_list(tmp_mask, file_mtime, exact_size, file_size, file_size_to_retrieve) == 0) { files_to_retrieve++; @@ -1616,3 +1634,243 @@ return(exact_size); } + + + +/*------------------------ expand_filter_http() -------------------------*/ +void +expand_filter_http(char *orig_filter, char *tmp_filter, time_t check_time) +{ + time_t time_modifier = 0; + char *rptr, + time_mod_sign = '+', + *wptr; + + rptr = orig_filter; + wptr = tmp_filter; + while ((*rptr != '\0') && (wptr < (tmp_filter + MAX_FILENAME_LENGTH - 1))) + { + if ((*rptr == '%') && ((*(rptr + 1) == 't') || (*(rptr + 1) == 'T') || + (*(rptr + 1) == 'h')) && + ((rptr == orig_filter) || ((*(rptr - 1) != '\\')))) + { + if (*(rptr + 1) == 't') + { + time_t time_buf; + + time_buf = check_time; + + if (time_modifier > 0) + { + switch (time_mod_sign) + { + case '-' : + time_buf = time_buf - time_modifier; + break; + case '*' : + time_buf = time_buf * time_modifier; + break; + case '/' : + time_buf = time_buf / time_modifier; + break; + case '%' : + time_buf = time_buf % time_modifier; + break; + case '+' : + default : + time_buf = time_buf + time_modifier; + break; + } + } + switch (*(rptr + 2)) + { + case 'a': /* short day of the week 'Tue' */ + wptr += strftime(wptr, + (tmp_filter + MAX_FILENAME_LENGTH - wptr), + "%a", localtime(&time_buf)); + break; + case 'b': /* short month 'Jan' */ + wptr += strftime(wptr, + (tmp_filter + MAX_FILENAME_LENGTH - wptr), + "%b", localtime(&time_buf)); + break; + case 'j': /* day of year [001,366] */ + wptr += strftime(wptr, + (tmp_filter + MAX_FILENAME_LENGTH - wptr), + "%j", localtime(&time_buf)); + break; + case 'd': /* day of month [01,31] */ + wptr += strftime(wptr, + (tmp_filter + MAX_FILENAME_LENGTH - wptr), + "%d", localtime(&time_buf)); + break; + case 'M': /* minute [00,59] */ + wptr += strftime(wptr, + (tmp_filter + MAX_FILENAME_LENGTH - wptr), + "%M", localtime(&time_buf)); + break; + case 'm': /* month [01,12] */ + wptr += strftime(wptr, + (tmp_filter + MAX_FILENAME_LENGTH - wptr), + "%m", localtime(&time_buf)); + break; + case 'y': /* year 2 chars [01,99] */ + wptr += strftime(wptr, + (tmp_filter + MAX_FILENAME_LENGTH - wptr), + "%y", localtime(&time_buf)); + break; + case 'H': /* hour [00,23] */ + wptr += strftime(wptr, + (tmp_filter + MAX_FILENAME_LENGTH - wptr), + "%H", localtime(&time_buf)); + break; + case 'S': /* second [00,59] */ + wptr += strftime(wptr, + (tmp_filter + MAX_FILENAME_LENGTH - wptr), + "%S", localtime(&time_buf)); + break; + case 'Y': /* year 4 chars 2002 */ + wptr += strftime(wptr, + (tmp_filter + MAX_FILENAME_LENGTH - wptr), + "%Y", localtime(&time_buf)); + break; + case 'A': /* long day of the week 'Tuesday' */ + wptr += strftime(wptr, + (tmp_filter + MAX_FILENAME_LENGTH - wptr), + "%A", localtime(&time_buf)); + break; + case 'B': /* month 'January' */ + wptr += strftime(wptr, + (tmp_filter + MAX_FILENAME_LENGTH - wptr), + "%B", localtime(&time_buf)); + break; + case 'U': /* Unix time. */ +#if SIZEOF_TIME_T == 4 + wptr += sprintf(wptr, "%ld", (pri_time_t)time_buf); +#else + wptr += sprintf(wptr, "%lld", (pri_time_t)time_buf); +#endif + break; + default : + *wptr = '%'; + *(wptr + 1) = 't'; + *(wptr + 2) = *(rptr + 2); + wptr += 3; + break; + } + rptr += 3; + } + else if (*(rptr + 1) == 'T') + { + int m, + time_unit; + char string[MAX_INT_LENGTH + 1]; + + rptr += 2; + switch (*rptr) + { + case '+' : + case '-' : + case '*' : + case '/' : + case '%' : + time_mod_sign = *rptr; + rptr++; + break; + default : + time_mod_sign = '+'; + break; + } + m = 0; + while ((isdigit((int)(*rptr))) && (m < MAX_INT_LENGTH)) + { + string[m++] = *rptr++; + } + if ((m > 0) && (m < MAX_INT_LENGTH)) + { + string[m] = '\0'; + time_modifier = atoi(string); + } + else + { + if (m == MAX_INT_LENGTH) + { + system_log(WARN_SIGN, __FILE__, __LINE__, + "The time modifier specified in the filter %s is to long.", + orig_filter); + } + else + { + system_log(WARN_SIGN, __FILE__, __LINE__, + "There is no time modifier specified in filter %s", + orig_filter); + } + time_modifier = 0; + } + switch (*rptr) + { + case 'S' : /* Second */ + time_unit = 1; + rptr++; + break; + case 'M' : /* Minute */ + time_unit = 60; + rptr++; + break; + case 'H' : /* Hour */ + time_unit = 3600; + rptr++; + break; + case 'd' : /* Day */ + time_unit = 86400; + rptr++; + break; + default : + time_unit = 1; + break; + } + if (time_modifier > 0) + { + time_modifier = time_modifier * time_unit; + } + } + else /* It must be the hostname modifier. */ + { +#ifdef HAVE_GETHOSTNAME + char hostname[40]; + + if (gethostname(hostname, 40) == -1) + { +#endif + char *p_hostname; + + if ((p_hostname = getenv("HOSTNAME")) != NULL) + { + wptr += sprintf(wptr, "%s", p_hostname); + } + else + { + *wptr = '%'; + *(wptr + 1) = 'h'; + wptr += 2; + } +#ifdef HAVE_GETHOSTNAME + } + else + { + wptr += sprintf(wptr, "%s", hostname); + } +#endif + rptr += 2; + } + } + else + { + *wptr = *rptr; + wptr++; rptr++; + } + } + *wptr = '\0'; + + return; +}