void xa_get_ar_line_content (gchar *line, gpointer data) { XArchive *archive = data; gchar *filename; gpointer item[4]; gint n = 0, a = 0 ,linesize = 0; linesize = strlen(line); /* Permissions */ line[9] = '\0'; item[0] = line; /* Owner */ for(n=12; n < linesize; ++n) if(line[n] == ' ') break; line[n] = '\0'; item[1] = line+10; /* Size */ for(++n; n < linesize; ++n) if(line[n] >= '0' && line[n] <= '9') break; a = n; for(; n < linesize; ++n) if(line[n] == ' ') break; line[n] = '\0'; item[2] = line + a; archive->dummy_size += g_ascii_strtoull(item[2],NULL,0); a = ++n; /* Date Modified */ for(; n < linesize; ++n) { if(n == 38) break; } if (line[n] != ' ') { for(; n < linesize; ++n) { if(line[n] == ' ') break; } } line[n] = '\0'; item[3] = line + a; n++; line[linesize-1] = '\0'; archive->nr_of_files++; filename = g_strdup(line + n); xa_set_archive_entries_for_each_row (archive,filename,item); g_free(filename); }
void xa_get_7zip_line_content (gchar *line, gpointer data) { XArchive *archive = data; XEntry *entry; gchar *filename; gpointer item[5]; gint linesize = 0,a = 0; if (last_line) return; if (jump_header == FALSE) { if ((line[0] == '-') && line[3]) { jump_header = TRUE; return; } return; } if (line[0] == '-') { last_line = TRUE; return; } linesize = strlen(line); archive->nr_of_files++; /* Date */ line[10] = '\0'; item[4] = line; /* Time */ line[19] = '\0'; item[3] = line + 11; /* Permissions */ line[25] = '\0'; item[2] = line + 20; /* Size */ for(a=26; a < linesize; ++a) if(line[a] >= '0' && line[a] <= '9') break; line[38] = '\0'; item[0] = line + a; archive->dummy_size += g_ascii_strtoull(item[0],NULL,0); /* Compressed */ /* Is this item solid? */ if (line[50] == ' ') { line[linesize-1] = '\0'; item[1] = "0"; } else { for(a=39; a < linesize; ++a) if(line[a] >= '0' && line[a] <= '9') break; line[51] = '\0'; item[1] = line + a; line[linesize-1] = '\0'; } filename = g_strdup(line + 53); entry = xa_set_archive_entries_for_each_row (archive,filename,item); g_free(filename); }
void xa_get_tar_line_content (gchar *line, gpointer data) { XArchive *archive = data; XEntry *entry; gchar *filename; gpointer item[6]; gint n = 0, a = 0 ,linesize = 0; gboolean dir = FALSE; linesize = strlen(line); archive->nr_of_files++; /* Permissions */ line[10] = '\0'; item[1] = line; /* Owner */ for(n=13; n < linesize; ++n) if(line[n] == ' ') break; line[n] = '\0'; item[2] = line+11; /* Size */ for(++n; n < linesize; ++n) if(line[n] >= '0' && line[n] <= '9') break; a = n; for(; n < linesize; ++n) if(line[n] == ' ') break; line[n] = '\0'; item[3] = line + a; archive->dummy_size += g_ascii_strtoull(item[3],NULL,0); a = ++n; /* Date */ for(; n < linesize; n++) if(line[n] == ' ') break; line[n] = '\0'; item[4] = line + a; /* Time */ a = ++n; for (; n < linesize; n++) if (line[n] == ' ') break; line[n] = '\0'; item[5] = line + a; n++; line[linesize-1] = '\0'; filename = line + n; /* Symbolic link */ gchar *temp = g_strrstr (filename,"->"); if (temp) { gint len = strlen(filename) - strlen(temp); item[0] = (filename +=3) + len; filename[strlen(filename) - strlen(temp)-1] = '\0'; } else item[0] = NULL; if(line[0] == 'd') { dir = TRUE; /* Work around for gtar, which does not output / with directories */ if(line[linesize-2] != '/') filename = g_strconcat(line + n, "/", NULL); else filename = g_strdup(line + n); } else filename = g_strdup(line + n); entry = xa_set_archive_entries_for_each_row (archive,filename,item); g_free(filename); }
void xa_get_cpio_line_content (gchar *line, gpointer data) { XArchive *archive = data; XEntry *entry; gchar *filename; gpointer item[7]; gint n = 0, a = 0 ,linesize = 0; gboolean dir = FALSE; linesize = strlen(line); archive->nr_of_files++; /* Permissions */ line[10] = '\0'; item[2] = line; a = 11; /* Hard Link */ for(n=a; n < linesize && line[n] == ' '; ++n); line[++n] = '\0'; item[4] = line + a; n++; a = n; /* Owner */ for(; n < linesize && line[n] != ' '; ++n); line[n] = '\0'; item[5] = line + a; n++; /* Group */ for(; n < linesize && line[n] == ' '; ++n); a = n; for(; n < linesize && line[n] != ' '; ++n); line[n] = '\0'; item[6] = line + a; n++; /* Size */ for(; n < linesize && line[n] == ' '; ++n); a = n; for(; n < linesize && line[n] != ' '; ++n); line[n] = '\0'; item[1] = line + a; archive->dummy_size += g_ascii_strtoull(item[1],NULL,0); n++; /* Date */ line[54] = '\0'; item[3] = line + n; n = 55; line[linesize-1] = '\0'; filename = line + n; /* Symbolic link */ gchar *temp = g_strrstr (filename,"->"); if (temp) { a = 3; gint len = strlen(filename) - strlen(temp); item[0] = filename + a + len; filename[strlen(filename) - strlen(temp)] = '\0'; } else item[0] = NULL; if(line[0] == 'd') { dir = TRUE; /* Work around for cpio, which does * not output / with directories */ if(line[linesize-2] != '/') filename = g_strconcat(line + n, "/", NULL); else filename = g_strdup(line + n); } else filename = g_strdup(line + n); entry = xa_set_archive_entries_for_each_row (archive,filename,item); g_free (filename); }
void xa_get_arj_line_content (gchar *line, gpointer data) { XArchive *archive = data; XEntry *entry; gpointer item[7]; unsigned int linesize,n,a; static gchar *filename; gboolean lfn = TRUE; if (last_line || strstr(line,"HardLink")) return; if (arj_line == 3) { arj_line++; return; } if (arj_line == 4) { arj_line = 1; return; } if (jump_header == FALSE) { if (line[0] == '-') { jump_header = TRUE; arj_line = 1; return; } return; } if (arj_line == 1) { linesize = strlen(line); if(line[0] == '*') { archive->has_passwd = TRUE; encrypted = TRUE; } else if (line[0] == '-') { last_line = TRUE; return; } line[linesize - 1] = '\0'; if (unarj) /* simple column separator check */ lfn = (linesize < 76 || line[34] != ' ' || line[40] != ' ' || line[49] != ' ' || line[58] != ' ' || line[67] != ' '); if (lfn) filename = g_strdup(line + (unarj ? 0 : 5)); else filename = g_strndup(line, 12); archive->nr_of_files++; arj_line++; if (lfn) return; } if (arj_line == 2) { linesize = strlen(line); /* Size */ for(n=12; n < linesize && line[n] == ' '; n++); a = n; for(; n < linesize && line[n] != ' '; n++); line[n]='\0'; item[0] = line + a; archive->dummy_size += g_ascii_strtoull(item[0],NULL,0); n++; /* Compressed */ for(; n < linesize && line[n] == ' '; n++); a = n; for(; n < linesize && line[n] != ' '; n++); line[n]='\0'; item[1] = line + a; n++; /* Ratio */ line[40] = '\0'; item[2] = line + 35; /* Date */ line[49] = '\0'; item[3] = line + 41; /* Time */ line[58] = '\0'; item[4] = line + 50; /* Permissions */ line[unarj ? 72 : 69] = '\0'; item[5] = line + (unarj ? 68 : 59); /* GUA */ line[73] = '\0'; item[6] = (unarj ? "" : line + 70); /* BPMGS */ line[78] = '\0'; if (unarj) encrypted = (line[76] == 'G'); else encrypted = (line[77] == '1'); entry = xa_set_archive_entries_for_each_row (archive,filename,item); if (entry != NULL) entry->is_encrypted = encrypted; g_free(filename); if (unarj) arj_line = 1; else arj_line++; } }
void xa_get_rar_line_content (gchar *line, gpointer data) { XArchive *archive = data; XEntry *entry; gpointer item[9]; unsigned short int i = 0; unsigned int linesize,n,a; gboolean dir = FALSE; static gchar *filename; if (last_line) return; if (jump_header == FALSE) { if (strncmp(line,"Comment:",8) == 0) { jump_comment = archive->has_comment = TRUE; archive->comment = g_string_new(""); archive->comment = g_string_append(archive->comment,&line[9]); return; } if (jump_comment == TRUE) { if (strncmp(line,"Pathname/Comment",16) != 0) { archive->comment = g_string_append(archive->comment,line); return; } jump_comment = FALSE; } if (strncmp(line, "-------------------------------------------------------------------------------",78) == 0) jump_header = TRUE; return; } if (read_filename == FALSE) { linesize = strlen(line); if(line[0] == '*') { archive->has_passwd = TRUE; encrypted = TRUE; } else if (line[0] == '-') { last_line = TRUE; return; } line[linesize - 1] = '\0'; filename = g_strdup(line+1); read_filename = TRUE; } else { linesize = strlen(line); archive->nr_of_files++; /* Size */ for(n=0; n < linesize && line[n] == ' '; n++); a = n; for(; n < linesize && line[n] != ' '; n++); line[n]='\0'; item[i] = line + a; archive->dummy_size += g_ascii_strtoull(item[i],NULL,0); i++; n++; /* Compressed */ for(; n < linesize && line[n] == ' '; n++); a = n; for(; n < linesize && line[n] != ' '; n++); line[n]='\0'; item[i] = line + a; i++; n++; /* Ratio */ for(; n < linesize && line[n] == ' '; n++); a = n; for(; n < linesize && line[n] != ' '; n++); line[n] = '\0'; item[i] = line + a; i++; n++; /* Date */ for(; n < linesize && line[n] == ' '; n++); a = n; for(; n < linesize && line[n] != ' '; n++); line[n] = '\0'; item[i] = line + a; i++; n++; /* Time */ for(; n < linesize && line[n] == ' '; n++); a = n; for(; n < linesize && line[n] != ' '; n++); line[n] = '\0'; item[i] = line + a; i++; n++; /* Permissions */ for(; n < linesize && line[n] == ' '; n++); a = n; for(; n < linesize && line[n] != ' '; n++); line[n] = '\0'; if ((line+a)[0] == 'd') dir = TRUE; item[i] = line + a; i++; n++; /* CRC */ for(; n < linesize && line[n] == ' '; n++); a = n; for(; n < linesize && line[n] != ' '; n++); line[n] = '\0'; item[i] = line + a; i++; n++; /* Method */ for(; n < linesize && line[n] == ' '; n++); a = n; for(; n < linesize && line[n] != ' '; n++); line[n] = '\0'; item[i] = line + a; i++; n++; /* version */ for(; n < linesize && line[n] == ' '; n++); a = n; for(; n < linesize && line[n] != ' ' && line[n] != '\n'; n++); line[n] = '\0'; item[i] = line + a; /* Work around for rar which doesn't * output / with directories */ if (dir) { gchar *filename_with_slash = g_strconcat (filename,"/",NULL); g_free (filename); filename = filename_with_slash; } entry = xa_set_archive_entries_for_each_row (archive,filename,item); if (entry != NULL) entry->is_encrypted = encrypted; g_free(filename); read_filename = FALSE; encrypted = FALSE; } }
static void xa_unar_parse_output (gchar *line, XArchive *archive) { XEntry *entry; gpointer item[6]; gchar *index, *flags, *filename; gboolean dir, encrypted, link; guint shift; USE_PARSER; if (last_line) return; if (strncmp(line, " ", 5) == 0) { data_line = TRUE; return; } if (!data_line) { if (strstr(line, ": Tar in ")) { XArchiveType type = archive->type; xa_get_compressed_tar_type(&type); archiver[type].program[0] = g_strdup(archiver[archive->type].program[0]); archiver[type].program[1] = g_strdup(archiver[archive->type].program[1]); archive->type = type; archive->can_test = FALSE; } return; } if (*line == '(') { last_line = TRUE; return; } /* index (may exceed column width) */ NEXT_ITEM(index); shift = MAXWIDTH(index, 4); /* flags */ NEXT_ITEM(flags); dir = (flags[0] == 'D'); link = (flags[2] == 'L'); encrypted = (flags[3] == 'E'); if (encrypted) archive->has_password = TRUE; /* file size */ NEXT_ITEM(item[1]); /* ratio (may exceed column width) */ NEXT_ITEM(item[2]); shift += MAXWIDTH(item[2], 6); /* mode */ NEXT_ITEM(item[5]); /* date */ NEXT_ITEM(item[3]); /* time */ if (strcmp(item[3], "----------------") == 0) { char *item3 = (char *) item[3]; item3[10] = 0; item[4] = item3 + 11; } else NEXT_ITEM(item[4]); /* name */ LAST_ITEM(filename); filename += shift; item[0] = NULL; if (link) { char *l = strstr(filename, " -> "); if (l) { item[0] = l + 4; *l = 0; } } entry = xa_set_archive_entries_for_each_row(archive, filename, item); if (entry) { if (dir) entry->is_dir = TRUE; entry->is_encrypted = encrypted; if (!entry->is_dir) archive->files++; archive->files_size += g_ascii_strtoull(item[1], NULL, 0); } }
static void xa_tar_parse_output (gchar *line, XArchive *archive) { XEntry *entry; gchar *filename; gpointer item[6]; gint n = 0, a = 0 ,linesize = 0; linesize = strlen(line); /* Permissions */ line[10] = '\0'; item[4] = line; /* Owner */ for(n=13; n < linesize; ++n) if(line[n] == ' ') break; line[n] = '\0'; item[5] = line+11; /* Size */ for(++n; n < linesize; ++n) if(line[n] >= '0' && line[n] <= '9') break; a = n; for(; n < linesize; ++n) if(line[n] == ' ') break; line[n] = '\0'; item[1] = line + a; a = ++n; /* Date */ for(; n < linesize; n++) if(line[n] == ' ') break; line[n] = '\0'; item[2] = line + a; /* Time */ a = ++n; for (; n < linesize; n++) if (line[n] == ' ') break; line[n] = '\0'; item[3] = line + a; n++; line[linesize-1] = '\0'; filename = line + n; /* Symbolic link */ gchar *temp = g_strrstr (filename,"->"); if (temp) { gint len = strlen(filename) - strlen(temp); item[0] = (filename +=3) + len; filename[strlen(filename) - strlen(temp)-1] = '\0'; } else item[0] = NULL; if(line[0] == 'd') { /* Work around for gtar, which does not output / with directories */ if(line[linesize-2] != '/') filename = g_strconcat(line + n, "/", NULL); else filename = g_strdup(line + n); } else filename = g_strdup(line + n); entry = xa_set_archive_entries_for_each_row(archive, filename, item); if (entry) { entry->is_encrypted = (archive->password != NULL); if (!entry->is_dir) archive->files++; archive->files_size += g_ascii_strtoull(item[1], NULL, 0); } g_free(filename); }