/* This function returns 0 if the file is not in not compressed by * one of the supported compressors (gzip, bzip, bzip2). Otherwise, * the compression type is returned, as defined in util.h * Warning: this function moves the current file pointer */ int get_compression_type (int fd) { unsigned char magic[4]; /* Read the magic signature */ if (mc_read (fd, (char *) magic, 4) != 4) return COMPRESSION_NONE; /* GZIP_MAGIC and OLD_GZIP_MAGIC */ if (magic[0] == 037 && (magic[1] == 0213 || magic[1] == 0236)) { return COMPRESSION_GZIP; } /* PKZIP_MAGIC */ if (magic[0] == 0120 && magic[1] == 0113 && magic[2] == 003 && magic[3] == 004) { /* Read compression type */ mc_lseek (fd, 8, SEEK_SET); if (mc_read (fd, (char *) magic, 2) != 2) return COMPRESSION_NONE; /* Gzip can handle only deflated (8) or stored (0) files */ if ((magic[0] != 8 && magic[0] != 0) || magic[1] != 0) return COMPRESSION_NONE; /* Compatible with gzip */ return COMPRESSION_GZIP; } /* PACK_MAGIC and LZH_MAGIC and compress magic */ if (magic[0] == 037 && (magic[1] == 036 || magic[1] == 0240 || magic[1] == 0235)) { /* Compatible with gzip */ return COMPRESSION_GZIP; } /* BZIP and BZIP2 files */ if ((magic[0] == 'B') && (magic[1] == 'Z') && (magic[3] >= '1') && (magic[3] <= '9')) { switch (magic[2]) { case '0': return COMPRESSION_BZIP; case 'h': return COMPRESSION_BZIP2; } } return 0; }
static union record *get_next_record (vfs_s_super *archive, int tard) { if (mc_read (tard, rec_buf.charptr, RECORDSIZE) != RECORDSIZE) return NULL; /* An error has occurred */ current_tar_position += RECORDSIZE; return &rec_buf; }
static vfs_path_t * mc_def_getlocalcopy (const vfs_path_t * filename_vpath) { vfs_path_t *tmp_vpath = NULL; int fdin = -1, fdout = -1; ssize_t i; char buffer[BUF_1K * 8]; struct stat mystat; fdin = mc_open (filename_vpath, O_RDONLY | O_LINEAR); if (fdin == -1) goto fail; fdout = vfs_mkstemps (&tmp_vpath, "vfs", vfs_path_get_last_path_str (filename_vpath)); if (fdout == -1) goto fail; while ((i = mc_read (fdin, buffer, sizeof (buffer))) > 0) { if (write (fdout, buffer, i) != i) goto fail; } if (i == -1) goto fail; i = mc_close (fdin); fdin = -1; if (i == -1) goto fail; i = close (fdout); fdout = -1; if (i == -1) { fdout = -1; goto fail; } if (mc_stat (filename_vpath, &mystat) != -1) mc_chmod (tmp_vpath, mystat.st_mode); return tmp_vpath; fail: vfs_path_free (tmp_vpath); if (fdout != -1) close (fdout); if (fdin != -1) mc_close (fdin); return NULL; }
/*static */ void mcview_file_load_data (mcview_t * view, off_t byte_index) { off_t blockoffset; ssize_t res; size_t bytes_read; #ifdef HAVE_ASSERT_H assert (view->datasource == DS_FILE); #endif if (mcview_already_loaded (view->ds_file_offset, byte_index, view->ds_file_datalen)) return; if (byte_index >= view->ds_file_filesize) return; blockoffset = mcview_offset_rounddown (byte_index, view->ds_file_datasize); if (mc_lseek (view->ds_file_fd, blockoffset, SEEK_SET) == -1) goto error; bytes_read = 0; while (bytes_read < view->ds_file_datasize) { res = mc_read (view->ds_file_fd, view->ds_file_data + bytes_read, view->ds_file_datasize - bytes_read); if (res == -1) goto error; if (res == 0) break; bytes_read += (size_t) res; } view->ds_file_offset = blockoffset; if ((off_t) bytes_read > view->ds_file_filesize - view->ds_file_offset) { /* the file has grown in the meantime -- stick to the old size */ view->ds_file_datalen = view->ds_file_filesize - view->ds_file_offset; } else { view->ds_file_datalen = bytes_read; } return; error: view->ds_file_datalen = 0; }
static int tar_read (void *fh, char *buffer, int count) { off_t begin = FH->ino->u.tar.data_offset; int fd = FH_SUPER->u.tar.fd; vfs *me = FH_SUPER->me; if (mc_lseek (fd, begin + FH->pos, SEEK_SET) != begin + FH->pos) ERRNOR (EIO, -1); count = VFS_MIN(count, FH->ino->st.st_size - FH->pos); if ((count = mc_read (fd, buffer, count)) == -1) ERRNOR (errno, -1); FH->pos += count; return count; }
enum compression_type get_compression_type (int fd, const char *name) { unsigned char magic[16]; size_t str_len; /* Read the magic signature */ if (mc_read (fd, (char *) magic, 4) != 4) return COMPRESSION_NONE; /* GZIP_MAGIC and OLD_GZIP_MAGIC */ if (magic[0] == 037 && (magic[1] == 0213 || magic[1] == 0236)) { return COMPRESSION_GZIP; } /* PKZIP_MAGIC */ if (magic[0] == 0120 && magic[1] == 0113 && magic[2] == 003 && magic[3] == 004) { /* Read compression type */ mc_lseek (fd, 8, SEEK_SET); if (mc_read (fd, (char *) magic, 2) != 2) return COMPRESSION_NONE; /* Gzip can handle only deflated (8) or stored (0) files */ if ((magic[0] != 8 && magic[0] != 0) || magic[1] != 0) return COMPRESSION_NONE; /* Compatible with gzip */ return COMPRESSION_GZIP; } /* PACK_MAGIC and LZH_MAGIC and compress magic */ if (magic[0] == 037 && (magic[1] == 036 || magic[1] == 0240 || magic[1] == 0235)) { /* Compatible with gzip */ return COMPRESSION_GZIP; } /* BZIP and BZIP2 files */ if ((magic[0] == 'B') && (magic[1] == 'Z') && (magic[3] >= '1') && (magic[3] <= '9')) { switch (magic[2]) { case '0': return COMPRESSION_BZIP; case 'h': return COMPRESSION_BZIP2; default: break; } } /* LZ4 format - v1.5.0 - 0x184D2204 (little endian) */ if (magic[0] == 0x04 && magic[1] == 0x22 && magic[2] == 0x4d && magic[3] == 0x18) return COMPRESSION_LZ4; if (mc_read (fd, (char *) magic + 4, 2) != 2) return COMPRESSION_NONE; /* LZIP files */ if (magic[0] == 'L' && magic[1] == 'Z' && magic[2] == 'I' && magic[3] == 'P' && (magic[4] == 0x00 || magic[4] == 0x01)) return COMPRESSION_LZIP; /* Support for LZMA (only utils format with magic in header). * This is the default format of LZMA utils 4.32.1 and later. */ if (magic[0] == 0xFF && magic[1] == 'L' && magic[2] == 'Z' && magic[3] == 'M' && magic[4] == 'A' && magic[5] == 0x00) return COMPRESSION_LZMA; /* XZ compression magic */ if (magic[0] == 0xFD && magic[1] == 0x37 && magic[2] == 0x7A && magic[3] == 0x58 && magic[4] == 0x5A && magic[5] == 0x00) return COMPRESSION_XZ; str_len = strlen (name); /* HACK: we must belive to extension of LZMA file :) ... */ if ((str_len > 5 && strcmp (&name[str_len - 5], ".lzma") == 0) || (str_len > 4 && strcmp (&name[str_len - 4], ".tlz") == 0)) return COMPRESSION_LZMA; return COMPRESSION_NONE; }
void mcview_growbuf_read_until (mcview_t * view, off_t ofs) { ssize_t nread; byte *p; size_t bytesfree; gboolean short_read; assert (view->growbuf_in_use); if (view->growbuf_finished) return; short_read = FALSE; while (mcview_growbuf_filesize (view) < ofs || short_read) { if (view->growbuf_lastindex == VIEW_PAGE_SIZE) { /* Append a new block to the growing buffer */ byte *newblock = g_try_malloc (VIEW_PAGE_SIZE); if (newblock == NULL) return; g_ptr_array_add (view->growbuf_blockptr, newblock); view->growbuf_lastindex = 0; } p = g_ptr_array_index (view->growbuf_blockptr, view->growbuf_blockptr->len - 1) + view->growbuf_lastindex; bytesfree = VIEW_PAGE_SIZE - view->growbuf_lastindex; if (view->datasource == DS_STDIO_PIPE) { nread = fread (p, 1, bytesfree, view->ds_stdio_pipe); if (nread == 0) { view->growbuf_finished = TRUE; (void) pclose (view->ds_stdio_pipe); mcview_display (view); close_error_pipe (D_NORMAL, NULL); view->ds_stdio_pipe = NULL; return; } } else { assert (view->datasource == DS_VFS_PIPE); do { nread = mc_read (view->ds_vfs_pipe, p, bytesfree); } while (nread == -1 && errno == EINTR); if (nread == -1 || nread == 0) { view->growbuf_finished = TRUE; (void) mc_close (view->ds_vfs_pipe); view->ds_vfs_pipe = -1; return; } } short_read = ((size_t) nread < bytesfree); view->growbuf_lastindex += nread; } }
static bool clock_to_gmt(satime_t *timbuf) { int i; satime_t tmp; int year, month, day, hour, min, sec; if (machineid == HP_425 && mmuid == MMUID_425_E) { /* 425e uses mcclock on the frodo utility chip */ while ((mc_read(MC_REGA) & MC_REGA_UIP) != 0) continue; sec = mc_read(MC_SEC); min = mc_read(MC_MIN); hour = mc_read(MC_HOUR); day = mc_read(MC_DOM); month = mc_read(MC_MONTH); year = mc_read(MC_YEAR) + 1900; } else { /* Use the traditional HIL bbc for all other models */ read_bbc(); sec = bbc_to_decimal(1, 0); min = bbc_to_decimal(3, 2); /* * Hours are different for some reason. Makes no sense really. */ hour = ((bbc_registers[5] & 0x03) * 10) + bbc_registers[4]; day = bbc_to_decimal(8, 7); month = bbc_to_decimal(10, 9); year = bbc_to_decimal(12, 11) + 1900; } if (year < POSIX_BASE_YEAR) year += 100; #ifdef CLOCK_DEBUG printf("clock todr: %u/%u/%u %u:%u:%u\n", year, month, day, hour, min, sec); #endif range_test(hour, 0, 23); range_test(day, 1, 31); range_test(month, 1, 12); tmp = 0; for (i = POSIX_BASE_YEAR; i < year; i++) tmp += days_per_year(i); if (is_leap_year(year) && month > FEBRUARY) tmp++; for (i = 1; i < month; i++) tmp += days_in_month(i); tmp += (day - 1); tmp = ((tmp * 24 + hour) * 60 + min) * 60 + sec; *timbuf = tmp; return true; }
void mcview_growbuf_read_until (WView * view, off_t ofs) { gboolean short_read = FALSE; #ifdef HAVE_ASSERT_H assert (view->growbuf_in_use); #endif if (view->growbuf_finished) return; while (mcview_growbuf_filesize (view) < ofs || short_read) { ssize_t nread = 0; byte *p; size_t bytesfree; if (view->growbuf_lastindex == VIEW_PAGE_SIZE) { /* Append a new block to the growing buffer */ byte *newblock = g_try_malloc (VIEW_PAGE_SIZE); if (newblock == NULL) return; g_ptr_array_add (view->growbuf_blockptr, newblock); view->growbuf_lastindex = 0; } p = (byte *) g_ptr_array_index (view->growbuf_blockptr, view->growbuf_blockptr->len - 1) + view->growbuf_lastindex; bytesfree = VIEW_PAGE_SIZE - view->growbuf_lastindex; if (view->datasource == DS_STDIO_PIPE) { mc_pipe_t *sp = view->ds_stdio_pipe; GError *error = NULL; if (bytesfree > MC_PIPE_BUFSIZE) bytesfree = MC_PIPE_BUFSIZE; sp->out.len = bytesfree; sp->err.len = MC_PIPE_BUFSIZE; mc_pread (sp, &error); if (error != NULL) { mcview_show_error (view, error->message); g_error_free (error); mcview_growbuf_done (view); return; } if (view->pipe_first_err_msg && sp->err.len > 0) { /* ignore possible following errors */ /* reset this flag before call of mcview_show_error() to break * endless recursion: mcview_growbuf_read_until() -> mcview_show_error() -> * MSG_DRAW -> mcview_display() -> mcview_get_byte() -> mcview_growbuf_read_until() */ view->pipe_first_err_msg = FALSE; mcview_show_error (view, sp->err.buf); } if (sp->out.len > 0) { memmove (p, sp->out.buf, sp->out.len); nread = sp->out.len; } else if (sp->out.len == MC_PIPE_STREAM_EOF || sp->out.len == MC_PIPE_ERROR_READ) { if (sp->out.len == MC_PIPE_ERROR_READ) { char *err_msg; err_msg = g_strdup_printf (_("Failed to read data from child stdout:\n%s"), unix_error_string (sp->out.error)); mcview_show_error (view, err_msg); g_free (err_msg); } if (view->ds_stdio_pipe != NULL) { /* when switch from parse to raw mode and back, * do not close the already closed pipe after following loop: * mcview_growbuf_read_until() -> mcview_show_error() -> * MSG_DRAW -> mcview_display() -> mcview_get_byte() -> mcview_growbuf_read_until() */ mcview_growbuf_done (view); } mcview_display (view); return; } } else { #ifdef HAVE_ASSERT_H assert (view->datasource == DS_VFS_PIPE); #endif do { nread = mc_read (view->ds_vfs_pipe, p, bytesfree); } while (nread == -1 && errno == EINTR); if (nread <= 0) { mcview_growbuf_done (view); return; } } short_read = ((size_t) nread < bytesfree); view->growbuf_lastindex += nread; } }