#define ZIPFILE_BUFFER_SIZE (64*1024)
+
+#define ZIPFILE_EXTRA_TIMESTAMP 0x5455
+
/*
** Set the error message contained in context ctx to the results of
** vprintf(zFmt, ...).
pCsr->iNextOff += pCsr->cds.nComment;
}
- /* Scan the "extra" fields */
+ /* Scan the cds.nExtra bytes of "extra" fields for any that can
+ ** be interpreted. The general format of an extra field is:
+ **
+ ** Header ID 2 bytes
+ ** Data Size 2 bytes
+ ** Data N bytes
+ **
+ */
if( rc==SQLITE_OK ){
u8 *p = &aRead[pCsr->cds.nFile];
u8 *pEnd = &p[pCsr->cds.nExtra];
u16 nByte = zipfileRead16(p);
switch( id ){
- case 0x5455: { /* Extended timestamp */
+ case ZIPFILE_EXTRA_TIMESTAMP: {
u8 b = p[0];
if( b & 0x01 ){ /* 0x01 -> modtime is present */
pCsr->mTime = zipfileGetU32(&p[1]);
}
break;
}
-
- case 0x7875: /* Info-ZIP Unix (new) */
- break;
}
p += nByte;
-C Have\sthe\sshell\stool\s".ar\s--list"\sand\s".ar\s--extract"\scommands\ssupport\szip\nfiles.\sCurrently\sthe\s"-zip"\sswitch\sis\srequired.
-D 2017-12-27T18:54:11.166
+C Improve\sthe\sshell\stool\s".ar\s--list\s--verbose"\scommand.
+D 2017-12-27T21:13:21.423
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in ceb40bfcb30ebba8e1202b34c56ff7e13e112f9809e2381d99be32c2726058f5
F ext/misc/vtablog.c 31d0d8f4406795679dcd3a67917c213d3a2a5fb3ea5de35f6e773491ed7e13c9
F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd
F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212
-F ext/misc/zipfile.c 96148b78b56664fe82f774e50dcdf6c83d693a1449b88011eba00cd6c697fedf
+F ext/misc/zipfile.c ced1aa768904cf8182c3da93d42df4e3cf30fe7a2e66c9216f6bc64a8df4fd5b
F ext/rbu/rbu.c ea7d1b7eb44c123a2a619332e19fe5313500705c4a58aaa1887905c0d83ffc2e
F ext/rbu/rbu1.test 43836fac8c7179a358eaf38a8a1ef3d6e6285842
F ext/rbu/rbu10.test 1846519a438697f45e9dcb246908af81b551c29e1078d0304fae83f1fed7e9ee
F src/resolve.c bbee7e31d369a18a2f4836644769882e9c5d40ef4a3af911db06410b65cb3730
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
F src/select.c 8b22abe193e4d8243befa2038e4ae2405802fed1c446e5e502d11f652e09ba74
-F src/shell.c.in d1be3030ee7afbbfb67972e4614b6d08dcae2e76460114d6b200fd28d0f008fb
+F src/shell.c.in 9177b6cc706b1dd1ed81b05344641597d7ed8bba97a8fc31192309189846fab7
F src/sqlite.h.in 2126192945019d4cdce335cb236b440a05ec75c93e4cd94c9c6d6e7fcc654cc4
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h c02d628cca67f3889c689d82d25c3eb45e2c155db08e4c6089b5840d64687d34
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 8e366b99b13d765d8bf000a7ec5919e582702e51dc07c27a746b6002898a2302
-R 0d0cb33644ad535bd9f83812fd2ec78d
+P a532a0f6fd59e81086d46f09151ba7fb26725198231d902c71d0f95cb01dbe91
+R 7075030d907b0ffe212621eb709bb967
U dan
-Z 54715bdb695d1dc399a9b1cd512f6d24
+Z 1c430e112380037cc2bfad44bf8be92e
-a532a0f6fd59e81086d46f09151ba7fb26725198231d902c71d0f95cb01dbe91
\ No newline at end of file
+b64681a644c419bb98d00980a6cb56ef5a0aff5ef5321955631f0b4c88aac283
\ No newline at end of file
*pzWhere = zWhere;
}
+/*
+** Argument zMode must point to a buffer at least 11 bytes in size. This
+** function populates this buffer with the string interpretation of
+** the unix file mode passed as the second argument (e.g. "drwxr-xr-x").
+*/
+static void shellModeToString(char *zMode, int mode){
+ int i;
+
+ /* Magic numbers copied from [man 2 stat] */
+ if( mode & 0040000 ){
+ zMode[0] = 'd';
+ }else if( (mode & 0120000)==0120000 ){
+ zMode[0] = 'l';
+ }else{
+ zMode[0] = '-';
+ }
+
+ for(i=0; i<3; i++){
+ int m = (mode >> ((2-i)*3));
+ char *a = &zMode[1 + i*3];
+ a[0] = (m & 0x4) ? 'r' : '-';
+ a[1] = (m & 0x2) ? 'w' : '-';
+ a[2] = (m & 0x1) ? 'x' : '-';
+ }
+ zMode[10] = '\0';
+}
+
/*
** Implementation of .ar "lisT" command.
*/
static int arListCommand(ShellState *p, sqlite3 *db, ArCommand *pAr){
- const char *zSql = "SELECT name FROM %s WHERE %s";
+ const char *zSql = "SELECT %s FROM %s WHERE %s";
const char *zTbl = (pAr->bZip ? "zipfile(?)" : "sqlar");
+ const char *azCols[] = {
+ "name",
+ "mode, sz, datetime(mtime, 'unixepoch'), name"
+ };
char *zWhere = 0;
sqlite3_stmt *pSql = 0;
rc = arCheckEntries(db, pAr);
arWhereClause(&rc, pAr, &zWhere);
- shellPreparePrintf(db, &rc, &pSql, zSql, zTbl, zWhere);
+ shellPreparePrintf(db, &rc, &pSql, zSql, azCols[pAr->bVerbose], zTbl, zWhere);
if( rc==SQLITE_OK && pAr->bZip ){
sqlite3_bind_text(pSql, 1, pAr->zFile, -1, SQLITE_TRANSIENT);
}
while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
- raw_printf(p->out, "%s\n", sqlite3_column_text(pSql, 0));
+ if( pAr->bVerbose ){
+ char zMode[11];
+ shellModeToString(zMode, sqlite3_column_int(pSql, 0));
+
+ raw_printf(p->out, "%s % 10d %s %s\n", zMode,
+ sqlite3_column_int(pSql, 1),
+ sqlite3_column_text(pSql, 2),
+ sqlite3_column_text(pSql, 3)
+ );
+ }else{
+ raw_printf(p->out, "%s\n", sqlite3_column_text(pSql, 0));
+ }
}
shellFinalize(&rc, pSql);