📄 unix.c
字号:
if (chmod(G.filename, 0xffff & G.pInfo->file_attr)) perror("chmod (file attributes) error");#endif} /* end function close_outfile() */#endif /* !MTS */#ifdef SET_DIR_ATTRIB/* messages of code for setting directory attributes */static char Far DirlistUidGidFailed[] = "warning: cannot set UID %d and/or GID %d for %s\n";static char Far DirlistUtimeFailed[] = "warning: cannot set modification, access times for %s\n";# ifndef NO_CHMOD static char Far DirlistChmodFailed[] = "warning: cannot set permissions for %s\n";# endifint set_direc_attribs(__G__ d) __GDEF dirtime *d;{ int errval = PK_OK; if (d->have_uidgid && chown(d->fn, (uid_t)d->uidgid[0], (gid_t)d->uidgid[1])) { Info(slide, 0x201, ((char *)slide, LoadFarString(DirlistUidGidFailed), d->uidgid[0], d->uidgid[1], d->fn)); if (!errval) errval = PK_WARN; } if (utime(d->fn, &d->u.t2)) { Info(slide, 0x201, ((char *)slide, LoadFarString(DirlistUtimeFailed), d->fn)); if (!errval) errval = PK_WARN; }#ifndef NO_CHMOD if (chmod(d->fn, 0xffff & d->perms)) { Info(slide, 0x201, ((char *)slide, LoadFarString(DirlistChmodFailed), d->fn)); /* perror("chmod (file attributes) error"); */ if (!errval) errval = PK_WARN; }#endif /* !NO_CHMOD */ return errval;} /* end function set_directory_attributes() */#endif /* SET_DIR_ATTRIB */#ifdef TIMESTAMP/***************************//* Function stamp_file() *//***************************/int stamp_file(fname, modtime) ZCONST char *fname; time_t modtime;{ ztimbuf tp; tp.modtime = tp.actime = modtime; return (utime(fname, &tp));} /* end function stamp_file() */#endif /* TIMESTAMP */#ifndef SFX/************************//* Function version() *//************************/void version(__G) __GDEF{#if defined(CRAY) || defined(NX_CURRENT_COMPILER_RELEASE) || defined(NetBSD) char buf1[40];#if defined(CRAY) || defined(NX_CURRENT_COMPILER_RELEASE) char buf2[40];#endif#endif /* Pyramid, NeXT have problems with huge macro expansion, too: no Info() */ sprintf((char *)slide, LoadFarString(CompiledWith),#ifdef __GNUC__# ifdef NX_CURRENT_COMPILER_RELEASE (sprintf(buf1, "NeXT DevKit %d.%02d ", NX_CURRENT_COMPILER_RELEASE/100, NX_CURRENT_COMPILER_RELEASE%100), buf1), (strlen(__VERSION__) > 8)? "(gcc)" : (sprintf(buf2, "(gcc %s)", __VERSION__), buf2),# else "gcc ", __VERSION__,# endif#else# if defined(CRAY) && defined(_RELEASE) "cc ", (sprintf(buf1, "version %d", _RELEASE), buf1),# else# ifdef __VERSION__ "cc ", __VERSION__,# else "cc", "",# endif# endif#endif "Unix",#if defined(sgi) || defined(__sgi) " (Silicon Graphics IRIX)",#else#ifdef sun# ifdef sparc# ifdef __SVR4 " (Sun SPARC/Solaris)",# else /* may or may not be SunOS */ " (Sun SPARC)",# endif# else# if defined(sun386) || defined(i386) " (Sun 386i)",# else# if defined(mc68020) || defined(__mc68020__) " (Sun 3)",# else /* mc68010 or mc68000: Sun 2 or earlier */ " (Sun 2)",# endif# endif# endif#else#ifdef __hpux " (HP/UX)",#else#ifdef __osf__ " (DEC OSF/1)",#else#ifdef _AIX " (IBM AIX)",#else#ifdef aiws " (IBM RT/AIX)",#else#if defined(CRAY) || defined(cray)# ifdef _UNICOS (sprintf(buf2, " (Cray UNICOS release %d)", _UNICOS), buf2),# else " (Cray UNICOS)",# endif#else#if defined(uts) || defined(UTS) " (Amdahl UTS)",#else#ifdef NeXT# ifdef mc68000 " (NeXTStep/black)",# else " (NeXTStep for Intel)",# endif#else /* the next dozen or so are somewhat order-dependent */#ifdef LINUX# ifdef __ELF__ " (Linux ELF)",# else " (Linux a.out)",# endif#else#ifdef MINIX " (Minix)",#else#ifdef M_UNIX " (SCO Unix)",#else#ifdef M_XENIX " (SCO Xenix)",#else#ifdef __NetBSD__# ifdef NetBSD0_8 (sprintf(buf1, " (NetBSD 0.8%c)", (char)(NetBSD0_8 - 1 + 'A')), buf1),# else# ifdef NetBSD0_9 (sprintf(buf1, " (NetBSD 0.9%c)", (char)(NetBSD0_9 - 1 + 'A')), buf1),# else# ifdef NetBSD1_0 (sprintf(buf1, " (NetBSD 1.0%c)", (char)(NetBSD1_0 - 1 + 'A')), buf1),# else (BSD4_4 == 0.5)? " (NetBSD before 0.9)" : " (NetBSD 1.1 or later)",# endif# endif# endif#else#ifdef __FreeBSD__ (BSD4_4 == 0.5)? " (FreeBSD 1.x)" : " (FreeBSD 2.0 or later)",#else#ifdef __bsdi__ (BSD4_4 == 0.5)? " (BSD/386 1.0)" : " (BSD/386 1.1 or later)",#else#ifdef __386BSD__ (BSD4_4 == 1)? " (386BSD, post-4.4 release)" : " (386BSD)",#else#if defined(i486) || defined(__i486) || defined(__i486__) " (Intel 486)",#else#if defined(i386) || defined(__i386) || defined(__i386__) " (Intel 386)",#else#ifdef pyr " (Pyramid)",#else#ifdef ultrix# ifdef mips " (DEC/MIPS)",# else# ifdef vax " (DEC/VAX)",# else /* __alpha? */ " (DEC/Alpha)",# endif# endif#else#ifdef gould " (Gould)",#else#ifdef MTS " (MTS)",#else#ifdef __convexc__ " (Convex)",#else#ifdef __QNX__ " (QNX 4)",#else#ifdef __QNXNTO__ " (QNX Neutrino)",#else#ifdef Lynx " (LynxOS)",#else "",#endif /* Lynx */#endif /* QNX Neutrino */#endif /* QNX 4 */#endif /* Convex */#endif /* MTS */#endif /* Gould */#endif /* DEC */#endif /* Pyramid */#endif /* 386 */#endif /* 486 */#endif /* 386BSD */#endif /* BSDI BSD/386 */#endif /* NetBSD */#endif /* FreeBSD */#endif /* SCO Xenix */#endif /* SCO Unix */#endif /* Minix */#endif /* Linux */#endif /* NeXT */#endif /* Amdahl */#endif /* Cray */#endif /* RT/AIX */#endif /* AIX */#endif /* OSF/1 */#endif /* HP/UX */#endif /* Sun */#endif /* SGI */#ifdef __DATE__ " on ", __DATE__#else "", ""#endif ); (*G.message)((zvoid *)&G, slide, (ulg)strlen((char *)slide), 0);} /* end function version() */#endif /* !SFX */#ifdef QLZIPstruct qdirect { long d_length __attribute__ ((packed)); /* file length */ unsigned char d_access __attribute__ ((packed)); /* file access type */ unsigned char d_type __attribute__ ((packed)); /* file type */ long d_datalen __attribute__ ((packed)); /* data length */ long d_reserved __attribute__ ((packed));/* Unused */ short d_szname __attribute__ ((packed)); /* size of name */ char d_name[36] __attribute__ ((packed));/* name area */ long d_update __attribute__ ((packed)); /* last update */ long d_refdate __attribute__ ((packed)); long d_backup __attribute__ ((packed)); /* EOD */};#define LONGID "QDOS02"#define EXTRALEN (sizeof(struct qdirect) + 8)#define JBLONGID "QZHD"#define JBEXTRALEN (sizeof(jbextra) - 4 * sizeof(char))typedef struct { char eb_header[4] __attribute__ ((packed)); /* place_holder */ char longid[8] __attribute__ ((packed)); struct qdirect header __attribute__ ((packed));} qdosextra;typedef struct { char eb_header[4]; /* place_holder */ char longid[4]; struct qdirect header;} jbextra;/* The following two functions SH() and LG() convert big-endian short * and long numbers into native byte order. They are some kind of * counterpart to the generic UnZip's makeword() and makelong() functions. */static ush SH(ush val){ uch swapbuf[2]; swapbuf[1] = (uch)(val & 0xff); swapbuf[0] = (uch)(val >> 8); return (*(ush *)swapbuf);}static ulg LG(ulg val){ /* convert the big-endian unsigned long number `val' to the machine * dependant representation */ ush swapbuf[2]; swapbuf[1] = SH((ush)(val & 0xffff)); swapbuf[0] = SH((ush)(val >> 16)); return (*(ulg *)swapbuf);}static void qlfix(__G__ ef_ptr, ef_len) __GDEF uch *ef_ptr; unsigned ef_len;{ while (ef_len >= EB_HEADSIZE) { unsigned eb_id = makeword(EB_ID + ef_ptr); unsigned eb_len = makeword(EB_LEN + ef_ptr); if (eb_len > (ef_len - EB_HEADSIZE)) { /* discovered some extra field inconsistency! */ Trace((stderr, "qlfix: block length %u > rest ef_size %u\n", eb_len, ef_len - EB_HEADSIZE)); break; } switch (eb_id) { case EF_QDOS: { struct _ntc_ { long id; long dlen; } ntc; long dlen = 0; qdosextra *extra = (qdosextra *)ef_ptr; jbextra *jbp = (jbextra *)ef_ptr; if (!strncmp(extra->longid, LONGID, strlen(LONGID))) { if (eb_len != EXTRALEN) if (uO.qflag) Info(slide, 0x201, ((char *)slide, "warning: invalid length in Qdos field for %s\n", G.filename)); else Info(slide, 0x201, ((char *)slide, "warning: invalid length in Qdos field")); if (extra->header.d_type) { dlen = extra->header.d_datalen; } } if (!strncmp(jbp->longid, JBLONGID, strlen(JBLONGID))) { if (eb_len != JBEXTRALEN) if (uO.qflag) Info(slide, 0x201, ((char *)slide, "warning: invalid length in QZ field for %s\n", G.filename)); else Info(slide, 0x201, ((char *)slide, "warning: invalid length in QZ field")); if(jbp->header.d_type) { dlen = jbp->header.d_datalen; } } if ((long)LG(dlen) > 0) { G.outfile = fopen(G.filename,"r+"); fseek(G.outfile, -8, SEEK_END); fread(&ntc, 8, 1, G.outfile); if(ntc.id != *(long *)"XTcc") { ntc.id = *(long *)"XTcc"; ntc.dlen = dlen; fwrite (&ntc, 8, 1, G.outfile); } Info(slide, 0x201, ((char *)slide, "QData = %d", LG(dlen))); fclose(G.outfile); } return; /* finished, cancel further extra field scanning */ } default: Trace((stderr,"qlfix: unknown extra field block, ID=%d\n", eb_id)); } /* Skip this extra field block */ ef_ptr += (eb_len + EB_HEADSIZE); ef_len -= (eb_len + EB_HEADSIZE); }}#endif /* QLZIP */#ifdef ACORN_FTYPE_NFS/* Acorn bits for NFS filetyping */static int isRISCOSexfield(uch *extra_field){ if (extra_field != NULL) { RO_extra_block *block = (RO_extra_block *)extra_field; return ( makeword(block->ID) == EF_SPARK && (makeword(block->size) == 24 || makeword(block->size) == 20) && makelong(block->ID_2) == 0x30435241 /* ARC0 */); } return FALSE;}#endif /* ACORN_FTYPE_NFS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -