📄 qdos.c
字号:
/* Copyright (c) 1990-2005 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2004-May-22 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, both of these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html*//* * Yes this file is necessary; the QDOS file system is the most * ludicrous known to man (even more so than VMS!). */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <fcntl.h>#include <dirent.h>#include <unistd.h>#include "zip.h"#include "crypt.h"#include "ttyio.h"#ifdef QDOS# include <qdos.h>#if CRYPTchar *getp(m, p, n) ZCONST char *m; /* prompt for password */ char *p; /* return value: line input */ int n; /* bytes available in p[] */{ int c; /* one-byte buffer for read() to use */ int i; /* number of characters input */ char *w; /* warning on retry */ /* get password */ w = ""; sd_cure(getchid(0), -1); /* enable cursor */ do { fputs(w, stderr); /* warning if back again */ fputs(m, stderr); /* display prompt and flush */ fflush(stderr); i = 0; do { c = getch(); if (c == 0xc2) { if (i > 0) { i--; /* the `del' keys works */ fputs("\b \b", stderr); } } else if (i < n) { p[i++] = c; /* truncate past n */ if(c != '\n') putc('*', stderr); } } while (c != '\n'); putc('\n', stderr); fflush(stderr); w = "(line too long--try again)\n"; } while (p[i-1] != '\n'); p[i-1] = 0; /* terminate at newline */ sd_curs(getchid(0), -1); /* suppress cursor */ return p; /* return pointer to password */} /* end function getp() */#endif /* CRYPT */#define __attribute__(p)int newname(char *, int, int);#else /* !QDOS */#define QDOS_FLMAX 36short qlflag = 0;struct 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[QDOS_FLMAX] __attribute__ ((packed));/* name area */ long d_update __attribute__ ((packed)); /* last update */ long d_refdate __attribute__ ((packed)); long d_backup __attribute__ ((packed)); /* EOD */ } ;#endif /* ?QDOS */#define SHORTID 0x4afb /* in big-endian order !! */#define LONGID "QDOS02"#define EXTRALEN (sizeof(struct qdirect) + 8)typedef struct{ unsigned short shortid __attribute__ ((packed)); struct { unsigned char lo __attribute__ ((packed)); unsigned char hi __attribute__ ((packed)); } len __attribute__ ((packed)); char longid[8] __attribute__ ((packed)); struct qdirect header __attribute__ ((packed));} qdosextra;#ifdef USE_EF_UT_TIMElocal int GetExtraTime(struct zlist far *z, iztimes *z_utim, unsigned ut_flg);#endif#ifdef QDOS#define rev_short(x) (x)#define rev_long(x) (x)char _prog_name[] = "zip";char _copyright[] = "(c) Info-ZIP Group";long _stack = 16*1024;char * _endmsg = NULL;extern void consetup_title(chanid_t,struct WINDOWDEF *);void (*_consetup)(chanid_t,struct WINDOWDEF *) = consetup_title;struct WINDOWDEF _condetails ={ 2, 1, 0, 7, 500, 220, 2, 30};extern short qlwait;extern short dtype;#define CHECKDIR(p1) (((p1).d_type == dtype) && (((p1).d_length % 64) == 0))char * stpcpy (char *d, ZCONST char *s){ while(*d++ = *s++) ; /* Null loop */ return d-1;}static jobid_t chowner(chanid_t chan){ extern char *_sys_var; char *scht; long *cdb; long jid; scht = *((char **)(_sys_var + 0x78)); cdb = *(long **)((long *)scht + (chan & 0xffff)); jid = *(cdb + 2); return jid;}void QDOSexit(void){ jobid_t me,you; me = getpid(); you = chowner(getchid(0)); if((me == you) && ((qlflag & 4) == 0)) { if(isatty(0) && isatty(2) && qlwait) { char c = 0; fputs("Press a key to exit", stderr); if((io_fbyte(getchid(0), qlwait, &c) == 0) && c == 27) { io_fbyte(getchid(0), -1, &c); } } } exit(ZE_OK);}/* Access seems to be *always* broken in c68 *//* Not accurate, just works */int access (char *f, int mode){ struct stat st; int fd; if((fd = stat(f, &st)) == 0) { switch(fd) { case F_OK: break; case R_OK: fd = (st.st_mode & 0444) == 0; break; case W_OK: fd = (st.st_mode & 0222) == 0; break; case X_OK: fd = (st.st_mode & 0111) == 0; break; default: fd = -1; break; } } return fd;}/* Fixup a Mickey Mouse file naming system */char * Unix2ql (char *qlname, char **dot){ static char path[64]; char name[64]; char *q, *r, *s; strcpy(name, qlname); if(*name == '~') { r = name+1; getcwd(path, sizeof(path)); q = path + strlen(path); if(*(q-1) != '_') { *q++ = '_'; } } else { q = path; r = name; } if(*r == '/') { r++; } strcpy(q, r); while (*q) { if(*q == '/' || *q == '.') { if(*q == '.' && dot) { *dot = name + (q - path); } *q = '_'; } q++; } return path;}#if 0 /* Not used in ZIP */GuessAltName(char *name, char *dot){ if(dot) { *dot = '.'; } else { if((dot = strrchr(name, '_'))) { *dot = '.'; } }}#endif /* 0 */short devlen(char *p){ char defpath[40]; short deflen = 0, ok = 0; getcwd(defpath, sizeof(defpath)); deflen = strlen(defpath); if(deflen) { if(strnicmp(p, defpath, deflen) == 0) { ok = 1; } } if(!ok) { if(isdirdev(p)) { deflen = 5; } else { deflen = 0; } } return deflen;}char * ql2Unix (char *qlname){ struct stat st; int sts; char *p, *r, *s, *ldp; char *pnam = NULL; static char path[64]; short deflen; char name[64]; strcpy(name, qlname); strcpy(path, name); deflen = devlen(qlname); p = name + deflen; pnam = path + deflen; if(s = strrchr(p, '_')) { *s = 0; sts = stat(name, &st); if(deflen && sts ==0 && (st.st_mode & S_IFDIR)) { *(path+(s-name)) = '/'; } else { *(path+(s-name)) = '.'; } } ldp = p; for(r = p; *r; r++) { if(r != ldp && *r == '_') { *r = 0; if(deflen) { sts = stat(name, &st); } else sts = -1; if(sts ==0 && (st.st_mode & S_IFDIR)) { *(path+(r-name)) = '/'; ldp = r + 1; } else { *(path+(r-name)) = '_'; } *r = '_'; } } return pnam;}char *LastDir(char *ws){ char *p; char *q = ws; struct stat s; for(p = ws; *p; p++) { if(p != ws && *p == '_') { char c; p++; c = *p; *p = 0; if(stat(ws, &s) == 0 && S_ISDIR(s.st_mode)) { q = p; } *p = c; } } return q;}# ifndef UTILstatic int add_dir(char * dnam){ int e = ZE_OK; char *p; short nlen; nlen = strlen(dnam); if(p = malloc(nlen + 2)) { strncpy (p, dnam, nlen); if(*(p+nlen) != '_') { *(p+nlen) = '_'; *(p+nlen+1) = '\0'; } if ((e = newname(p, 1, 0)) != ZE_OK) { free(p); } } else { e = ZE_MEM; } return e;}int qlwild (char *dnam, short dorecurse, short l){ static char match[40] = {0}; static char ddev[8] = {0}; static short nc; static short llen; static char base[40];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -