static int download_staff_file(ConfigEntry *ce) { int ret = 0; struct stat sb; char *file, *filename; if (Download.in_progress) return 0; Download.is_url = 1; ircstrdup(Download.url, ce->ce_vardata); file = url_getfilename(ce->ce_vardata); filename = unreal_getfilename(file); /* TODO: handle NULL returns */ ircstrdup(Download.file, filename); MyFree(file); if (!loop.ircd_rehashing && !Download.once_completed) { char *error; if (config_verbose > 0) config_status("Downloading %s", Download.url); if (!(file = download_file(ce->ce_vardata, &error))) { config_error("%s:%i: test: error downloading '%s': %s", ce->ce_fileptr->cf_filename, ce->ce_varlinenum, ce->ce_vardata, error); return -1; } Download.once_completed = 1; ircstrdup(Download.path, file); read_motd(Download.path, &staff); MyFree(file); return 0; } file = Download.path ? Download.path : Download.file; if ((ret = stat(file, &sb)) && errno != ENOENT) { /* I know, stat shouldn't fail... */ config_error("%s:%i: could not get the creation time of %s: stat() returned %d: %s", ce->ce_fileptr->cf_filename, ce->ce_varlinenum, Download.file, ret, strerror(errno)); return -1; } if (config_verbose > 0) config_status("Downloading %s", Download.url); Download.in_progress = 1; download_file_async(Download.url, sb.st_ctime, download_staff_file_complete, NULL); return 0; }
/** Read motd-like file, used for rules/motd/botmotd/opermotd/etc. * Multiplexes to either directly reading the MOTD or downloading it asynchronously. * @param filename Filename of file to read or URL. NULL is accepted and causes the *motd to be free()d. * @param motd Reference to motd pointer (used for freeing if needed and for asynchronous remote MOTD support) */ void read_motd(const char *filename, aMotdFile *themotd) { #ifdef USE_LIBCURL time_t modtime; aMotdDownload *motd_download; #endif /* TODO: if themotd points to a tld's motd, could a rehash disrupt this pointer?*/ #ifdef USE_LIBCURL if(themotd->motd_download) { themotd->motd_download->themotd = NULL; /* * It is not our job to free() motd_download, the * read_motd_asynch_downloaded() function will do that * when it sees that ->themod == NULL. */ themotd->motd_download = NULL; } /* if filename is NULL, do_read_motd will catch it */ if(filename && url_is_valid(filename)) { /* prepare our payload for read_motd_asynch_downloaded() */ motd_download = MyMallocEx(sizeof(aMotdDownload)); if(!motd_download) outofmemory(); motd_download->themotd = themotd; themotd->motd_download = motd_download; #ifdef REMOTEINC_SPECIALCACHE modtime = unreal_getfilemodtime(unreal_mkcache(filename)); #else modtime = 0; #endif download_file_async(filename, modtime, (vFP)read_motd_asynch_downloaded, motd_download); return; } #endif /* USE_LIBCURL */ do_read_motd(filename, themotd); return; }