diff options
Diffstat (limited to 'src/process.c')
-rw-r--r-- | src/process.c | 160 |
1 files changed, 107 insertions, 53 deletions
diff --git a/src/process.c b/src/process.c index c5eb321..ec64589 100644 --- a/src/process.c +++ b/src/process.c @@ -24,6 +24,20 @@ struct spool_list static struct spool_list *spool_list; +int +for_each_spool (int (*fun) (struct spool *, void *), void *data) +{ + struct spool_list *sp; + + for (sp = spool_list; sp; sp = sp->next) + { + int rc = fun (&sp->spool, data); + if (rc) + return rc; + } + return 0; +} + void register_spool (struct spool *spool) { @@ -122,7 +136,14 @@ parse_file_name (const char *name, struct file_info *finfo) abort (); /* should not happen */ } -int +void +file_info_cleanup (struct file_info *finfo) +{ + free (finfo->name); + memset (finfo, 0, sizeof (*finfo)); +} + +static int match_uid_p (uid_t uid, int uc, uid_t *uv) { int i; @@ -134,10 +155,67 @@ match_uid_p (uid_t uid, int uc, uid_t *uv) return 0; } +int +spool_cwd_add_new_file (const struct spool *spool, const char *name, + int uc, uid_t *uv) +{ + struct stat st; + struct file_info finfo; + + if (stat (name, &st)) + { + logmsg (LOG_ERR, _("cannot stat file %s/%s: %s"), + spool->source_dir, name, strerror (errno)); + return -1; + } + + if (!S_ISREG (st.st_mode)) + { + logmsg (LOG_NOTICE, _("not a regular file: %s/%s"), + spool->source_dir, name); + return -1; + } + + if (!match_uid_p (st.st_uid, uc, uv)) + { + if (debug_level) + logmsg (LOG_DEBUG, _("ignoring file: %s/%s"), + spool->source_dir, name); + return -1; + } + + finfo.sb = st; + parse_file_name (name, &finfo); + + if (debug_level) + logmsg (LOG_DEBUG, _("found file %s: %s, stem: %.*s"), name, + file_type_str (finfo.type), finfo.root_len, finfo.name); + + register_file (&finfo, spool); + return 0; +} + +int +spool_add_new_file (const struct spool *spool, const char *name, + int uc, uid_t *uv) +{ + if (debug_level) + logmsg (LOG_DEBUG, "%s -> %s, adding %s", spool->source_dir, + mu_url_to_string (spool->dest_url), name); + + if (chdir (spool->source_dir)) + { + logmsg (LOG_ERR, _("cannot chdir to %s: %s"), spool->source_dir, + strerror (errno)); + return -1; + } + return spool_cwd_add_new_file (spool, name, uc, uv); +} + /* Scan upload directory from the DPAIR and register all files found there, forming triplets when possible */ void -scan_spool_unlocked (const struct spool *spool, int uc, uid_t *uv) +scan_spool_unlocked (struct spool *spool, int uc, uid_t *uv) { DIR *dir; struct dirent *ent; @@ -166,67 +244,22 @@ scan_spool_unlocked (const struct spool *spool, int uc, uid_t *uv) timer_start (spool->tag); while ((ent = readdir (dir))) { - struct stat st; - struct file_info finfo; - if (strcmp (ent->d_name, ".") == 0 || strcmp (ent->d_name, "..") == 0) continue; - - if (stat (ent->d_name, &st)) - { - logmsg (LOG_ERR, _("cannot stat file %s/%s: %s"), - spool->source_dir, ent->d_name, - strerror (errno)); - continue; - } - - if (!S_ISREG (st.st_mode)) - { - logmsg (LOG_NOTICE, _("not a regular file: %s/%s"), - spool->source_dir, ent->d_name); - continue; - } - - if (!match_uid_p (st.st_uid, uc, uv)) - { - if (debug_level) - logmsg (LOG_DEBUG, _("ignoring file: %s/%s"), - spool->source_dir, ent->d_name); - continue; - } - - finfo.sb = st; - parse_file_name (ent->d_name, &finfo); - - if (debug_level) - logmsg (LOG_DEBUG, _("found file %s: %s, stem: %.*s"), ent->d_name, - file_type_str (finfo.type), finfo.root_len, finfo.name); - - register_file (&finfo, spool); + spool_cwd_add_new_file (spool, ent->d_name, uc, uv); } closedir (dir); if (count_collected_triplets () > 0) - { - int i; + spool_commit_triplets (spool); - for (i = 0; i < dictionary_count; i++) - { - if (dictionary_init (spool->dictionary[i])) - { - logmsg (LOG_ERR, _("failed to initialize dictionary %d"), i); - return; - } - } - enumerate_triplets (spool); - } timer_stop (spool->tag); timer_stop ("spool"); } int -scan_spool (const struct spool *spool, int uc, uid_t *uv) +scan_spool (struct spool *spool, int uc, uid_t *uv) { char *lockfile = wydawca_lockname (spool->tag); int rc = wydawca_lock (lockfile); @@ -249,12 +282,33 @@ scan_spool (const struct spool *spool, int uc, uid_t *uv) return rc; } -static void -close_dictionaries (struct spool *spool) +int +spool_open_dictionaries (struct spool *spool) +{ + if (!spool->dict_inited) + { + int i; + + for (i = 0; i < dictionary_count; i++) + { + if (dictionary_init (spool->dictionary[i])) + { + logmsg (LOG_ERR, _("failed to initialize dictionary %d"), i); + return -1; + } + } + spool->dict_inited = 1; + } + return 0; +} + +void +spool_close_dictionaries (struct spool *spool) { int i; for (i = 0; i < NITEMS (spool->dictionary); i++) dictionary_done (spool->dictionary[i]); + spool->dict_inited = 0; } /* Scan all configured update directories */ @@ -271,7 +325,7 @@ scan_all_spools (int uidc, uid_t *uidv) rc++; for (sp = spool_list; sp; sp = sp->next) - close_dictionaries (&sp->spool); + spool_close_dictionaries (&sp->spool); timer_stop ("wydawca"); return rc; } |