void progress_save(levelset *set, char *user, progress p) { FILE *fp; char fname[FILENAME_MAX]; char datebuf[40]; fname[sizeof(fname)-1] = '\0'; strncpy(fname, SAVEDIR, sizeof(fname)); strncpy(fname + strlen(fname), set->name, sizeof(fname)-strlen(fname)); strncpy(fname + strlen(fname), ".", sizeof(fname)-strlen(fname)); strncpy(fname + strlen(fname), user, sizeof(fname)-strlen(fname)); strncpy(fname + strlen(fname), ".progress", sizeof(fname)-strlen(fname)); if (fname[sizeof(fname)-1] != '\0') { /* file name length overflow */ return; } fp = fopen(fname, "w"); if (!fp) { /* unable to write progress file */ return; } fmt_date(datebuf, p.date); fprintf(fp, "Level: %d\nDate: %s\n", p.levnum, datebuf); fclose(fp); }
void progress_save(levelset *set, char *user, progress p) { FILE *fp; char fname[FILENAME_MAX]; char datebuf[40]; fname[sizeof(fname)-1] = '\0'; strncpy(fname, SAVEDIR, sizeof(fname)); strncpy(fname + strlen(fname), set->name, sizeof(fname)-strlen(fname)); strncpy(fname + strlen(fname), ".", sizeof(fname)-strlen(fname)); strncpy(fname + strlen(fname), user, sizeof(fname)-strlen(fname)); strncpy(fname + strlen(fname), ".progress", sizeof(fname)-strlen(fname)); if (fname[sizeof(fname)-1] != '\0') { /* file name length overflow */ return; } /* For writing this file we want umask 037, so we get file mode 0640. */ umask(037); fp = fopen(fname, "w"); if (!fp) { /* unable to write progress file */ return; } /* Now let's be very sure the file mode came out right. */ fchmod(fileno(fp), 0640); fmt_date(datebuf, p.date); fprintf(fp, "Level: %d\nDate: %s\n", p.levnum, datebuf); fclose(fp); }
void oneline(char *file) { if (!init) { // delay loading of the seq until we need to scan the first // file, in case someone in the pipe updated the map before char *seq = blaze822_seq_open(0); blaze822_seq_load(seq); cur = blaze822_seq_cur(); init = 1; } int indent = 0; while (*file == ' ' || *file == '\t') { indent++; file++; } struct message *msg = blaze822(file); char *flags = msg ? strstr(file, ":2,") : 0; if (!flags) flags = ""; else flags += 3; int wleft = cols; char *f; for (f = fflag; *f; f++) { if (*f == '\\') { f++; switch (*f) { case 'n': putchar('\n'); wleft = cols; break; case 't': putchar('\t'); wleft -= (8 - wleft % 8); break; default: putchar('\\'); wleft--; putchar(*f); wleft--; } continue; } if (*f != '%') { putchar(*f); wleft--; continue; } f++; int w = 0; if ((*f >= '0' && *f <= '9') || *f == '-') { errno = 0; char *e; w = strtol(f, &e, 10); if (errno != 0) w = 0; else f = e; } if (!*f) break; switch (*f) { case '%': putchar('%'); wleft--; break; case 'c': if (cur && strcmp(cur, file) == 0) putchar('>'); else putchar(' '); wleft--; break; case 'u': // unseen if (strchr(flags, 'T')) putchar('x'); else if (strchr(flags, 'F')) putchar('*'); else if (msg && !strchr(flags, 'S')) putchar('.'); else putchar(' '); wleft--; break; case 'r': // replied if (strchr(flags, 'R')) putchar('-'); else if (strchr(flags, 'P')) putchar(':'); else putchar(' '); wleft--; break; case 't': // to-flag wleft -= printf("%s", fmt_to_flag(msg)); break; case 'M': // raw Maildir flags if (!w) w = -3; wleft -= printf("%*s", w, flags); break; case 'n': { long lineno = msg ? blaze822_seq_find(file) : 0; if (lineno) wleft -= printf("%*ld", w, lineno); else wleft -= printf("%*s", w, ""); } break; case 'd': case 'D': if (!w) w = 10; wleft -= printf("%*s", w, fmt_date(msg, w, Iflag || *f == 'D')); break; case 'f': if (w < 0) w += wleft; if (w) wleft -= u8putstr(stdout, fmt_from(msg), w, 1); else wleft -= u8putstr(stdout, fmt_from(msg), wleft, 0); break; case 'i': { int z; if (!w) w = 1; if (indent >= 10) { wleft -= printf("..%2d..", indent); indent = 10 - 6/w; } for (z = 0; z < w*indent; z++) putchar(' '); wleft -= w*indent; } break; case 's': case 'S': if (w < 0) w += wleft; if (w) wleft -= u8putstr(stdout, fmt_subject(msg, file, *f == 'S'), w, 1); else wleft -= u8putstr(stdout, fmt_subject(msg, file, *f == 'S'), wleft, 0); break; case 'b': { struct stat st; if (msg) { if (stat(file, &st) != 0) st.st_size = 0; wleft -= print_human(st.st_size, w); } else { wleft -= printf("%.*s", w, ""); } } break; case 'F': { char *e = file + strlen(file); while (file < e && *e != '/') e--; e--; while (file < e && *e != '/') e--; while (file < e && *e == '/') e--; char *b = e; e++; while (file < b && *b != '/') b--; if (*b == '/') b++; if (*b == '.') b++; if (w) { if (w < 0) w = -w; wleft -= printf("%*.*s", -w, (int)(e-b < w ? e-b : w), b); } else { wleft -= printf("%.*s", (int)(e-b), b); } } break; case 'R': if (w) wleft -= printf("%*.*s", w, w, file); else wleft -= printf("%s", file); break; case 'I': { char *m = msg ? blaze822_hdr(msg, "message-id") : 0; if (!m) m = "(unknown)"; if (w) wleft -= printf("%*.*s", w, w, m); else wleft -= printf("%s", m); } break; default: putchar('%'); putchar(*f); wleft -= 2; } } printf("\n"); blaze822_free(msg); }