📄 fileio.c
字号:
fcount++; if (name == label) { label = f->name; } } if (undosm != iname) free((zvoid *)undosm); return ZE_OK;}#if !defined(OS2) && !defined(VMS)time_t dos2unixtime(dostime)ulg dostime; /* DOS time to convert *//* Return the Unix time_t value (GMT/UTC time) for the DOS format (local) * time dostime, where dostime is a four byte value (date in most significant * word, time in least significant word), see dostime() function. */{ struct tm *t; /* argument for mktime() */ ZCONST time_t clock = time(NULL); t = localtime(&clock); t->tm_isdst = -1; /* let mktime() determine if DST is in effect */ /* Convert DOS time to UNIX time_t format */ t->tm_sec = (((int)dostime) << 1) & 0x3e; t->tm_min = (((int)dostime) >> 5) & 0x3f; t->tm_hour = (((int)dostime) >> 11) & 0x1f; t->tm_mday = (int)(dostime >> 16) & 0x1f; t->tm_mon = ((int)(dostime >> 21) & 0x0f) - 1; t->tm_year = ((int)(dostime >> 25) & 0x7f) + 80; return mktime(t);}#endif /* !OS2 && !VMS */ulg dostime(y, n, d, h, m, s)int y; /* year */int n; /* month */int d; /* day */int h; /* hour */int m; /* minute */int s; /* second *//* Convert the date y/n/d and time h:m:s to a four byte DOS date and time (date in high two bytes, time in low two bytes allowing magnitude comparison). */{ return y < 1980 ? dostime(1980, 1, 1, 0, 0, 0) : (((ulg)y - 1980) << 25) | ((ulg)n << 21) | ((ulg)d << 16) | ((ulg)h << 11) | ((ulg)m << 5) | ((ulg)s >> 1);}ulg unix2dostime(t)time_t *t; /* unix time to convert *//* Return the Unix time t in DOS format, rounded up to the next two second boundary. */{ time_t t_even; struct tm *s; /* result of localtime() */ t_even = (*t + 1) & (~1); /* Round up to even seconds. */ s = localtime(&t_even); /* Use local time since MSDOS does. */ return dostime(s->tm_year + 1900, s->tm_mon + 1, s->tm_mday, s->tm_hour, s->tm_min, s->tm_sec);}int issymlnk(a)ulg a; /* Attributes returned by filetime() *//* Return true if the attributes are those of a symbolic link */{#ifndef QDOS#ifdef S_IFLNK return ((a >> 16) & S_IFMT) == S_IFLNK;#else /* !S_IFLNK */ return (int)a & 0; /* avoid warning on unused parameter */#endif /* ?S_IFLNK */#else return 0;#endif}#endif /* !UTIL */int destroy(f)char *f; /* file to delete *//* Delete the file *f, returning non-zero on failure. */{ return unlink(f);}int replace(d, s)char *d, *s; /* destination and source file names *//* Replace file *d by file *s, removing the old *s. Return an error code in the ZE_ class. This function need not preserve the file attributes, this will be done by setfileattr() later. */{ struct stat t; /* results of stat() */ int copy = 0; int d_exists;#if defined(VMS) || defined(CMS_MVS) /* stat() is broken on VMS remote files (accessed through Decnet). * This patch allows creation of remote zip files, but is not sufficient * to update them or compress remote files */ unlink(d);#else /* !(VMS || CMS_MVS) */ d_exists = (LSTAT(d, &t) == 0); if (d_exists) { /* * respect existing soft and hard links! */ if (t.st_nlink > 1# ifdef S_IFLNK || (t.st_mode & S_IFMT) == S_IFLNK# endif ) copy = 1; else if (unlink(d)) return ZE_CREAT; /* Can't erase zip file--give up */ }#endif /* ?(VMS || CMS_MVS) */ if (!copy) { if (rename(s, d)) { /* Just move s on top of d */ copy = 1; /* failed ? */#if !defined(VMS) && !defined(ATARI) && !defined(AZTEC_C)#if !defined(CMS_MVS) && !defined(RISCOS) && !defined(QDOS) /* For VMS, ATARI, AMIGA Aztec, VM_CMS, MVS, RISCOS, always assume that failure is EXDEV */ if (errno != EXDEV# ifdef ENOTSAM && errno != ENOTSAM /* Used at least on Turbo C */# endif ) return ZE_CREAT;#endif /* !CMS_MVS && !RISCOS */#endif /* !VMS && !ATARI && !AZTEC_C */ } } if (copy) { FILE *f, *g; /* source and destination files */ int r; /* temporary variable */#ifdef RISCOS if (SWI_OS_FSControl_26(s,d,0xA1)!=NULL) {#endif if ((f = fopen(s, FOPR)) == NULL) { fprintf(stderr," replace: can't open %s\n", s); return ZE_TEMP; } if ((g = fopen(d, FOPW)) == NULL) { fclose(f); return ZE_CREAT; } r = fcopy(f, g, (ulg)-1L); fclose(f); if (fclose(g) || r != ZE_OK) { unlink(d); return r ? (r == ZE_TEMP ? ZE_WRITE : r) : ZE_WRITE; } unlink(s);#ifdef RISCOS }#endif } return ZE_OK;}int getfileattr(f)char *f; /* file path *//* Return the file attributes for file f or 0 if failure */{ struct stat s; return SSTAT(f, &s) == 0 ? (int) s.st_mode : 0;}int setfileattr(f, a)char *f; /* file path */int a; /* attributes returned by getfileattr() *//* Give the file f the attributes a, return non-zero on failure */{#if defined(TOPS20) || defined (CMS_MVS) return 0;#else return chmod(f, a);#endif}char *tempname(zip)char *zip; /* path name of zip file to generate temp name for *//* Return a temporary file name in its own malloc'ed space, using tempath. */{ char *t = zip; /* malloc'ed space for name (use zip to avoid warning) */#ifdef CMS_MVS if ((t = malloc(strlen(tempath)+L_tmpnam+2)) == NULL) return NULL; tmpnam(t);# ifdef VM_CMS /* Remove filemode and replace with tempath, if any. */ /* Otherwise A-disk is used by default */ *(strrchr(t, ' ')+1) = '\0'; if (tempath!=NULL) strcat(t, tempath); return t;# else /* !VM_CMS */ /* For MVS */ if (tempath != NULL) { if ((t = malloc(strlen(tempath)+L_tmpnam+2)) == NULL) return NULL; strcpy(t, tempath); if (t[strlen(t)]!='.') strcat(t, "."); strcat(t,tmpnam(NULL)); return t;# endif /* !VM_CMS */#else /* !CMS_MVS */#ifdef TANDEM char cur_subvol [FILENAME_MAX]; char temp_subvol [FILENAME_MAX]; char *zptr; char *ptr; char *cptr = &cur_subvol[0]; char *tptr = &temp_subvol[0]; short err; t = (char *)malloc(NAMELEN); /* malloc here as you cannot free */ /* tmpnam allocated storage later */ zptr = strrchr(zip, TANDEM_DELIMITER); if (zptr != NULL) { /* ZIP file specifies a Subvol so make temp file there so it can just be renamed at end */ *tptr = *cptr = '\0'; strcat(cptr, getenv("DEFAULTS")); strncat(tptr, zip, _min(FILENAME_MAX, (zptr - zip)) ); /* temp subvol */ strncat(t,zip, _min(NAMELEN, ((zptr - zip) + 1)) ); /* temp stem */ err = chvol(tptr); ptr = t + strlen(t); /* point to end of stem */ tmpnam(ptr); /* Add filename part to temp subvol */ err = chvol(cptr); } else t = tmpnam(t); return t;#else /* !CMS_MVS && !TANDEM *//* * Do something with TMPDIR, TMP, TEMP ???? */ if (tempath != NULL) { if ((t = malloc(strlen(tempath)+12)) == NULL) return NULL; strcpy(t, tempath);#if (!defined(VMS) && !defined(TOPS20))# ifdef AMIGA { char c = t[strlen(t)-1]; if (c != '/' && c != ':') strcat(t, "/"); }# else /* !AMIGA */# ifdef RISCOS if (t[strlen(t)-1] != '.') strcat(t, ".");# else /* !RISCOS */# ifdef QDOS if (t[strlen(t)-1] != '_') strcat(t, "_");# else if (t[strlen(t)-1] != '/') strcat(t, "/");# endif /* QDOS */# endif /* RISCOS */# endif /* ?AMIGA */#endif /* !VMS && !TOPS20 */ } else { if ((t = malloc(12)) == NULL) return NULL; *t = 0; }#ifdef NO_MKTEMP { char *p = t + strlen(t); sprintf(p, "%08lx", (ulg)time(NULL)); return t; }#else strcat(t, "ziXXXXXX"); /* must use lowercase for Linux dos file system */ return mktemp(t);#endif /* NO_MKTEMP */#endif /* TANDEM */#endif /* CMS_MVS */}int fcopy(f, g, n)FILE *f, *g; /* source and destination files */ulg n; /* number of bytes to copy or -1 for all *//* Copy n bytes from file *f to file *g, or until EOF if n == -1. Return an error code in the ZE_ class. */{ char *b; /* malloc'ed buffer for copying */ extent k; /* result of fread() */ ulg m; /* bytes copied so far */ if ((b = malloc(CBSZ)) == NULL) return ZE_MEM; m = 0; while (n == (ulg)(-1L) || m < n) { if ((k = fread(b, 1, n == (ulg)(-1) ? CBSZ : (n - m < CBSZ ? (extent)(n - m) : CBSZ), f)) == 0) if (ferror(f)) { free((zvoid *)b); return ZE_READ; } else break; if (fwrite(b, 1, k, g) != k) { free((zvoid *)b); fprintf(stderr," fcopy: write error\n"); return ZE_TEMP; } m += k; } free((zvoid *)b); return ZE_OK;}#ifdef NO_RENAMEint rename(from, to)ZCONST char *from;ZCONST char *to;{ unlink(to); if (link(from, to) == -1) return -1; if (unlink(from) == -1) return -1; return 0;}#endif /* NO_RENAME */#ifdef ZMEM/************************//* Function memset() *//************************//* * memset - for systems without it * bill davidsen - March 1990 */char *memset(buf, init, len)register char *buf; /* buffer loc */register int init; /* initializer */register unsigned int len; /* length of the buffer */{ char *start; start = buf; while (len--) *(buf++) = init; return(start);}/************************//* Function memcpy() *//************************/char *memcpy(dst,src,len) /* v2.0f */register char *dst, *src;register unsigned int len;{ char *start; start = dst; while (len--) *dst++ = *src++; return(start);}/************************//* Function memcmp() *//************************/intmemcmp(b1,b2,len) /* jpd@usl.edu -- 11/16/90 */register char *b1, *b2;register unsigned int len;{ if (len) do { /* examine each byte (if any) */ if (*b1++ != *b2++) return (*((uch *)b1-1) - *((uch *)b2-1)); /* exit when miscompare */ } while (--len); return(0); /* no miscompares, yield 0 result */}#endif /* ZMEM */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -