Changeset 391 for python/trunk/Modules/zipimport.c
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Modules/zipimport.c
r2 r391 11 11 12 12 struct st_zip_searchorder { 13 14 13 char suffix[14]; 14 int type; 15 15 }; 16 16 … … 21 21 '/' is replaced by SEP there. */ 22 22 static struct st_zip_searchorder zip_searchorder[] = { 23 24 25 26 27 28 29 23 {"/__init__.pyc", IS_PACKAGE | IS_BYTECODE}, 24 {"/__init__.pyo", IS_PACKAGE | IS_BYTECODE}, 25 {"/__init__.py", IS_PACKAGE | IS_SOURCE}, 26 {".pyc", IS_BYTECODE}, 27 {".pyo", IS_BYTECODE}, 28 {".py", IS_SOURCE}, 29 {"", 0} 30 30 }; 31 31 … … 35 35 36 36 struct _zipimporter { 37 38 39 40 37 PyObject_HEAD 38 PyObject *archive; /* pathname of the Zip archive */ 39 PyObject *prefix; /* file prefix: "a/sub/directory/" */ 40 PyObject *files; /* dict with file info {path: toc_entry} */ 41 41 }; 42 42 … … 48 48 static PyObject *get_data(char *archive, PyObject *toc_entry); 49 49 static PyObject *get_module_code(ZipImporter *self, char *fullname, 50 50 int *p_ispackage, char **p_modpath); 51 51 52 52 … … 61 61 zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds) 62 62 { 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 63 char *path, *p, *prefix, buf[MAXPATHLEN+2]; 64 size_t len; 65 66 if (!_PyArg_NoKeywords("zipimporter()", kwds)) 67 return -1; 68 69 if (!PyArg_ParseTuple(args, "s:zipimporter", 70 &path)) 71 return -1; 72 73 len = strlen(path); 74 if (len == 0) { 75 PyErr_SetString(ZipImportError, "archive path is empty"); 76 return -1; 77 } 78 if (len >= MAXPATHLEN) { 79 PyErr_SetString(ZipImportError, 80 "archive path too long"); 81 return -1; 82 } 83 strcpy(buf, path); 84 84 85 85 #ifdef ALTSEP 86 87 88 89 86 for (p = buf; *p; p++) { 87 if (*p == ALTSEP) 88 *p = SEP; 89 } 90 90 #endif 91 91 92 93 94 92 path = NULL; 93 prefix = NULL; 94 for (;;) { 95 95 #ifndef RISCOS 96 97 98 99 100 101 102 103 104 105 106 96 struct stat statbuf; 97 int rv; 98 99 rv = stat(buf, &statbuf); 100 if (rv == 0) { 101 /* it exists */ 102 if (S_ISREG(statbuf.st_mode)) 103 /* it's a file */ 104 path = buf; 105 break; 106 } 107 107 #else 108 109 110 111 112 113 114 108 if (object_exists(buf)) { 109 /* it exists */ 110 if (isfile(buf)) 111 /* it's a file */ 112 path = buf; 113 break; 114 } 115 115 #endif 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 116 /* back up one path element */ 117 p = strrchr(buf, SEP); 118 if (prefix != NULL) 119 *prefix = SEP; 120 if (p == NULL) 121 break; 122 *p = '\0'; 123 prefix = p; 124 } 125 if (path != NULL) { 126 PyObject *files; 127 files = PyDict_GetItemString(zip_directory_cache, path); 128 if (files == NULL) { 129 files = read_directory(buf); 130 if (files == NULL) 131 return -1; 132 if (PyDict_SetItemString(zip_directory_cache, path, 133 files) != 0) 134 return -1; 135 } 136 else 137 Py_INCREF(files); 138 self->files = files; 139 } 140 else { 141 PyErr_SetString(ZipImportError, "not a Zip file"); 142 return -1; 143 } 144 145 if (prefix == NULL) 146 prefix = ""; 147 else { 148 prefix++; 149 len = strlen(prefix); 150 if (prefix[len-1] != SEP) { 151 /* add trailing SEP */ 152 prefix[len] = SEP; 153 prefix[len + 1] = '\0'; 154 } 155 } 156 157 self->archive = PyString_FromString(buf); 158 if (self->archive == NULL) 159 return -1; 160 161 self->prefix = PyString_FromString(prefix); 162 if (self->prefix == NULL) 163 return -1; 164 165 return 0; 166 166 } 167 167 … … 170 170 zipimporter_traverse(PyObject *obj, visitproc visit, void *arg) 171 171 { 172 173 174 172 ZipImporter *self = (ZipImporter *)obj; 173 Py_VISIT(self->files); 174 return 0; 175 175 } 176 176 … … 178 178 zipimporter_dealloc(ZipImporter *self) 179 179 { 180 181 182 183 184 180 PyObject_GC_UnTrack(self); 181 Py_XDECREF(self->archive); 182 Py_XDECREF(self->prefix); 183 Py_XDECREF(self->files); 184 Py_TYPE(self)->tp_free((PyObject *)self); 185 185 } 186 186 … … 188 188 zipimporter_repr(ZipImporter *self) 189 189 { 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 190 char buf[500]; 191 char *archive = "???"; 192 char *prefix = ""; 193 194 if (self->archive != NULL && PyString_Check(self->archive)) 195 archive = PyString_AsString(self->archive); 196 if (self->prefix != NULL && PyString_Check(self->prefix)) 197 prefix = PyString_AsString(self->prefix); 198 if (prefix != NULL && *prefix) 199 PyOS_snprintf(buf, sizeof(buf), 200 "<zipimporter object \"%.300s%c%.150s\">", 201 archive, SEP, prefix); 202 else 203 PyOS_snprintf(buf, sizeof(buf), 204 "<zipimporter object \"%.300s\">", 205 archive); 206 return PyString_FromString(buf); 207 207 } 208 208 … … 211 211 get_subname(char *fullname) 212 212 { 213 214 215 216 217 218 213 char *subname = strrchr(fullname, '.'); 214 if (subname == NULL) 215 subname = fullname; 216 else 217 subname++; 218 return subname; 219 219 } 220 220 … … 225 225 make_filename(char *prefix, char *name, char *path) 226 226 { 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 227 size_t len; 228 char *p; 229 230 len = strlen(prefix); 231 232 /* self.prefix + name [+ SEP + "__init__"] + ".py[co]" */ 233 if (len + strlen(name) + 13 >= MAXPATHLEN) { 234 PyErr_SetString(ZipImportError, "path too long"); 235 return -1; 236 } 237 238 strcpy(path, prefix); 239 strcpy(path + len, name); 240 for (p = path + len; *p; p++) { 241 if (*p == '.') 242 *p = SEP; 243 } 244 len += strlen(name); 245 assert(len < INT_MAX); 246 return (int)len; 247 247 } 248 248 249 249 enum zi_module_info { 250 251 252 253 250 MI_ERROR, 251 MI_NOT_FOUND, 252 MI_MODULE, 253 MI_PACKAGE 254 254 }; 255 255 … … 258 258 get_module_info(ZipImporter *self, char *fullname) 259 259 { 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 260 char *subname, path[MAXPATHLEN + 1]; 261 int len; 262 struct st_zip_searchorder *zso; 263 264 subname = get_subname(fullname); 265 266 len = make_filename(PyString_AsString(self->prefix), subname, path); 267 if (len < 0) 268 return MI_ERROR; 269 270 for (zso = zip_searchorder; *zso->suffix; zso++) { 271 strcpy(path + len, zso->suffix); 272 if (PyDict_GetItemString(self->files, path) != NULL) { 273 if (zso->type & IS_PACKAGE) 274 return MI_PACKAGE; 275 else 276 return MI_MODULE; 277 } 278 } 279 return MI_NOT_FOUND; 280 280 } 281 281 … … 285 285 zipimporter_find_module(PyObject *obj, PyObject *args) 286 286 { 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 287 ZipImporter *self = (ZipImporter *)obj; 288 PyObject *path = NULL; 289 char *fullname; 290 enum zi_module_info mi; 291 292 if (!PyArg_ParseTuple(args, "s|O:zipimporter.find_module", 293 &fullname, &path)) 294 return NULL; 295 296 mi = get_module_info(self, fullname); 297 if (mi == MI_ERROR) 298 return NULL; 299 if (mi == MI_NOT_FOUND) { 300 Py_INCREF(Py_None); 301 return Py_None; 302 } 303 Py_INCREF(self); 304 return (PyObject *)self; 305 305 } 306 306 … … 309 309 zipimporter_load_module(PyObject *obj, PyObject *args) 310 310 { 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 311 ZipImporter *self = (ZipImporter *)obj; 312 PyObject *code, *mod, *dict; 313 char *fullname, *modpath; 314 int ispackage; 315 316 if (!PyArg_ParseTuple(args, "s:zipimporter.load_module", 317 &fullname)) 318 return NULL; 319 320 code = get_module_code(self, fullname, &ispackage, &modpath); 321 if (code == NULL) 322 return NULL; 323 324 mod = PyImport_AddModule(fullname); 325 if (mod == NULL) { 326 Py_DECREF(code); 327 return NULL; 328 } 329 dict = PyModule_GetDict(mod); 330 331 /* mod.__loader__ = self */ 332 if (PyDict_SetItemString(dict, "__loader__", (PyObject *)self) != 0) 333 goto error; 334 335 if (ispackage) { 336 /* add __path__ to the module *before* the code gets 337 executed */ 338 PyObject *pkgpath, *fullpath; 339 char *prefix = PyString_AsString(self->prefix); 340 char *subname = get_subname(fullname); 341 int err; 342 343 fullpath = PyString_FromFormat("%s%c%s%s", 344 PyString_AsString(self->archive), 345 SEP, 346 *prefix ? prefix : "", 347 subname); 348 if (fullpath == NULL) 349 goto error; 350 351 pkgpath = Py_BuildValue("[O]", fullpath); 352 Py_DECREF(fullpath); 353 if (pkgpath == NULL) 354 goto error; 355 err = PyDict_SetItemString(dict, "__path__", pkgpath); 356 Py_DECREF(pkgpath); 357 if (err != 0) 358 goto error; 359 } 360 mod = PyImport_ExecCodeModuleEx(fullname, code, modpath); 361 Py_DECREF(code); 362 if (Py_VerboseFlag) 363 PySys_WriteStderr("import %s # loaded from Zip %s\n", 364 fullname, modpath); 365 return mod; 366 366 error: 367 368 369 367 Py_DECREF(code); 368 Py_DECREF(mod); 369 return NULL; 370 370 } 371 371 … … 379 379 int ispackage; 380 380 381 if (!PyArg_ParseTuple(args, "s:zipimporter. _get_filename",381 if (!PyArg_ParseTuple(args, "s:zipimporter.get_filename", 382 382 &fullname)) 383 383 return NULL; 384 384 385 385 /* Deciding the filename requires working out where the code … … 387 387 code = get_module_code(self, fullname, &ispackage, &modpath); 388 388 if (code == NULL) 389 389 return NULL; 390 390 Py_DECREF(code); /* Only need the path info */ 391 391 … … 397 397 zipimporter_is_package(PyObject *obj, PyObject *args) 398 398 { 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 399 ZipImporter *self = (ZipImporter *)obj; 400 char *fullname; 401 enum zi_module_info mi; 402 403 if (!PyArg_ParseTuple(args, "s:zipimporter.is_package", 404 &fullname)) 405 return NULL; 406 407 mi = get_module_info(self, fullname); 408 if (mi == MI_ERROR) 409 return NULL; 410 if (mi == MI_NOT_FOUND) { 411 PyErr_Format(ZipImportError, "can't find module '%.200s'", 412 fullname); 413 return NULL; 414 } 415 return PyBool_FromLong(mi == MI_PACKAGE); 416 416 } 417 417 … … 419 419 zipimporter_get_data(PyObject *obj, PyObject *args) 420 420 { 421 422 421 ZipImporter *self = (ZipImporter *)obj; 422 char *path; 423 423 #ifdef ALTSEP 424 424 char *p, buf[MAXPATHLEN + 1]; 425 425 #endif 426 427 428 429 430 426 PyObject *toc_entry; 427 Py_ssize_t len; 428 429 if (!PyArg_ParseTuple(args, "s:zipimporter.get_data", &path)) 430 return NULL; 431 431 432 432 #ifdef ALTSEP 433 434 435 436 437 438 439 440 441 442 433 if (strlen(path) >= MAXPATHLEN) { 434 PyErr_SetString(ZipImportError, "path too long"); 435 return NULL; 436 } 437 strcpy(buf, path); 438 for (p = buf; *p; p++) { 439 if (*p == ALTSEP) 440 *p = SEP; 441 } 442 path = buf; 443 443 #endif 444 445 446 447 448 449 450 451 452 453 454 455 456 444 len = PyString_Size(self->archive); 445 if ((size_t)len < strlen(path) && 446 strncmp(path, PyString_AsString(self->archive), len) == 0 && 447 path[len] == SEP) { 448 path = path + len + 1; 449 } 450 451 toc_entry = PyDict_GetItemString(self->files, path); 452 if (toc_entry == NULL) { 453 PyErr_SetFromErrnoWithFilename(PyExc_IOError, path); 454 return NULL; 455 } 456 return get_data(PyString_AsString(self->archive), toc_entry); 457 457 } 458 458 … … 460 460 zipimporter_get_code(PyObject *obj, PyObject *args) 461 461 { 462 463 464 465 466 467 468 462 ZipImporter *self = (ZipImporter *)obj; 463 char *fullname; 464 465 if (!PyArg_ParseTuple(args, "s:zipimporter.get_code", &fullname)) 466 return NULL; 467 468 return get_module_code(self, fullname, NULL, NULL); 469 469 } 470 470 … … 472 472 zipimporter_get_source(PyObject *obj, PyObject *args) 473 473 { 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 474 ZipImporter *self = (ZipImporter *)obj; 475 PyObject *toc_entry; 476 char *fullname, *subname, path[MAXPATHLEN+1]; 477 int len; 478 enum zi_module_info mi; 479 480 if (!PyArg_ParseTuple(args, "s:zipimporter.get_source", &fullname)) 481 return NULL; 482 483 mi = get_module_info(self, fullname); 484 if (mi == MI_ERROR) 485 return NULL; 486 if (mi == MI_NOT_FOUND) { 487 PyErr_Format(ZipImportError, "can't find module '%.200s'", 488 fullname); 489 return NULL; 490 } 491 subname = get_subname(fullname); 492 493 len = make_filename(PyString_AsString(self->prefix), subname, path); 494 if (len < 0) 495 return NULL; 496 497 if (mi == MI_PACKAGE) { 498 path[len] = SEP; 499 strcpy(path + len + 1, "__init__.py"); 500 } 501 else 502 strcpy(path + len, ".py"); 503 504 toc_entry = PyDict_GetItemString(self->files, path); 505 if (toc_entry != NULL) 506 return get_data(PyString_AsString(self->archive), toc_entry); 507 508 /* we have the module, but no source */ 509 Py_INCREF(Py_None); 510 return Py_None; 511 511 } 512 512 … … 537 537 \n\ 538 538 Return True if the module specified by fullname is a package.\n\ 539 Raise ZipImportError i sthe module couldn't be found.");539 Raise ZipImportError if the module couldn't be found."); 540 540 541 541 PyDoc_STRVAR(doc_get_code, … … 543 543 \n\ 544 544 Return the code object for the specified module. Raise ZipImportError\n\ 545 i sthe module couldn't be found.");545 if the module couldn't be found."); 546 546 547 547 PyDoc_STRVAR(doc_get_source, … … 549 549 \n\ 550 550 Return the source code for the specified module. Raise ZipImportError\n\ 551 i sthe module couldn't be found, return None if the archive does\n\551 if the module couldn't be found, return None if the archive does\n\ 552 552 contain the module, but has no source for it."); 553 553 554 554 555 555 PyDoc_STRVAR(doc_get_filename, 556 " _get_filename(fullname) -> filename string.\n\556 "get_filename(fullname) -> filename string.\n\ 557 557 \n\ 558 558 Return the filename for the specified module."); 559 559 560 560 static PyMethodDef zipimporter_methods[] = { 561 562 563 564 565 566 567 568 569 570 571 {"_get_filename", zipimporter_get_filename, METH_VARARGS,572 573 574 575 {NULL, NULL}/* sentinel */561 {"find_module", zipimporter_find_module, METH_VARARGS, 562 doc_find_module}, 563 {"load_module", zipimporter_load_module, METH_VARARGS, 564 doc_load_module}, 565 {"get_data", zipimporter_get_data, METH_VARARGS, 566 doc_get_data}, 567 {"get_code", zipimporter_get_code, METH_VARARGS, 568 doc_get_code}, 569 {"get_source", zipimporter_get_source, METH_VARARGS, 570 doc_get_source}, 571 {"get_filename", zipimporter_get_filename, METH_VARARGS, 572 doc_get_filename}, 573 {"is_package", zipimporter_is_package, METH_VARARGS, 574 doc_is_package}, 575 {NULL, NULL} /* sentinel */ 576 576 }; 577 577 578 578 static PyMemberDef zipimporter_members[] = { 579 580 581 582 579 {"archive", T_OBJECT, offsetof(ZipImporter, archive), READONLY}, 580 {"prefix", T_OBJECT, offsetof(ZipImporter, prefix), READONLY}, 581 {"_files", T_OBJECT, offsetof(ZipImporter, files), READONLY}, 582 {NULL} 583 583 }; 584 584 … … 600 600 601 601 static PyTypeObject ZipImporter_Type = { 602 603 604 605 0,/* tp_itemsize */606 (destructor)zipimporter_dealloc,/* tp_dealloc */607 0,/* tp_print */608 0,/* tp_getattr */609 0,/* tp_setattr */610 0,/* tp_compare */611 (reprfunc)zipimporter_repr,/* tp_repr */612 0,/* tp_as_number */613 0,/* tp_as_sequence */614 0,/* tp_as_mapping */615 0,/* tp_hash */616 0,/* tp_call */617 0,/* tp_str */618 PyObject_GenericGetAttr,/* tp_getattro */619 0,/* tp_setattro */620 0,/* tp_as_buffer */621 622 Py_TPFLAGS_HAVE_GC,/* tp_flags */623 zipimporter_doc,/* tp_doc */624 zipimporter_traverse,/* tp_traverse */625 0,/* tp_clear */626 0,/* tp_richcompare */627 0,/* tp_weaklistoffset */628 0,/* tp_iter */629 0,/* tp_iternext */630 zipimporter_methods,/* tp_methods */631 zipimporter_members,/* tp_members */632 0,/* tp_getset */633 0,/* tp_base */634 0,/* tp_dict */635 0,/* tp_descr_get */636 0,/* tp_descr_set */637 0,/* tp_dictoffset */638 (initproc)zipimporter_init,/* tp_init */639 PyType_GenericAlloc,/* tp_alloc */640 PyType_GenericNew,/* tp_new */641 PyObject_GC_Del,/* tp_free */602 PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0) 603 "zipimport.zipimporter", 604 sizeof(ZipImporter), 605 0, /* tp_itemsize */ 606 (destructor)zipimporter_dealloc, /* tp_dealloc */ 607 0, /* tp_print */ 608 0, /* tp_getattr */ 609 0, /* tp_setattr */ 610 0, /* tp_compare */ 611 (reprfunc)zipimporter_repr, /* tp_repr */ 612 0, /* tp_as_number */ 613 0, /* tp_as_sequence */ 614 0, /* tp_as_mapping */ 615 0, /* tp_hash */ 616 0, /* tp_call */ 617 0, /* tp_str */ 618 PyObject_GenericGetAttr, /* tp_getattro */ 619 0, /* tp_setattro */ 620 0, /* tp_as_buffer */ 621 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | 622 Py_TPFLAGS_HAVE_GC, /* tp_flags */ 623 zipimporter_doc, /* tp_doc */ 624 zipimporter_traverse, /* tp_traverse */ 625 0, /* tp_clear */ 626 0, /* tp_richcompare */ 627 0, /* tp_weaklistoffset */ 628 0, /* tp_iter */ 629 0, /* tp_iternext */ 630 zipimporter_methods, /* tp_methods */ 631 zipimporter_members, /* tp_members */ 632 0, /* tp_getset */ 633 0, /* tp_base */ 634 0, /* tp_dict */ 635 0, /* tp_descr_get */ 636 0, /* tp_descr_set */ 637 0, /* tp_dictoffset */ 638 (initproc)zipimporter_init, /* tp_init */ 639 PyType_GenericAlloc, /* tp_alloc */ 640 PyType_GenericNew, /* tp_new */ 641 PyObject_GC_Del, /* tp_free */ 642 642 }; 643 643 … … 650 650 static long 651 651 get_long(unsigned char *buf) { 652 653 654 655 656 652 long x; 653 x = buf[0]; 654 x |= (long)buf[1] << 8; 655 x |= (long)buf[2] << 16; 656 x |= (long)buf[3] << 24; 657 657 #if SIZEOF_LONG > 4 658 659 658 /* Sign extension for 64-bit machines */ 659 x |= -(x & 0x80000000L); 660 660 #endif 661 661 return x; 662 662 } 663 663 … … 671 671 672 672 (__file__, # value to use for __file__, available for all files 673 674 675 676 677 678 679 673 compress, # compression kind; 0 for uncompressed 674 data_size, # size of compressed data on disk 675 file_size, # size of decompressed data 676 file_offset, # offset of file header from start of archive 677 time, # mod time of file (in dos format) 678 date, # mod data of file (in dos format) 679 crc, # crc checksum of the data 680 680 ) 681 681 … … 686 686 read_directory(char *archive) 687 687 { 688 PyObject *files = NULL; 689 FILE *fp; 690 long compress, crc, data_size, file_size, file_offset, date, time; 691 long header_offset, name_size, header_size, header_position; 692 long i, l, count; 693 size_t length; 694 char path[MAXPATHLEN + 5]; 695 char name[MAXPATHLEN + 5]; 696 char *p, endof_central_dir[22]; 697 long arc_offset; /* offset from beginning of file to start of zip-archive */ 698 699 if (strlen(archive) > MAXPATHLEN) { 700 PyErr_SetString(PyExc_OverflowError, 701 "Zip path name is too long"); 702 return NULL; 703 } 704 strcpy(path, archive); 705 706 fp = fopen(archive, "rb"); 707 if (fp == NULL) { 708 PyErr_Format(ZipImportError, "can't open Zip file: " 709 "'%.200s'", archive); 710 return NULL; 711 } 712 fseek(fp, -22, SEEK_END); 713 header_position = ftell(fp); 714 if (fread(endof_central_dir, 1, 22, fp) != 22) { 715 fclose(fp); 716 PyErr_Format(ZipImportError, "can't read Zip file: " 717 "'%.200s'", archive); 718 return NULL; 719 } 720 if (get_long((unsigned char *)endof_central_dir) != 0x06054B50) { 721 /* Bad: End of Central Dir signature */ 722 fclose(fp); 723 PyErr_Format(ZipImportError, "not a Zip file: " 724 "'%.200s'", archive); 725 return NULL; 726 } 727 728 header_size = get_long((unsigned char *)endof_central_dir + 12); 729 header_offset = get_long((unsigned char *)endof_central_dir + 16); 730 arc_offset = header_position - header_offset - header_size; 731 header_offset += arc_offset; 732 733 files = PyDict_New(); 734 if (files == NULL) 735 goto error; 736 737 length = (long)strlen(path); 738 path[length] = SEP; 739 740 /* Start of Central Directory */ 741 count = 0; 742 for (;;) { 743 PyObject *t; 744 int err; 745 746 fseek(fp, header_offset, 0); /* Start of file header */ 747 l = PyMarshal_ReadLongFromFile(fp); 748 if (l != 0x02014B50) 749 break; /* Bad: Central Dir File Header */ 750 fseek(fp, header_offset + 10, 0); 751 compress = PyMarshal_ReadShortFromFile(fp); 752 time = PyMarshal_ReadShortFromFile(fp); 753 date = PyMarshal_ReadShortFromFile(fp); 754 crc = PyMarshal_ReadLongFromFile(fp); 755 data_size = PyMarshal_ReadLongFromFile(fp); 756 file_size = PyMarshal_ReadLongFromFile(fp); 757 name_size = PyMarshal_ReadShortFromFile(fp); 758 header_size = 46 + name_size + 759 PyMarshal_ReadShortFromFile(fp) + 760 PyMarshal_ReadShortFromFile(fp); 761 fseek(fp, header_offset + 42, 0); 762 file_offset = PyMarshal_ReadLongFromFile(fp) + arc_offset; 763 if (name_size > MAXPATHLEN) 764 name_size = MAXPATHLEN; 765 766 p = name; 767 for (i = 0; i < name_size; i++) { 768 *p = (char)getc(fp); 769 if (*p == '/') 770 *p = SEP; 771 p++; 772 } 773 *p = 0; /* Add terminating null byte */ 774 header_offset += header_size; 775 776 strncpy(path + length + 1, name, MAXPATHLEN - length - 1); 777 778 t = Py_BuildValue("siiiiiii", path, compress, data_size, 779 file_size, file_offset, time, date, crc); 780 if (t == NULL) 781 goto error; 782 err = PyDict_SetItemString(files, name, t); 783 Py_DECREF(t); 784 if (err != 0) 785 goto error; 786 count++; 787 } 788 fclose(fp); 789 if (Py_VerboseFlag) 790 PySys_WriteStderr("# zipimport: found %ld names in %s\n", 791 count, archive); 792 return files; 688 PyObject *files = NULL; 689 FILE *fp; 690 long compress, crc, data_size, file_size, file_offset, date, time; 691 long header_offset, name_size, header_size, header_position; 692 long i, l, count; 693 size_t length; 694 char path[MAXPATHLEN + 5]; 695 char name[MAXPATHLEN + 5]; 696 char *p, endof_central_dir[22]; 697 long arc_offset; /* offset from beginning of file to start of zip-archive */ 698 699 if (strlen(archive) > MAXPATHLEN) { 700 PyErr_SetString(PyExc_OverflowError, 701 "Zip path name is too long"); 702 return NULL; 703 } 704 strcpy(path, archive); 705 706 fp = fopen(archive, "rb"); 707 if (fp == NULL) { 708 PyErr_Format(ZipImportError, "can't open Zip file: " 709 "'%.200s'", archive); 710 return NULL; 711 } 712 713 if (fseek(fp, -22, SEEK_END) == -1) { 714 fclose(fp); 715 PyErr_Format(ZipImportError, "can't read Zip file: %s", archive); 716 return NULL; 717 } 718 header_position = ftell(fp); 719 if (fread(endof_central_dir, 1, 22, fp) != 22) { 720 fclose(fp); 721 PyErr_Format(ZipImportError, "can't read Zip file: " 722 "'%.200s'", archive); 723 return NULL; 724 } 725 if (get_long((unsigned char *)endof_central_dir) != 0x06054B50) { 726 /* Bad: End of Central Dir signature */ 727 fclose(fp); 728 PyErr_Format(ZipImportError, "not a Zip file: " 729 "'%.200s'", archive); 730 return NULL; 731 } 732 733 header_size = get_long((unsigned char *)endof_central_dir + 12); 734 header_offset = get_long((unsigned char *)endof_central_dir + 16); 735 arc_offset = header_position - header_offset - header_size; 736 header_offset += arc_offset; 737 738 files = PyDict_New(); 739 if (files == NULL) 740 goto error; 741 742 length = (long)strlen(path); 743 path[length] = SEP; 744 745 /* Start of Central Directory */ 746 count = 0; 747 for (;;) { 748 PyObject *t; 749 int err; 750 751 if (fseek(fp, header_offset, 0) == -1) /* Start of file header */ 752 goto fseek_error; 753 l = PyMarshal_ReadLongFromFile(fp); 754 if (l != 0x02014B50) 755 break; /* Bad: Central Dir File Header */ 756 if (fseek(fp, header_offset + 10, 0) == -1) 757 goto fseek_error; 758 compress = PyMarshal_ReadShortFromFile(fp); 759 time = PyMarshal_ReadShortFromFile(fp); 760 date = PyMarshal_ReadShortFromFile(fp); 761 crc = PyMarshal_ReadLongFromFile(fp); 762 data_size = PyMarshal_ReadLongFromFile(fp); 763 file_size = PyMarshal_ReadLongFromFile(fp); 764 name_size = PyMarshal_ReadShortFromFile(fp); 765 header_size = 46 + name_size + 766 PyMarshal_ReadShortFromFile(fp) + 767 PyMarshal_ReadShortFromFile(fp); 768 if (fseek(fp, header_offset + 42, 0) == -1) 769 goto fseek_error; 770 file_offset = PyMarshal_ReadLongFromFile(fp) + arc_offset; 771 if (name_size > MAXPATHLEN) 772 name_size = MAXPATHLEN; 773 774 p = name; 775 for (i = 0; i < name_size; i++) { 776 *p = (char)getc(fp); 777 if (*p == '/') 778 *p = SEP; 779 p++; 780 } 781 *p = 0; /* Add terminating null byte */ 782 header_offset += header_size; 783 784 strncpy(path + length + 1, name, MAXPATHLEN - length - 1); 785 786 t = Py_BuildValue("siiiiiii", path, compress, data_size, 787 file_size, file_offset, time, date, crc); 788 if (t == NULL) 789 goto error; 790 err = PyDict_SetItemString(files, name, t); 791 Py_DECREF(t); 792 if (err != 0) 793 goto error; 794 count++; 795 } 796 fclose(fp); 797 if (Py_VerboseFlag) 798 PySys_WriteStderr("# zipimport: found %ld names in %s\n", 799 count, archive); 800 return files; 801 fseek_error: 802 fclose(fp); 803 Py_XDECREF(files); 804 PyErr_Format(ZipImportError, "can't read Zip file: %s", archive); 805 return NULL; 793 806 error: 794 795 796 807 fclose(fp); 808 Py_XDECREF(files); 809 return NULL; 797 810 } 798 811 799 812 /* Return the zlib.decompress function object, or NULL if zlib couldn't 800 813 be imported. The function is cached when found, so subsequent calls 801 don't import zlib again. Returns a *borrowed* reference. 802 XXX This makes zlib.decompress immortal. */ 814 don't import zlib again. */ 803 815 static PyObject * 804 816 get_decompress_func(void) 805 817 { 806 static PyObject *decompress = NULL; 807 808 if (decompress == NULL) { 809 PyObject *zlib; 810 static int importing_zlib = 0; 811 812 if (importing_zlib != 0) 813 /* Someone has a zlib.py[co] in their Zip file; 814 let's avoid a stack overflow. */ 815 return NULL; 816 importing_zlib = 1; 817 zlib = PyImport_ImportModuleNoBlock("zlib"); 818 importing_zlib = 0; 819 if (zlib != NULL) { 820 decompress = PyObject_GetAttrString(zlib, 821 "decompress"); 822 Py_DECREF(zlib); 823 } 824 else 825 PyErr_Clear(); 826 if (Py_VerboseFlag) 827 PySys_WriteStderr("# zipimport: zlib %s\n", 828 zlib != NULL ? "available": "UNAVAILABLE"); 829 } 830 return decompress; 818 static int importing_zlib = 0; 819 PyObject *zlib; 820 PyObject *decompress; 821 822 if (importing_zlib != 0) 823 /* Someone has a zlib.py[co] in their Zip file; 824 let's avoid a stack overflow. */ 825 return NULL; 826 importing_zlib = 1; 827 zlib = PyImport_ImportModuleNoBlock("zlib"); 828 importing_zlib = 0; 829 if (zlib != NULL) { 830 decompress = PyObject_GetAttrString(zlib, 831 "decompress"); 832 Py_DECREF(zlib); 833 } 834 else { 835 PyErr_Clear(); 836 decompress = NULL; 837 } 838 if (Py_VerboseFlag) 839 PySys_WriteStderr("# zipimport: zlib %s\n", 840 zlib != NULL ? "available": "UNAVAILABLE"); 841 return decompress; 831 842 } 832 843 … … 836 847 get_data(char *archive, PyObject *toc_entry) 837 848 { 838 PyObject *raw_data, *data = NULL, *decompress; 839 char *buf; 840 FILE *fp; 841 int err; 842 Py_ssize_t bytes_read = 0; 843 long l; 844 char *datapath; 845 long compress, data_size, file_size, file_offset; 846 long time, date, crc; 847 848 if (!PyArg_ParseTuple(toc_entry, "slllllll", &datapath, &compress, 849 &data_size, &file_size, &file_offset, &time, 850 &date, &crc)) { 851 return NULL; 852 } 853 854 fp = fopen(archive, "rb"); 855 if (!fp) { 856 PyErr_Format(PyExc_IOError, 857 "zipimport: can not open file %s", archive); 858 return NULL; 859 } 860 861 /* Check to make sure the local file header is correct */ 862 fseek(fp, file_offset, 0); 863 l = PyMarshal_ReadLongFromFile(fp); 864 if (l != 0x04034B50) { 865 /* Bad: Local File Header */ 866 PyErr_Format(ZipImportError, 867 "bad local file header in %s", 868 archive); 869 fclose(fp); 870 return NULL; 871 } 872 fseek(fp, file_offset + 26, 0); 873 l = 30 + PyMarshal_ReadShortFromFile(fp) + 874 PyMarshal_ReadShortFromFile(fp); /* local header size */ 875 file_offset += l; /* Start of file data */ 876 877 raw_data = PyString_FromStringAndSize((char *)NULL, compress == 0 ? 878 data_size : data_size + 1); 879 if (raw_data == NULL) { 880 fclose(fp); 881 return NULL; 882 } 883 buf = PyString_AsString(raw_data); 884 885 err = fseek(fp, file_offset, 0); 886 if (err == 0) 887 bytes_read = fread(buf, 1, data_size, fp); 888 fclose(fp); 889 if (err || bytes_read != data_size) { 890 PyErr_SetString(PyExc_IOError, 891 "zipimport: can't read data"); 892 Py_DECREF(raw_data); 893 return NULL; 894 } 895 896 if (compress != 0) { 897 buf[data_size] = 'Z'; /* saw this in zipfile.py */ 898 data_size++; 899 } 900 buf[data_size] = '\0'; 901 902 if (compress == 0) /* data is not compressed */ 903 return raw_data; 904 905 /* Decompress with zlib */ 906 decompress = get_decompress_func(); 907 if (decompress == NULL) { 908 PyErr_SetString(ZipImportError, 909 "can't decompress data; " 910 "zlib not available"); 911 goto error; 912 } 913 data = PyObject_CallFunction(decompress, "Oi", raw_data, -15); 849 PyObject *raw_data, *data = NULL, *decompress; 850 char *buf; 851 FILE *fp; 852 int err; 853 Py_ssize_t bytes_read = 0; 854 long l; 855 char *datapath; 856 long compress, data_size, file_size, file_offset; 857 long time, date, crc; 858 859 if (!PyArg_ParseTuple(toc_entry, "slllllll", &datapath, &compress, 860 &data_size, &file_size, &file_offset, &time, 861 &date, &crc)) { 862 return NULL; 863 } 864 865 fp = fopen(archive, "rb"); 866 if (!fp) { 867 PyErr_Format(PyExc_IOError, 868 "zipimport: can not open file %s", archive); 869 return NULL; 870 } 871 872 /* Check to make sure the local file header is correct */ 873 if (fseek(fp, file_offset, 0) == -1) { 874 fclose(fp); 875 PyErr_Format(ZipImportError, "can't read Zip file: %s", archive); 876 return NULL; 877 } 878 879 l = PyMarshal_ReadLongFromFile(fp); 880 if (l != 0x04034B50) { 881 /* Bad: Local File Header */ 882 PyErr_Format(ZipImportError, 883 "bad local file header in %s", 884 archive); 885 fclose(fp); 886 return NULL; 887 } 888 if (fseek(fp, file_offset + 26, 0) == -1) { 889 fclose(fp); 890 PyErr_Format(ZipImportError, "can't read Zip file: %s", archive); 891 return NULL; 892 } 893 894 l = 30 + PyMarshal_ReadShortFromFile(fp) + 895 PyMarshal_ReadShortFromFile(fp); /* local header size */ 896 file_offset += l; /* Start of file data */ 897 898 raw_data = PyString_FromStringAndSize((char *)NULL, compress == 0 ? 899 data_size : data_size + 1); 900 if (raw_data == NULL) { 901 fclose(fp); 902 return NULL; 903 } 904 buf = PyString_AsString(raw_data); 905 906 err = fseek(fp, file_offset, 0); 907 if (err == 0) { 908 bytes_read = fread(buf, 1, data_size, fp); 909 } else { 910 fclose(fp); 911 PyErr_Format(ZipImportError, "can't read Zip file: %s", archive); 912 return NULL; 913 } 914 fclose(fp); 915 if (err || bytes_read != data_size) { 916 PyErr_SetString(PyExc_IOError, 917 "zipimport: can't read data"); 918 Py_DECREF(raw_data); 919 return NULL; 920 } 921 922 if (compress != 0) { 923 buf[data_size] = 'Z'; /* saw this in zipfile.py */ 924 data_size++; 925 } 926 buf[data_size] = '\0'; 927 928 if (compress == 0) /* data is not compressed */ 929 return raw_data; 930 931 /* Decompress with zlib */ 932 decompress = get_decompress_func(); 933 if (decompress == NULL) { 934 PyErr_SetString(ZipImportError, 935 "can't decompress data; " 936 "zlib not available"); 937 goto error; 938 } 939 data = PyObject_CallFunction(decompress, "Oi", raw_data, -15); 940 Py_DECREF(decompress); 914 941 error: 915 916 942 Py_DECREF(raw_data); 943 return data; 917 944 } 918 945 … … 923 950 eq_mtime(time_t t1, time_t t2) 924 951 { 925 926 927 928 929 952 time_t d = t1 - t2; 953 if (d < 0) 954 d = -d; 955 /* dostime only stores even seconds, so be lenient */ 956 return d <= 1; 930 957 } 931 958 … … 938 965 unmarshal_code(char *pathname, PyObject *data, time_t mtime) 939 966 { 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 967 PyObject *code; 968 char *buf = PyString_AsString(data); 969 Py_ssize_t size = PyString_Size(data); 970 971 if (size <= 9) { 972 PyErr_SetString(ZipImportError, 973 "bad pyc data"); 974 return NULL; 975 } 976 977 if (get_long((unsigned char *)buf) != PyImport_GetMagicNumber()) { 978 if (Py_VerboseFlag) 979 PySys_WriteStderr("# %s has bad magic\n", 980 pathname); 981 Py_INCREF(Py_None); 982 return Py_None; /* signal caller to try alternative */ 983 } 984 985 if (mtime != 0 && !eq_mtime(get_long((unsigned char *)buf + 4), 986 mtime)) { 987 if (Py_VerboseFlag) 988 PySys_WriteStderr("# %s has bad mtime\n", 989 pathname); 990 Py_INCREF(Py_None); 991 return Py_None; /* signal caller to try alternative */ 992 } 993 994 code = PyMarshal_ReadObjectFromString(buf + 8, size - 8); 995 if (code == NULL) 996 return NULL; 997 if (!PyCode_Check(code)) { 998 Py_DECREF(code); 999 PyErr_Format(PyExc_TypeError, 1000 "compiled module %.200s is not a code object", 1001 pathname); 1002 return NULL; 1003 } 1004 return code; 978 1005 } 979 1006 … … 985 1012 normalize_line_endings(PyObject *source) 986 1013 { 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1014 char *buf, *q, *p = PyString_AsString(source); 1015 PyObject *fixed_source; 1016 1017 if (!p) 1018 return NULL; 1019 1020 /* one char extra for trailing \n and one for terminating \0 */ 1021 buf = (char *)PyMem_Malloc(PyString_Size(source) + 2); 1022 if (buf == NULL) { 1023 PyErr_SetString(PyExc_MemoryError, 1024 "zipimport: no memory to allocate " 1025 "source buffer"); 1026 return NULL; 1027 } 1028 /* replace "\r\n?" by "\n" */ 1029 for (q = buf; *p != '\0'; p++) { 1030 if (*p == '\r') { 1031 *q++ = '\n'; 1032 if (*(p + 1) == '\n') 1033 p++; 1034 } 1035 else 1036 *q++ = *p; 1037 } 1038 *q++ = '\n'; /* add trailing \n */ 1039 *q = '\0'; 1040 fixed_source = PyString_FromString(buf); 1041 PyMem_Free(buf); 1042 return fixed_source; 1016 1043 } 1017 1044 … … 1021 1048 compile_source(char *pathname, PyObject *source) 1022 1049 { 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1050 PyObject *code, *fixed_source; 1051 1052 fixed_source = normalize_line_endings(source); 1053 if (fixed_source == NULL) 1054 return NULL; 1055 1056 code = Py_CompileString(PyString_AsString(fixed_source), pathname, 1057 Py_file_input); 1058 Py_DECREF(fixed_source); 1059 return code; 1033 1060 } 1034 1061 … … 1038 1065 parse_dostime(int dostime, int dosdate) 1039 1066 { 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1067 struct tm stm; 1068 1069 memset((void *) &stm, '\0', sizeof(stm)); 1070 1071 stm.tm_sec = (dostime & 0x1f) * 2; 1072 stm.tm_min = (dostime >> 5) & 0x3f; 1073 stm.tm_hour = (dostime >> 11) & 0x1f; 1074 stm.tm_mday = dosdate & 0x1f; 1075 stm.tm_mon = ((dosdate >> 5) & 0x0f) - 1; 1076 stm.tm_year = ((dosdate >> 9) & 0x7f) + 80; 1077 stm.tm_isdst = -1; /* wday/yday is ignored */ 1078 1079 return mktime(&stm); 1053 1080 } 1054 1081 1055 1082 /* Given a path to a .pyc or .pyo file in the archive, return the 1056 modific taion time of the matching .py file, or 0 if no source1083 modification time of the matching .py file, or 0 if no source 1057 1084 is available. */ 1058 1085 static time_t 1059 1086 get_mtime_of_source(ZipImporter *self, char *path) 1060 1087 { 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1088 PyObject *toc_entry; 1089 time_t mtime = 0; 1090 Py_ssize_t lastchar = strlen(path) - 1; 1091 char savechar = path[lastchar]; 1092 path[lastchar] = '\0'; /* strip 'c' or 'o' from *.py[co] */ 1093 toc_entry = PyDict_GetItemString(self->files, path); 1094 if (toc_entry != NULL && PyTuple_Check(toc_entry) && 1095 PyTuple_Size(toc_entry) == 8) { 1096 /* fetch the time stamp of the .py file for comparison 1097 with an embedded pyc time stamp */ 1098 int time, date; 1099 time = PyInt_AsLong(PyTuple_GetItem(toc_entry, 5)); 1100 date = PyInt_AsLong(PyTuple_GetItem(toc_entry, 6)); 1101 mtime = parse_dostime(time, date); 1102 } 1103 path[lastchar] = savechar; 1104 return mtime; 1078 1105 } 1079 1106 … … 1082 1109 static PyObject * 1083 1110 get_code_from_data(ZipImporter *self, int ispackage, int isbytecode, 1084 1085 { 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 } 1108 1109 /* Get the code object asso iciated with the module specified by1111 time_t mtime, PyObject *toc_entry) 1112 { 1113 PyObject *data, *code; 1114 char *modpath; 1115 char *archive = PyString_AsString(self->archive); 1116 1117 if (archive == NULL) 1118 return NULL; 1119 1120 data = get_data(archive, toc_entry); 1121 if (data == NULL) 1122 return NULL; 1123 1124 modpath = PyString_AsString(PyTuple_GetItem(toc_entry, 0)); 1125 1126 if (isbytecode) { 1127 code = unmarshal_code(modpath, data, mtime); 1128 } 1129 else { 1130 code = compile_source(modpath, data); 1131 } 1132 Py_DECREF(data); 1133 return code; 1134 } 1135 1136 /* Get the code object associated with the module specified by 1110 1137 'fullname'. */ 1111 1138 static PyObject * 1112 1139 get_module_code(ZipImporter *self, char *fullname, 1113 1114 { 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1140 int *p_ispackage, char **p_modpath) 1141 { 1142 PyObject *toc_entry; 1143 char *subname, path[MAXPATHLEN + 1]; 1144 int len; 1145 struct st_zip_searchorder *zso; 1146 1147 subname = get_subname(fullname); 1148 1149 len = make_filename(PyString_AsString(self->prefix), subname, path); 1150 if (len < 0) 1151 return NULL; 1152 1153 for (zso = zip_searchorder; *zso->suffix; zso++) { 1154 PyObject *code = NULL; 1155 1156 strcpy(path + len, zso->suffix); 1157 if (Py_VerboseFlag > 1) 1158 PySys_WriteStderr("# trying %s%c%s\n", 1159 PyString_AsString(self->archive), 1160 SEP, path); 1161 toc_entry = PyDict_GetItemString(self->files, path); 1162 if (toc_entry != NULL) { 1163 time_t mtime = 0; 1164 int ispackage = zso->type & IS_PACKAGE; 1165 int isbytecode = zso->type & IS_BYTECODE; 1166 1167 if (isbytecode) 1168 mtime = get_mtime_of_source(self, path); 1169 if (p_ispackage != NULL) 1170 *p_ispackage = ispackage; 1171 code = get_code_from_data(self, ispackage, 1172 isbytecode, mtime, 1173 toc_entry); 1174 if (code == Py_None) { 1175 /* bad magic number or non-matching mtime 1176 in byte code, try next */ 1177 Py_DECREF(code); 1178 continue; 1179 } 1180 if (code != NULL && p_modpath != NULL) 1181 *p_modpath = PyString_AsString( 1182 PyTuple_GetItem(toc_entry, 0)); 1183 return code; 1184 } 1185 } 1186 PyErr_Format(ZipImportError, "can't find module '%.200s'", fullname); 1187 return NULL; 1161 1188 } 1162 1189 … … 1181 1208 initzipimport(void) 1182 1209 { 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 } 1210 PyObject *mod; 1211 1212 if (PyType_Ready(&ZipImporter_Type) < 0) 1213 return; 1214 1215 /* Correct directory separator */ 1216 zip_searchorder[0].suffix[0] = SEP; 1217 zip_searchorder[1].suffix[0] = SEP; 1218 zip_searchorder[2].suffix[0] = SEP; 1219 if (Py_OptimizeFlag) { 1220 /* Reverse *.pyc and *.pyo */ 1221 struct st_zip_searchorder tmp; 1222 tmp = zip_searchorder[0]; 1223 zip_searchorder[0] = zip_searchorder[1]; 1224 zip_searchorder[1] = tmp; 1225 tmp = zip_searchorder[3]; 1226 zip_searchorder[3] = zip_searchorder[4]; 1227 zip_searchorder[4] = tmp; 1228 } 1229 1230 mod = Py_InitModule4("zipimport", NULL, zipimport_doc, 1231 NULL, PYTHON_API_VERSION); 1232 if (mod == NULL) 1233 return; 1234 1235 ZipImportError = PyErr_NewException("zipimport.ZipImportError", 1236 PyExc_ImportError, NULL); 1237 if (ZipImportError == NULL) 1238 return; 1239 1240 Py_INCREF(ZipImportError); 1241 if (PyModule_AddObject(mod, "ZipImportError", 1242 ZipImportError) < 0) 1243 return; 1244 1245 Py_INCREF(&ZipImporter_Type); 1246 if (PyModule_AddObject(mod, "zipimporter", 1247 (PyObject *)&ZipImporter_Type) < 0) 1248 return; 1249 1250 zip_directory_cache = PyDict_New(); 1251 if (zip_directory_cache == NULL) 1252 return; 1253 Py_INCREF(zip_directory_cache); 1254 if (PyModule_AddObject(mod, "_zip_directory_cache", 1255 zip_directory_cache) < 0) 1256 return; 1257 }
Note:
See TracChangeset
for help on using the changeset viewer.