FileNode *FileNode::createNodeForZipEntry(struct zip *zip, const char *fname, zip_int64_t id) { FileNode *n = new FileNode(zip, fname, id); if (n == NULL) { return NULL; } n->is_dir = false; n->open_count = 0; n->state = CLOSED; struct zip_stat stat; zip_stat_index(zip, id, 0, &stat); // check that all used fields are valid zip_uint64_t needValid = ZIP_STAT_NAME | ZIP_STAT_INDEX | ZIP_STAT_SIZE | ZIP_STAT_MTIME; // required fields are always valid for existing items or newly added // directories (see zip_stat_index.c from libzip) assert((stat.valid & needValid) == needValid); n->m_mtime = n->m_atime = n->m_ctime = stat.mtime; n->has_cretime = false; n->m_size = stat.size; n->parse_name(); n->processExternalAttributes(); n->processExtraFields(); return n; }
/** * Create intermediate directory to build full tree */ FileNode *FileNode::createIntermediateDir(struct zip *zip, const char *fname) { FileNode *n = new FileNode(zip, fname, NEW_NODE_INDEX); if (n == NULL) { return NULL; } n->state = NEW_DIR; n->is_dir = true; n->has_cretime = true; n->m_mtime = n->m_atime = n->m_ctime = n->cretime = time(NULL); n->m_size = 0; n->m_mode = S_IFDIR | 0775; n->parse_name(); return n; }
FileNode *FileNode::createSymlink(struct zip *zip, const char *fname) { FileNode *n = new FileNode(zip, fname, NEW_NODE_INDEX); if (n == NULL) { return NULL; } n->state = NEW; n->is_dir = false; n->buffer = new BigBuffer(); if (!n->buffer) { delete n; return NULL; } n->has_cretime = true; n->m_mtime = n->m_atime = n->m_ctime = n->cretime = time(NULL); n->parse_name(); n->m_mode = S_IFLNK | 0777; return n; }
FileNode *FileNode::createFile (struct zip *zip, const char *fname, uid_t owner, gid_t group, mode_t mode) { FileNode *n = new FileNode(zip, fname, NEW_NODE_INDEX); if (n == NULL) { return NULL; } n->state = NEW; n->is_dir = false; n->buffer = new BigBuffer(); if (!n->buffer) { delete n; return NULL; } n->has_cretime = true; n->m_mtime = n->m_atime = n->m_ctime = n->cretime = time(NULL); n->parse_name(); n->m_mode = mode; n->m_uid = owner; n->m_gid = group; return n; }