int posixemu_utime( const char *name, struct utimbuf *time ) { int result = -1; long days, mins, ticks; get_time( time->actime, &days, &mins, &ticks ); if( setfiletime( name, days, mins, ticks ) ) result = 0; return result; }
void restore_attr(struct attr_item **list) { struct attr_item *item, *prev; for (item = *list; item != NULL; ) { setfiletime(item->fname,item->time); chmod(item->fname,item->mode); prev = item; item = item->next; free(prev); } *list = NULL; }
int posixemu_utime (const TCHAR *name, struct utimbuf *ttime) { int result = -1, tolocal; long days, mins, ticks; time_t actime; if (!ttime) { actime = time (NULL); tolocal = 0; } else { tolocal = 1; actime = ttime->actime; } get_time (actime, &days, &mins, &ticks); if (setfiletime (name, days, mins, ticks, tolocal)) result = 0; return result; }
bool my_utime (const TCHAR *name, struct mytimeval *tv) { int tolocal; int days, mins, ticks; struct mytimeval tv2; if (!tv) { struct timeb time; ftime (&time); tv2.tv_sec = time.time; tv2.tv_usec = time.millitm * 1000; tolocal = 0; } else { tv2.tv_sec = tv->tv_sec; tv2.tv_usec = tv->tv_usec; tolocal = 1; } timeval_to_amiga (&tv2, &days, &mins, &ticks); if (setfiletime (name, days, mins, ticks, tolocal)) return true; return false; }
/* * Process commands for comparing files to time stamp files. */ static void dodcolon(struct cmd *cmd, char **filev) { struct subcmd *sc; struct namelist *f; char *cp, **cpp; struct stat stb; struct namelist *files = cmd->c_files; struct subcmd *sbcmds = cmd->c_cmds; char *env, *stamp = cmd->c_name; debugmsg(DM_CALL, "dodcolon()"); if (files == NULL) { error("No files to be updated for target \"%s\"", cmd->c_label); return; } if (stat(stamp, &stb) < 0) { error("%s: stat failed: %s", stamp, SYSERR); return; } debugmsg(DM_MISC, "%s: mtime %d\n", stamp, stb.st_mtime); env = NULL; for (sc = sbcmds; sc != NULL; sc = sc->sc_next) { if (sc->sc_type == CMDSPECIAL) { env = (char *) xmalloc(sizeof(E_FILES) + 3); (void) snprintf(env, sizeof(E_FILES) + 3, "%s='", E_FILES); break; } } subcmds = sbcmds; filelist = files; lastmod = stb.st_mtime; if (!nflag && !IS_ON(options, DO_VERIFY)) /* * Set atime and mtime to current time */ (void) setfiletime(stamp, (time_t) 0, (time_t) 0); for (f = files; f != NULL; f = f->n_next) { if (filev) { for (cpp = filev; *cpp; cpp++) if (strcmp(f->n_name, *cpp) == 0) goto found; continue; } found: ptarget = NULL; cmptime(f->n_name, sbcmds, &env); } for (sc = sbcmds; sc != NULL; sc = sc->sc_next) { if (sc->sc_type == NOTIFY) notify(NULL, sc->sc_args, (time_t)lastmod); else if (sc->sc_type == CMDSPECIAL && env) { size_t len = strlen(env); if (env[len - 1] == ':') env[--len] = CNULL; len += 2 + strlen(sc->sc_name) + 1; env = xrealloc(env, len); (void) strlcat(env, "';", len); (void) strlcat(env, sc->sc_name, len); message(MT_CHANGE, "cmdspecial \"%s\"", env); if (!nflag && IS_OFF(options, DO_VERIFY)) runcommand(env); (void) free(env); env = NULL; /* so cmdspecial is only called once */ } } if (!nflag && !IS_ON(options, DO_VERIFY) && (cp = getnotifyfile())) (void) unlink(cp); }
void extract (unsigned msgnr) //************************************************************************* // // EXTRACT-Utility by DF3VI, extrahiert Binaerteile einer Mail auf // die Mailbox-Festplatte ins Box-temp-Verzeichnis // //************************************************************************* { //is this re-entrant? if not, pse set semaphor FILE *f, *g; char name[FNAMELEN+1], s[BUFLEN], st[FNAMELEN+1], *ptr; unsigned long posi, bytes; int err; unsigned int w, r; char *puffer; strlwr(b->mailpath); if (! (f = s_fopen(b->mailpath, "sr"))) { putf(ms(m_extract_errorread), b->mailpath); return; } fgets(s, BUFLEN - 1, f); mbsend_parse(s, 0); do { waitfor(e_ticsfull); fgets(s, BUFLEN - 1, f); } while (! feof(f) && ! (strstr(s, " go_") == s) && ! (strstr(s, "#BIN#") == s)); if (feof(f)) // keine Markierung gefunden { putf(ms(m_extract_nostartline), b->boardname, msgnr); s_fclose(f); return; } do { if (strstr(s, "#BIN#") == s) { s_fclose(f); subst1(s, LF, 0); if (! sscanf(s, "#BIN#%lu", &bytes)) // Laenge lesen { putf(ms(m_extract_invalidheader), b->boardname, msgnr); return; } unsigned long bintime; sscanf(strchr(s, '$'), "$%lX#", &bintime); ptr = s + strlen(s); while (*ptr != '#' && ptr > s) ptr--; // Dateinamen suchen if (*(ptr - 1) != '#') ptr++; // # im Dateinamen ? if (! *ptr || *ptr == '$' || *ptr == '|' ) { putf(ms(m_extract_filenamemissing)); err = 0; do // Ersatzname RUBRIK.lfn erzeugen { waitfor(e_ticsfull); sprintf(s, TEMPPATH "/%s.%03i", b->boardname, ++err); strlwr(s); } while (! access(s, 0) && err <= 999); if (err > 999) { putf(ms(m_extract_filecantcreate)); return; } else putf(ms(m_extract_filecreate), s); } else { strcpy(name, ptr); ptr = name + strlen(name); while (ptr >= name && *ptr != ':' && *ptr != '\\' && *ptr != '/') ptr--; // LW/Pfad abtrennnen // putf("Dateiname: %s\n", ptr+1); sprintf(s, TEMPPATH "/%s", ptr + 1); strlwr(s); } if (! (g = s_fopen(s, "swb"))) { // Ziel-Datei oeffnen putf(ms(m_extract_errorwritebin), errno, s, strerror(errno)); // perror(""); return; } if (! (puffer = (char *) t_malloc(2048, "extr"))) { // 2 kb Puffer zum Daten-Kopieren putf(ms(m_nomem)); s_fclose(g); return; } f = s_fopen(b->mailpath, "srb"); // BIN-Datei oeffnen fseek(f, b->binstart + BINCMDLEN, SEEK_SET); // Position auf Anfang posi = r = 0; // Byte-Zaehler gesamt/gelesen do { r = fread(puffer, 1, 2048, f); posi += r; fwrite(puffer, 1, r, g); waitfor(e_ticsfull); } while (r == 2048); t_free(puffer); s_fclose(g); s_fclose(f); setfiletime(s, bintime); putf(ms(m_extract_extractbin), s, posi, bytes, b->boardname, msgnr); return; // BIN ist immer Fileende } // Ansonsten DG1BBQ-FFR-Markierung if ((strstr(s, " go_text. ") == s) || (strstr(s, " go_info. ") == s)) { sscanf(s + 10, "%s", st); // Text-Datei-Namen lesen sprintf(name, TEMPPATH "/%s", st); strlwr(name); if (! access(name, 0)) // Wenn vorhanden, Extension hochzaehlen { err = 1; switch (name + strlen(name) - strchr(name, '.')) { case 1: // "name." -> "name.__" case 2: strcat(name, "__" ); break; // "name.x" -> "name.x__" case 3: strcat(name, "_"); // "name.xx" -> "name.xx_" case 4: break; // "name.xxx" -> "name.xxx" default: strcat(name, ".__"); // "name" -> "name.__" } *(name + strlen(name) - 2) = 0; do // ZWEI-stellige laufenden Nummer { waitfor(e_ticsfull); sprintf(s, "%s%02x", name, err++); } while (! access(s, 0) && err < 255); if (err >= 255) { putf(ms(m_extract_filecantcreate)); *name = 0; } else { strcpy(st, s); strlwr(st); } } *s = 0; // Keine Startmarkierung schreiben } else if (strstr(s, " go_7+. ") == s) // 7PLUS-Datei-Kopf auswerten { // lfn, Bereich, File-Name if (sscanf(s + 8, "%u of %u %s", &w, &r, name) != 3) { putf(ms(m_extract_invalidstartline), b->boardname, msgnr); *name = 0; } else { subst1(name, '.', 0); // Extension abtrennen if (r == 1) sprintf(st, TEMPPATH "/%s.7pl", name); // Einteilig: Endung .7PL else sprintf(st, TEMPPATH "/%s.p%02x", name, w); // Mehrteilig: End. .PXX } } else { putf(ms(m_extract_invalidstartline), b->boardname, msgnr); *st = 0; } if (*st) { strlwr(st); if (! (g = s_fopen(st, "sw"))) // Ziel-Datei schreiben { putf(ms(m_extract_errorwrite), st); return; } do { fputs(s, g); *s = 0; waitfor(e_ticsfull); fgets(s, BUFLEN - 1, f); } // Bis File-Ende oder Stop-Markierung while (! feof(f) && ! (strstr(s, " stop_") == s)); if (strstr(s, " stop_7+")) fputs(s, g); //nur bei 7+ Endemarkierung schreiben s_fclose(g); putf(ms(m_extract_extract7p), st, b->boardname, msgnr); } do { waitfor(e_ticsfull); *s = 0; fgets(s, BUFLEN - 1, f); // Naechste Start-Markierung suchen } while (! feof(f) && ! (strstr(s, " go_") == s) && ! (strstr(s, "#BIN#") == s)); } while (! feof(f)); // solange 7+ folgt s_fclose(f); // oder File-Ende }