diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-01-01 13:25:55 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-01-01 13:33:04 +0200 |
commit | 24e6dfa7cffceea0cac0f3cc349192788f040939 (patch) | |
tree | c2bd53e9bc58873c8187e6bd622ae152b35d1d51 /src/backup.c | |
parent | 2bdd70d698c63d32f25b4f1142e09f5eaef4812a (diff) | |
download | wydawca-24e6dfa7cffceea0cac0f3cc349192788f040939.tar.gz wydawca-24e6dfa7cffceea0cac0f3cc349192788f040939.tar.bz2 |
Update copyright years. Switch to a familiar style.
Diffstat (limited to 'src/backup.c')
-rw-r--r-- | src/backup.c | 251 |
1 files changed, 121 insertions, 130 deletions
diff --git a/src/backup.c b/src/backup.c index c5c55de..7119ae1 100644 --- a/src/backup.c +++ b/src/backup.c @@ -1,5 +1,5 @@ /* wydawca - automatic release submission daemon - Copyright (C) 2011, 2012 Sergey Poznyakoff + Copyright (C) 2011-2013 Sergey Poznyakoff Wydawca is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -19,147 +19,138 @@ char const *simple_backup_suffix = "~"; static const char * -split_filename (char const *file, char **pdir) +split_filename(char const *file, char **pdir) { - const char *p = strrchr (file, '/'); - - if (!p) - { - *pdir = grecs_strdup ("."); - p = file; - } - else - { - size_t len = p - file; - char *dir = grecs_malloc (len + 1); - memcpy (dir, file, len); - dir[len] = 0; - *pdir = dir; - p++; - } - return p; + const char *p = strrchr(file, '/'); + + if (!p) { + *pdir = grecs_strdup("."); + p = file; + } else { + size_t len = p - file; + char *dir = grecs_malloc(len + 1); + memcpy(dir, file, len); + dir[len] = 0; + *pdir = dir; + p++; + } + return p; } #define MINSUFSIZE 8 #define ISDIGIT(c) ('0' <= (c) && (c) <= '9') static char * -get_backup_suffix (char const *file, enum backup_type type) +get_backup_suffix(char const *file, enum backup_type type) { - char *dirname; - const char *basename; - size_t baselen; - DIR *dir; - struct dirent *ent; - char *lastsuf = NULL; - size_t lastsuflen = 0; - size_t lastsufsize = 0; - int carry = 0; - char *newsuf; - char *q; - - if (type == simple_backups) - return grecs_strdup (simple_backup_suffix); - - basename = split_filename (file, &dirname); - baselen = strlen (basename); - dir = opendir (dirname); - if (!dir) - { - int ec = errno; - free (dirname); - errno = ec; - return NULL; - } - - while ((ent = readdir (dir))) - { - size_t len = strlen (ent->d_name); - const char *p; - size_t suflen; - - if (len < baselen + 4 || memcmp (ent->d_name, basename, baselen)) - continue; - p = ent->d_name + baselen; - suflen = len - baselen; - if (p[0] == '.' && p[1] == '~' && p[suflen-1] == '~' && - (suflen > lastsuflen - || (suflen == lastsuflen && - memcmp (p, lastsuf, lastsuflen) > 0))) - { - carry = 1; - for (q = (char*) p + suflen - 2; q > p + 1 && ISDIGIT (*q); q--) - if (*q != '9') - carry = 0; - q++; - if (!ISDIGIT (*q)) - continue; - - if (suflen > lastsufsize) - { - lastsufsize = suflen; - if (!lastsuf) - { - if (lastsufsize < MINSUFSIZE) - lastsufsize = MINSUFSIZE; - lastsuf = grecs_malloc (lastsufsize); + char *dirname; + const char *basename; + size_t baselen; + DIR *dir; + struct dirent *ent; + char *lastsuf = NULL; + size_t lastsuflen = 0; + size_t lastsufsize = 0; + int carry = 0; + char *newsuf; + char *q; + + if (type == simple_backups) + return grecs_strdup(simple_backup_suffix); + + basename = split_filename(file, &dirname); + baselen = strlen(basename); + dir = opendir(dirname); + if (!dir) { + int ec = errno; + free(dirname); + errno = ec; + return NULL; + } + + while ((ent = readdir(dir))) { + size_t len = strlen(ent->d_name); + const char *p; + size_t suflen; + + if (len < baselen + 4 || + memcmp(ent->d_name, basename, baselen)) + continue; + p = ent->d_name + baselen; + suflen = len - baselen; + if (p[0] == '.' && p[1] == '~' && p[suflen - 1] == '~' && + (suflen > lastsuflen + || (suflen == lastsuflen && + memcmp(p, lastsuf, lastsuflen) > 0))) { + carry = 1; + for (q = (char *)p + suflen - 2; + q > p + 1 && ISDIGIT(*q); q--) + if (*q != '9') + carry = 0; + q++; + if (!ISDIGIT(*q)) + continue; + + if (suflen > lastsufsize) { + lastsufsize = suflen; + if (!lastsuf) { + if (lastsufsize < MINSUFSIZE) + lastsufsize = MINSUFSIZE; + lastsuf = grecs_malloc(lastsufsize); + } else + lastsuf = grecs_realloc(lastsuf, + lastsufsize); + } + memcpy(lastsuf, p, suflen); + lastsuflen = suflen; } - else - lastsuf = grecs_realloc (lastsuf, lastsufsize); - } - memcpy (lastsuf, p, suflen); - lastsuflen = suflen; } - } - closedir (dir); - free (dirname); - - if (lastsuf) - { - size_t newsuflen; - - newsuflen = lastsuflen + carry; - newsuf = grecs_malloc (newsuflen + 1); - newsuf[0] = '.'; - newsuf[1] = '~'; - newsuf[2] = '0'; - memcpy (newsuf + 2 + carry, lastsuf + 2, lastsuflen - 3); - newsuf[newsuflen-1] = '~'; - newsuf[newsuflen] = 0; - - for (q = newsuf + newsuflen - 2; *q == '9'; q--) - *q = '0'; - ++*q; - free (lastsuf); - } - else if (type == numbered_existing_backups) - newsuf = grecs_strdup (simple_backup_suffix); - else - newsuf = grecs_strdup (".~1~"); - return newsuf; + closedir(dir); + free(dirname); + + if (lastsuf) { + size_t newsuflen; + + newsuflen = lastsuflen + carry; + newsuf = grecs_malloc(newsuflen + 1); + newsuf[0] = '.'; + newsuf[1] = '~'; + newsuf[2] = '0'; + memcpy(newsuf + 2 + carry, lastsuf + 2, lastsuflen - 3); + newsuf[newsuflen - 1] = '~'; + newsuf[newsuflen] = 0; + + for (q = newsuf + newsuflen - 2; *q == '9'; q--) + *q = '0'; + ++*q; + free(lastsuf); + } else if (type == numbered_existing_backups) + newsuf = grecs_strdup(simple_backup_suffix); + else + newsuf = grecs_strdup(".~1~"); + return newsuf; } char * -find_backup_file_name (char const *file, enum backup_type type) +find_backup_file_name(char const *file, enum backup_type type) { - size_t flen; - char *suffix; - char *newname; - - if (type == no_backups) - { - errno = 0; - return NULL; - } - - suffix = get_backup_suffix (file, type); - if (!suffix) - return NULL; - flen = strlen (file); - newname = grecs_malloc (flen + strlen (suffix) + 1); - memcpy (newname, file, flen); - strcpy (newname + flen, suffix); - free (suffix); - /* FIXME: Check newname length */ - return newname; + size_t flen; + char *suffix; + char *newname; + + if (type == no_backups) { + errno = 0; + return NULL; + } + + suffix = get_backup_suffix(file, type); + if (!suffix) + return NULL; + flen = strlen(file); + newname = grecs_malloc(flen + strlen(suffix) + 1); + memcpy(newname, file, flen); + strcpy(newname + flen, suffix); + free(suffix); + /* FIXME: Check newname length */ + return newname; } |