X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=submit%2Ftasks.c;h=e60b40c3d6bb2c362f457a07b0c4e6f487651b40;hb=de55454b05f3fee3c8268c5c5d299c31bd212811;hp=1ca515a86588e1711be1ab97506417992c5036ae;hpb=2c3e101dcd66d9237c09653395350bafe5884b86;p=eval.git diff --git a/submit/tasks.c b/submit/tasks.c index 1ca515a..e60b40c 100644 --- a/submit/tasks.c +++ b/submit/tasks.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "submitd.h" @@ -50,6 +51,7 @@ static struct cf_section task_conf = { CF_ITEMS { CF_STRING("Name", PTR_TO(struct task, name)), CF_UNS("OpenData", PTR_TO(struct task, open_data)), + CF_UNS("MaxSize", PTR_TO(struct task, max_size)), CF_END } }; @@ -192,7 +194,31 @@ task_status_find_part(struct odes *to, byte *part, uns create) return o; } -void task_submit_part(byte *user, byte *task, byte *part, byte *ext, uns version UNUSED, struct fastbuf *fb) +static void +task_record_history(byte *user, byte *task, byte *part, byte *ext, uns version, byte *submitted_name) +{ + if (!history_format) + return; + + time_t now = time(NULL); + struct tm *tm = localtime(&now); + byte prefix[256]; + if (strftime(prefix, sizeof(prefix), history_format, tm) <= 0) + { + msg(L_ERROR, "Error formatting history prefix: too long"); + return; + } + + byte *name = stk_printf("%s%s:%s:%s:v%d.%s", prefix, user, task, (strcmp(task, part) ? part : (byte*)""), version, ext); + struct fastbuf *orig = bopen(submitted_name, O_RDONLY, 4096); + struct fastbuf *hist = bopen(name, O_WRONLY | O_CREAT | O_EXCL, 4096); + bbcopy_slow(orig, hist, ~0U); + bclose(hist); + bclose(orig); +} + +void +task_submit_part(byte *user, byte *task, byte *part, byte *ext, uns version, struct fastbuf *fb) { byte *dir = stk_printf("solutions/%s/%s", user, task); byte *name = stk_printf("%s/%s.%s", dir, part, ext); @@ -204,12 +230,15 @@ void task_submit_part(byte *user, byte *task, byte *part, byte *ext, uns version bconfig(fb, BCONFIG_IS_TEMP_FILE, 0); if (rename(fb->name, name) < 0) die("Cannot rename %s to %s: %m", fb->name, name); + + task_record_history(user, task, part, ext, version, name); } -void task_delete_part(byte *user, byte *task, byte *part, byte *ext, uns version UNUSED) +void +task_delete_part(byte *user, byte *task, byte *part, byte *ext, uns version UNUSED) { byte *dir = stk_printf("solutions/%s/%s", user, task); byte *name = stk_printf("%s/%s.%s", dir, part, ext); if (unlink(name) < 0) - log(L_ERROR, "Cannot delete %s: %m", name); + msg(L_ERROR, "Cannot delete %s: %m", name); }