PERFORCE change 81440 for review
soc-andrew
soc-andrew at FreeBSD.org
Thu Aug 4 11:47:26 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=81440
Change 81440 by soc-andrew at soc-andrew_serv on 2005/08/04 11:46:25
Install a ports tree if asked to.
Improve indentation.
Affected files ...
.. //depot/projects/soc2005/bsdinstaller/src/lib/bsdinstaller/installer/dist.c#5 edit
.. //depot/projects/soc2005/bsdinstaller/src/usr.sbin/bsdinstaller/backend/extra_flow.c#6 edit
.. //depot/projects/soc2005/bsdinstaller/src/usr.sbin/bsdinstaller/backend/fn_install_freebsd.c#7 edit
Differences ...
==== //depot/projects/soc2005/bsdinstaller/src/lib/bsdinstaller/installer/dist.c#5 (text+ko) ====
@@ -53,90 +53,89 @@
*/
struct inf_file *
inf_read(const char *dir, const char *dist) {
- int fd, chunk, pieces;
- properties dist_attr = NULL;
- struct inf_file *inf;
- char *tmp;
- char file[PATH_MAX];
+ int fd, chunk, pieces;
+ properties dist_attr = NULL;
+ struct inf_file *inf;
+ char *tmp;
+ char file[PATH_MAX];
- /* Set file to the location of the .inf file */
- snprintf(file, PATH_MAX, "%s/%s/%s.inf", base, dir, dist);
+ /* Set file to the location of the .inf file */
+ snprintf(file, PATH_MAX, "%s/%s/%s.inf", base, dir, dist);
- /* Open the file */
- fd = open(file, O_RDONLY);
- if (fd == -1) {
- /* XXX */
- return NULL;
- }
+ /* Open the file */
+ fd = open(file, O_RDONLY);
+ if (fd == -1) {
+ /* XXX */
+ return NULL;
+ }
- /* Read the .inf and close */
- dist_attr = properties_read(fd);
- close(fd);
+ /* Read the .inf and close */
+ dist_attr = properties_read(fd);
+ close(fd);
- tmp = property_find(dist_attr, "Pieces");
- if (tmp == NULL) {
- /* XXX Bad file */
- properties_free(dist_attr);
- return NULL;
- }
+ tmp = property_find(dist_attr, "Pieces");
+ if (tmp == NULL) {
+ /* XXX Bad file */
+ properties_free(dist_attr);
+ return NULL;
+ }
- pieces = strtol(tmp, (char **)NULL, 10);
- if (pieces <= 0 || pieces == LONG_MAX) {
- /* XXX Bad file */
- properties_free(dist_attr);
- return NULL;
- }
+ pieces = strtol(tmp, (char **)NULL, 10);
+ if (pieces <= 0 || pieces == LONG_MAX) {
+ /* XXX Bad file */
+ properties_free(dist_attr);
+ return NULL;
+ }
- inf = malloc(sizeof(struct inf_file));
- if (inf == NULL) {
- /* XXX Out of memory */
- properties_free(dist_attr);
- return NULL;
- }
+ inf = malloc(sizeof(struct inf_file));
+ if (inf == NULL) {
+ /* XXX Out of memory */
+ properties_free(dist_attr);
+ return NULL;
+ }
- inf->pieces = pieces;
- inf->dir = strdup(dir);
- inf->dist = strdup(dist);
+ inf->pieces = pieces;
+ inf->dir = strdup(dir);
+ inf->dist = strdup(dist);
- inf->file = malloc(sizeof(struct file) * inf->pieces);
- if (inf->file == NULL) {
- /* XXX Out of memory */
- inf_free(inf);
- properties_free(dist_attr);
- return NULL;
- }
+ inf->file = malloc(sizeof(struct file) * inf->pieces);
+ if (inf->file == NULL) {
+ /* XXX Out of memory */
+ inf_free(inf);
+ properties_free(dist_attr);
+ return NULL;
+ }
- for (chunk = 0; chunk < inf->pieces; chunk++) {
+ for (chunk = 0; chunk < inf->pieces; chunk++) {
- snprintf(file, PATH_MAX, "cksum.%c%c", (chunk / 26) + 'a',
- (chunk % 26) + 'a');
+ snprintf(file, PATH_MAX, "cksum.%c%c", (chunk / 26) + 'a',
+ (chunk % 26) + 'a');
- tmp = property_find(dist_attr, file);
- if (tmp) {
- char *len;
- int length;
- len = index(tmp, ' ');
- length = strtol(len, (char **)NULL, 10);
- if (length <= 0 || length == LONG_MAX) {
- inf_free(inf);
- properties_free(dist_attr);
- return NULL;
- }
- inf->file[chunk].checksum = malloc(len-tmp+1);
- strncpy(inf->file[chunk].checksum, tmp, len-tmp);
- inf->file[chunk].checksum[len-tmp] = '\0';
+ tmp = property_find(dist_attr, file);
+ if (tmp) {
+ char *len;
+ int length;
+ len = index(tmp, ' ');
+ length = strtol(len, (char **)NULL, 10);
+ if (length <= 0 || length == LONG_MAX) {
+ inf_free(inf);
+ properties_free(dist_attr);
+ return NULL;
+ }
+ inf->file[chunk].checksum = malloc(len-tmp+1);
+ strncpy(inf->file[chunk].checksum, tmp, len-tmp);
+ inf->file[chunk].checksum[len-tmp] = '\0';
+ inf->file[chunk].length = length;
+ } else {
+ inf_free(inf);
+ properties_free(dist_attr);
+ return NULL;
+ }
+ }
- inf->file[chunk].length = length;
- } else {
- inf_free(inf);
- properties_free(dist_attr);
- return NULL;
- }
- }
+ properties_free(dist_attr);
- properties_free(dist_attr);
-
- return inf;
+ return inf;
}
/*
@@ -144,25 +143,42 @@
*/
void
inf_free(struct inf_file *f) {
- int chunk;
+ int chunk;
+
+ if (f == NULL)
+ return;
+
+ for (chunk=0; chunk < f->pieces; chunk++)
+ if (f->file[chunk].checksum != NULL)
+ free(f->file[chunk].checksum);
+
+ if (f->file != NULL)
+ free(f->file);
- if (f == NULL)
- return;
+ if (f->dir != NULL)
+ free(f->dir);
- for (chunk=0; chunk < f->pieces; chunk++)
- if (f->file[chunk].checksum != NULL)
- free(f->file[chunk].checksum);
+ if (f->dist != NULL)
+ free(f->dist);
- if (f->file != NULL)
- free(f->file);
+ free(f);
+}
- if (f->dir != NULL)
- free(f->dir);
+/*
+ * The size of the data is saved in the last 4 bytes of a gzip file.
+ * Extract this and return it
+ */
+static uint32_t
+gzip_getsize(const char *name) {
+ uint32_t data;
+ FILE *fd = fopen(name, "r");
- if (f->dist != NULL)
- free(f->dist);
+ fseek(fd, -4, SEEK_END);
+ fread(&data, 1, 4, fd);
+ fclose(fd);
- free(f);
+ /* XXX Check in a big endian */
+ return data;
}
/*
@@ -171,91 +187,123 @@
*/
static void
dist_change_file_callback(int pcnt, char *name) {
- /* Set the progress bar to pcnd % */
- dfui_progress_set_amount(pr, pcnt);
+ /* Set the progress bar to pcnd % */
+ dfui_progress_set_amount(pr, pcnt);
- /* Set the description to the current file */
- if (name != NULL)
- dfui_info_set_short_desc(dfui_progress_get_info(pr), name);
+ /* Set the description to the current file */
+ if (name != NULL)
+ dfui_info_set_short_desc(dfui_progress_get_info(pr), name);
- /* Update the progress bar */
- if (!dfui_be_progress_update(conn, pr, &cancelled))
- abort_backend();
+ /* Update the progress bar */
+ if (!dfui_be_progress_update(conn, pr, &cancelled))
+ abort_backend();
}
int
dist_extract(struct dfui_connection *c, const char *dist) {
- struct inf_file * inf;
- struct archive *a;
- struct archive_entry *entry;
- char basename[PATH_MAX];
- char cwd[PATH_MAX];
+ struct inf_file * inf;
+ struct archive *a;
+ struct archive_entry *entry;
+ char basename[PATH_MAX];
+ char cwd[PATH_MAX];
+ int is_ports = 0;
+ int archive_open;
+ uint32_t size = 0;
+
+ getcwd(cwd, PATH_MAX);
+
+ /* Read the inf file and get the basename of the files to extract */
+ if (dist[0] == 's') {
+ /* This is a source dist */
+ inf = inf_read("src", dist);
+ snprintf(basename, PATH_MAX, "%s/src/%s.", base, dist);
+ } else if (strncmp("ports", dist, 6) == 0) {
+ inf = inf_read(dist, dist);
+ snprintf(basename, PATH_MAX, "%s/%s/%s.tgz", base, dist, dist);
+ is_ports = 1;
+ size = gzip_getsize(basename);
+ } else {
+ inf = inf_read(dist, dist);
+ snprintf(basename, PATH_MAX, "%s/%s/%s.", base, dist, dist);
+ }
+ if (is_ports == 0 && inf == NULL) {
+ /* XXX Problem with inf file */
+ printf("ERROR: No inf file\n");
+ return 1;
+ }
- getcwd(cwd, PATH_MAX);
+ /* Create the progress bar */
+ pr = dfui_progress_new(dfui_info_new(
+ "Extracting",
+ /*
+ * Just call it the ports tree as it will be changed
+ * in the non ports tree case
+ */
+ "Ports Tree",
+ ""),
+ 0);
- if (dist[0] == 's') {
- /* This is a source dist */
- inf = inf_read("src", dist);
- snprintf(basename, PATH_MAX, "%s/src/%s.", base, dist);
- } else {
- inf = inf_read(dist, dist);
- snprintf(basename, PATH_MAX, "%s/%s/%s.", base, dist, dist);
- }
- if (inf == NULL) {
- /* XXX Problem with inf file */
- return 1;
- }
+ if (!dfui_be_progress_begin(c, pr))
+ abort_backend();
+ conn = c;
- pr = dfui_progress_new(dfui_info_new(
- "Extracting",
- "No file",
- ""),
- 0);
+ a = archive_read_new();
+ archive_read_support_compression_all(a);
+ archive_read_support_format_all(a);
- if (!dfui_be_progress_begin(c, pr))
- abort_backend();
- conn = c;
+ if (is_ports == 0) {
+ archive_open = read_open_split(a, basename, (inf->pieces / 26) + 'a',
+ (inf->pieces % 26) + 'a', dist_change_file_callback);
+ } else {
+ archive_open = archive_read_open_file(a, basename, 10240);
+ }
- a = archive_read_new();
- archive_read_support_compression_all(a);
- archive_read_support_format_all(a);
- if(read_open_split(a, basename, (inf->pieces / 26) + 'a',
- (inf->pieces % 26) + 'a', dist_change_file_callback) != ARCHIVE_OK) {
- printf("ERROR: %s\n", archive_error_string(a));
- archive_read_finish(a);
- inf_free(inf);
- dfui_progress_free(pr);
- return 1;
- }
+ if(archive_open != ARCHIVE_OK) {
+ /* XXX change to i_log */
+ printf("ERROR: %s\n", archive_error_string(a));
+ archive_read_finish(a);
+ inf_free(inf);
+ dfui_progress_free(pr);
+ return 1;
+ }
- chdir(location);
- while (archive_read_next_header(a, &entry) == ARCHIVE_OK) {
- archive_read_extract(a, entry, 0);
- archive_read_data_skip(a);
- }
+ chdir(location);
+ while (archive_read_next_header(a, &entry) == ARCHIVE_OK) {
+ archive_read_extract(a, entry, 0);
+ archive_read_data_skip(a);
+ if (is_ports == 1) {
+ /* If this is ports display a bar dependent on the
+ * percent decompressed
+ */
+ uint64_t pos = archive_read_header_position(a);
+ uint32_t pcnt = (uint32_t)(((double)pos/size)*100);
+ dfui_progress_set_amount(pr, pcnt);
+ if (!dfui_be_progress_update(conn, pr, &cancelled))
+ abort_backend();
+ }
+ }
- archive_read_finish(a);
+ archive_read_finish(a);
- chdir(cwd);
- inf_free(inf);
- dfui_progress_free(pr);
+ chdir(cwd);
+ inf_free(inf);
+ dfui_progress_free(pr);
- return 0;
+ return 0;
}
void
dist_set_location(const char *loc) {
- strlcpy(location, loc, PATH_MAX);
+ strlcpy(location, loc, PATH_MAX);
}
void
dist_set_base(const char *path) {
-
- if (path[0] =='/') {
- strlcpy(base, path, PATH_MAX);
- } else {
- char cwd[PATH_MAX];
- getcwd(cwd, PATH_MAX);
- snprintf(base, PATH_MAX, "%s/%s", cwd, path);
- }
+ if (path[0] =='/') {
+ strlcpy(base, path, PATH_MAX);
+ } else {
+ char cwd[PATH_MAX];
+ getcwd(cwd, PATH_MAX);
+ snprintf(base, PATH_MAX, "%s/%s", cwd, path);
+ }
}
==== //depot/projects/soc2005/bsdinstaller/src/usr.sbin/bsdinstaller/backend/extra_flow.c#6 (text+ko) ====
@@ -65,6 +65,7 @@
#ifdef __amd64__
{ "lib32", "32bit Libraries" },
#endif
+ { "ports", "Ports tree" },
{ "src", "Source" },
{ NULL, NULL }
};
==== //depot/projects/soc2005/bsdinstaller/src/usr.sbin/bsdinstaller/backend/fn_install_freebsd.c#7 (text+ko) ====
@@ -184,6 +184,9 @@
return a->result;
}
+/*
+ * Do the actual install
+ */
int
do_install(struct i_fn_args *a)
{
@@ -196,33 +199,43 @@
struct commands *cmds;
struct utsname name;
int install_src = 0;
+ int install_ports = 0;
uname(&name);
+ /* Set base to the location of the dists */
snprintf(base, PATH_MAX, "/usr/%s", name.release);
i_log(a, "<<< Extracting distrubutions from %s", base);
dist_set_base(base);
dist_set_location("/mnt");
- aura_dict_rewind(a->dists);
/*
* Install the selected dists
*/
+ aura_dict_rewind(a->dists);
while (!aura_dict_eof(a->dists)) {
+ /* Set dist_name */
aura_dict_get_current_key(a->dists, &rk, &rk_len);
strlcpy(dist_name, rk, 32);
if (rk_len < 32)
dist_name[rk_len] = '\0';
-
+
+ /* If this dist is special set the correct flag */
if (strncmp("src", dist_name, 4) == 0) {
install_src = 1;
+ } else if (strncmp("ports", dist_name, 6) == 0) {
+ install_ports = 1;
+
+ /* Otherwise install the dist */
} else if( dist_extract(a->c, dist_name) != 0) {
inform(a->c, _("Distribution %s was not installed."), dist_name);
return 0;
}
aura_dict_next(a->dists);
}
+
+ /* The src and ports dists are special and installed last */
if (install_src == 1) {
int src_dist = 0;
dist_set_location("/mnt/usr/src");
@@ -230,6 +243,10 @@
dist_extract(a->c, SrcDistTable[src_dist]);
}
}
+ if (install_ports == 1) {
+ dist_set_location("/mnt/usr");
+ printf("%d\n", dist_extract(a->c, "ports"));
+ }
i_log(a, ">>> Done");
i_log(a, "");
More information about the p4-projects
mailing list