-/* opkg_utils.c - the itsy package management system
+/* opkg_utils.c - the opkg package management system
Steven M. Ayer
void print_pkg_status(pkg_t * pkg, FILE * file);
-int get_available_blocks(char * filesystem)
+long unsigned int get_available_blocks(char * filesystem)
{
- struct statfs sfs;
+ struct statfs sfs;
- if(statfs(filesystem, &sfs)){
- fprintf(stderr, "bad statfs\n");
- return 0;
- }
- /* fprintf(stderr, "reported fs type %x\n", sfs.f_type); */
- return ((sfs.f_bavail * sfs.f_bsize) / 1024);
+ if(statfs(filesystem, &sfs)){
+ fprintf(stderr, "bad statfs\n");
+ return 0;
+ }
+ /* fprintf(stderr, "reported fs type %x\n", sfs.f_type); */
+
+ // Actually ((sfs.f_bavail * sfs.f_bsize) / 1024)
+ // and here we try to avoid overflow.
+ if (sfs.f_bsize >= 1024)
+ return (sfs.f_bavail * (sfs.f_bsize / 1024));
+ else if (sfs.f_bsize > 0)
+ return sfs.f_bavail / (1024 / sfs.f_bsize);
+ fprintf(stderr, "bad statfs f_bsize == 0\n");
+ return 0;
}
char **read_raw_pkgs_from_file(const char *file_name)
int count = 0;
size_t size = 512;
- buf = malloc (size);
+ buf = calloc (1, size);
while (fgets(buf, size, fp)) {
while (strlen (buf) == (size - 1)
char *new;
char *dest, *src, *end;
- new = malloc(strlen(line) + 1);
+ new = calloc(1, strlen(line) + 1);
if ( new == NULL ){
fprintf(stderr,"%s: Unable to allocate memory\n",__FUNCTION__);
return NULL;
return 1;
}
+/*
+ * XXX: this function should not allocate memory as it may be called to
+ * print an error because we are out of memory.
+ */
void push_error_list(struct errlist ** errors, char * msg){
struct errlist *err_lst_tmp;
+ err_lst_tmp = calloc (1, sizeof (struct errlist) );
+ if (err_lst_tmp == NULL) {
+ fprintf(stderr, "%s: calloc: %s\n", __FUNCTION__, strerror(errno));
+ return;
+ }
+
+ err_lst_tmp->errmsg = strdup(msg);
+ if (err_lst_tmp->errmsg == NULL) {
+ fprintf(stderr, "%s: strdup: %s\n", __FUNCTION__, strerror(errno));
+ free(err_lst_tmp);
+ return;
+ }
- err_lst_tmp = malloc ( sizeof (err_lst_tmp) );
- err_lst_tmp->errmsg=strdup(msg) ;
err_lst_tmp->next = *errors;
*errors = err_lst_tmp;
}
}
-void free_error_list(){
+void free_error_list(struct errlist **errors){
struct errlist *err_tmp_lst;
- err_tmp_lst = error_list;
+ err_tmp_lst = *errors;
while (err_tmp_lst != NULL) {
free(err_tmp_lst->errmsg);
err_tmp_lst = error_list->next;
- free(error_list);
- error_list = err_tmp_lst;
+ free(*errors);
+ *errors = err_tmp_lst;
}