DIRS:=applets archival archival/libunarchive coreutils console-tools \
debianutils editors findutils init miscutils modutils networking \
networking/libiproute networking/udhcp procps loginutils shell \
- sysklogd util-linux libbb libpwdgrp
+ sysklogd util-linux libbb libpwdgrp coreutils/libcoreutils
ifeq ($(strip $(HAVE_DOT_CONFIG)),y)
-extern void show_usage(void)
+extern void bb_show_usage(void)
{
const char *format_string;
const char *usage_string = usage_messages;
format_string = "%s\n\nUsage: %s %s\n\n";
if(*usage_string == '\b')
format_string = "%s\n\nNo help available.\n\n";
- fprintf(stderr, format_string, full_version, applet_using->name, usage_string);
+ fprintf(stderr, format_string, bb_msg_full_version, applet_using->name, usage_string);
exit(EXIT_FAILURE);
}
recurse_level++;
/* Do a binary search to find the applet entry given the name. */
if ((applet_using = find_applet_by_name(name)) != NULL) {
- applet_name = applet_using->name;
+ bb_applet_name = applet_using->name;
if (argv[1] && strcmp(argv[1], "--help") == 0) {
if (strcmp(applet_using->name, "busybox")==0) {
if(argv[2])
applet_using = NULL;
}
if(applet_using)
- show_usage();
+ bb_show_usage();
been_there_done_that=1;
busybox_main(0, NULL);
}
m >>= 3;
if (!( m & S_IXOTH )) /* is x bit not set ? */
- error_msg_and_die ( "You have no permission to run this applet!" );
+ bb_error_msg_and_die ( "You have no permission to run this applet!" );
if (( sct-> m_mode & ( S_ISGID | S_IXGRP )) == ( S_ISGID | S_IXGRP )) { /* *both* have to be set for sgid */
if ( setegid ( sct-> m_gid ))
- error_msg_and_die ( "BusyBox binary has insufficient rights to set proper GID for applet!" );
+ bb_error_msg_and_die ( "BusyBox binary has insufficient rights to set proper GID for applet!" );
}
else
setgid ( rgid ); /* no sgid -> drop */
if ( sct-> m_mode & S_ISUID ) {
if ( seteuid ( sct-> m_uid ))
- error_msg_and_die ( "BusyBox binary has insufficient rights to set proper UID for applet!" );
+ bb_error_msg_and_die ( "BusyBox binary has insufficient rights to set proper UID for applet!" );
}
else
setuid ( ruid ); /* no suid -> drop */
if ( applet-> need_suid == _BB_SUID_ALWAYS ) {
if ( geteuid ( ) != 0 )
- error_msg_and_die ( "This applet requires root priviledges!" );
+ bb_error_msg_and_die ( "This applet requires root priviledges!" );
}
else if ( applet-> need_suid == _BB_SUID_NEVER ) {
setgid ( rgid ); /* drop all priviledges */
p = strchr ( buffer, '#' );
if ( p )
*p = 0;
- p = buffer + xstrlen ( buffer );
+ p = buffer + bb_strlen ( buffer );
while (( p > buffer ) && isspace ( *--p ))
*p = 0;
#endif
int been_there_done_that = 0; /* Also used in applets.c */
-const char *applet_name;
+const char *bb_applet_name;
#ifdef CONFIG_FEATURE_INSTALLER
/*
install_dir[applets[i].location], applets[i].name);
rc = Link(busybox, fpc);
if (rc!=0 && errno!=EEXIST) {
- perror_msg("%s", fpc);
+ bb_perror_msg("%s", fpc);
}
free(fpc);
}
{
const char *s;
- applet_name = argv[0];
+ bb_applet_name = argv[0];
- if (applet_name[0] == '-')
- applet_name++;
+ if (bb_applet_name[0] == '-')
+ bb_applet_name++;
- for (s = applet_name; *s != '\0';) {
+ for (s = bb_applet_name; *s != '\0';) {
if (*s++ == '/')
- applet_name = s;
+ bb_applet_name = s;
}
#ifdef CONFIG_LOCALE_SUPPORT
}
#endif
- run_applet_by_name(applet_name, argc, argv);
- error_msg_and_die("applet not found");
+ run_applet_by_name(bb_applet_name, argc, argv);
+ bb_error_msg_and_die("applet not found");
}
"\tutilities into a single executable. Most people will create a\n"
"\tlink to busybox for each function they wish to use, and BusyBox\n"
"\twill act like whatever it was invoked as.\n"
- "\nCurrently defined functions:\n", full_version);
+ "\nCurrently defined functions:\n", bb_msg_full_version);
while (a->name != 0) {
col +=
static void header_verbose_list_ar(const file_header_t *file_header)
{
- const char *mode = mode_string(file_header->mode);
+ const char *mode = bb_mode_string(file_header->mode);
char *mtime;
mtime = ctime(&file_header->mtime);
int dst_fd;
file_header = archive_handle->file_header;
- dst_fd = xopen(file_header->name, O_WRONLY | O_CREAT);
+ dst_fd = bb_xopen(file_header->name, O_WRONLY | O_CREAT);
archive_copy_file(archive_handle, dst_fd);
close(dst_fd);
archive_handle->action_header = header_verbose_list_ar;
break;
default:
- show_usage();
+ bb_show_usage();
}
}
/* check the src filename was specified */
if (optind == argc) {
- show_usage();
+ bb_show_usage();
}
- archive_handle->src_fd = xopen(argv[optind++], O_RDONLY);
+ archive_handle->src_fd = bb_xopen(argv[optind++], O_RDONLY);
/* TODO: This is the same as in tar, seperate function ? */
while (optind < argc) {
#else
archive_xread_all(archive_handle, magic, 7);
if (strncmp(magic, "!<arch>", 7) != 0) {
- error_msg_and_die("Invalid ar magic");
+ bb_error_msg_and_die("Invalid ar magic");
}
archive_handle->offset += 7;
char *delete_name = NULL;
/* if called as bzcat */
- if (strcmp(applet_name, "bzcat") == 0)
+ if (strcmp(bb_applet_name, "bzcat") == 0)
flags |= bunzip_to_stdout;
while ((opt = getopt(argc, argv, "cfh")) != -1) {
break;
case 'h':
default:
- show_usage(); /* exit's inside usage */
+ bb_show_usage(); /* exit's inside usage */
}
}
src_fd = fileno(stdin);
} else {
/* Open input file */
- src_fd = xopen(argv[optind], O_RDONLY);
+ src_fd = bb_xopen(argv[optind], O_RDONLY);
- save_name = xstrdup(argv[optind]);
+ save_name = bb_xstrdup(argv[optind]);
if (strcmp(save_name + strlen(save_name) - 4, ".bz2") != 0)
- error_msg_and_die("Invalid extension");
+ bb_error_msg_and_die("Invalid extension");
save_name[strlen(save_name) - 4] = '\0';
}
/* Check that the input is sane. */
if (isatty(src_fd) && (flags & bunzip_force) == 0) {
- error_msg_and_die("compressed data not read from terminal. Use -f to force it.");
+ bb_error_msg_and_die("compressed data not read from terminal. Use -f to force it.");
}
if (flags & bunzip_to_stdout) {
dst_fd = fileno(stdout);
} else {
- dst_fd = xopen(save_name, O_WRONLY | O_CREAT);
+ dst_fd = bb_xopen(save_name, O_WRONLY | O_CREAT);
}
if (uncompressStream(src_fd, dst_fd)) {
}
if ((delete_name) && (unlink(delete_name) < 0)) {
- error_msg_and_die("Couldn't remove %s", delete_name);
+ bb_error_msg_and_die("Couldn't remove %s", delete_name);
}
return status;
archive_handle->action_header = header_list;
break;
case 'F':
- archive_handle->src_fd = xopen(optarg, O_RDONLY);
+ archive_handle->src_fd = bb_xopen(optarg, O_RDONLY);
archive_handle->seek = seek_by_jump;
break;
default:
- show_usage();
+ bb_show_usage();
}
}
}
}
}
- name_hashtable[probe_address] = xstrdup(key);
+ name_hashtable[probe_address] = bb_xstrdup(key);
return(probe_address);
}
int ret;
if (version1 == NULL) {
- version1 = xstrdup("");
+ version1 = bb_xstrdup("");
}
if (version2 == NULL) {
- version2 = xstrdup("");
+ version2 = bb_xstrdup("");
}
upstream_len1 = strlen(version1);
upstream_len2 = strlen(version2);
while ((len1 < upstream_len1) || (len2 < upstream_len2)) {
/* Compare non-digit section */
tmp_int = strcspn(&version1[len1], "0123456789");
- name1_char = xstrndup(&version1[len1], tmp_int);
+ name1_char = bb_xstrndup(&version1[len1], tmp_int);
len1 += tmp_int;
tmp_int = strcspn(&version2[len2], "0123456789");
- name2_char = xstrndup(&version2[len2], tmp_int);
+ name2_char = bb_xstrndup(&version2[len2], tmp_int);
len2 += tmp_int;
tmp_int = strcmp(name1_char, name2_char);
free(name1_char);
/* Compare digits */
tmp_int = strspn(&version1[len1], "0123456789");
- name1_char = xstrndup(&version1[len1], tmp_int);
+ name1_char = bb_xstrndup(&version1[len1], tmp_int);
len1 += tmp_int;
tmp_int = strspn(&version2[len2], "0123456789");
- name2_char = xstrndup(&version2[len2], tmp_int);
+ name2_char = bb_xstrndup(&version2[len2], tmp_int);
len2 += tmp_int;
ver_num1 = atoi(name1_char);
ver_num2 = atoi(name2_char);
}
/* Compare upstream version */
- upstream_ver1 = xstrdup(ver1_ptr);
- upstream_ver2 = xstrdup(ver2_ptr);
+ upstream_ver1 = bb_xstrdup(ver1_ptr);
+ upstream_ver2 = bb_xstrdup(ver2_ptr);
/* Chop off debian version, and store for later use */
deb_ver1 = strrchr(upstream_ver1, '-');
*/
void add_split_dependencies(common_node_t *parent_node, const char *whole_line, unsigned int edge_type)
{
- char *line = xstrdup(whole_line);
+ char *line = bb_xstrdup(whole_line);
char *line2;
char *line_ptr1 = NULL;
char *line_ptr2 = NULL;
field = strtok_r(line, ",", &line_ptr1);
do {
- line2 = xstrdup(field);
+ line2 = bb_xstrdup(field);
field2 = strtok_r(line2, "|", &line_ptr2);
if ((edge_type == EDGE_DEPENDS) && (strcmp(field, field2) != 0)) {
type = EDGE_OR_DEPENDS;
else if (strncmp(version, ">=", offset_ch) == 0) {
edge->operator = VER_MORE_EQUAL;
} else {
- error_msg_and_die("Illegal operator\n");
+ bb_error_msg_and_die("Illegal operator\n");
}
}
/* skip to start of version numbers */
status_string += strspn(status_string, " ");
}
len = strcspn(status_string, " \n\0");
- state_sub_string = xstrndup(status_string, len);
+ state_sub_string = bb_xstrndup(status_string, len);
state_sub_num = search_name_hashtable(state_sub_string);
free(state_sub_string);
return(state_sub_num);
status_len = new_value_len;
break;
default:
- error_msg_and_die("DEBUG ONLY: this shouldnt happen");
+ bb_error_msg_and_die("DEBUG ONLY: this shouldnt happen");
}
new_status = (char *) xmalloc(want_len + flag_len + status_len + 3);
status_node_t *status_node = NULL;
unsigned int status_num;
- status_file = xfopen(filename, "r");
+ status_file = bb_xfopen(filename, "r");
while ((control_buffer = fgets_str(status_file, "\n\n")) != NULL) {
const unsigned int package_num = fill_package_struct(control_buffer);
if (package_num != -1) {
if (status_line != NULL) {
status_line += 7;
status_line += strspn(status_line, " \n\t");
- status_line = xstrndup(status_line, strcspn(status_line, "\n\0"));
+ status_line = bb_xstrndup(status_line, strcspn(status_line, "\n\0"));
status_node->status = search_name_hashtable(status_line);
free(status_line);
}
/* This could do with a cleanup */
void write_status_file(deb_file_t **deb_file)
{
- FILE *old_status_file = xfopen("/var/lib/dpkg/status", "r");
- FILE *new_status_file = xfopen("/var/lib/dpkg/status.udeb", "w");
+ FILE *old_status_file = bb_xfopen("/var/lib/dpkg/status", "r");
+ FILE *new_status_file = bb_xfopen("/var/lib/dpkg/status.udeb", "w");
char *package_name;
char *status_from_file;
char *control_buffer = NULL;
tmp_string += 8;
tmp_string += strspn(tmp_string, " \n\t");
- package_name = xstrndup(tmp_string, strcspn(tmp_string, "\n\0"));
+ package_name = bb_xstrndup(tmp_string, strcspn(tmp_string, "\n\0"));
write_flag = FALSE;
tmp_string = strstr(control_buffer, "Status:");
if (tmp_string != NULL) {
/* Seperate the status value from the control buffer */
tmp_string += 7;
tmp_string += strspn(tmp_string, " \n\t");
- status_from_file = xstrndup(tmp_string, strcspn(tmp_string, "\n"));
+ status_from_file = bb_xstrndup(tmp_string, strcspn(tmp_string, "\n"));
} else {
status_from_file = NULL;
}
}
/* This is temperary, debugging only */
if (deb_file[i] == NULL) {
- error_msg_and_die("ALERT: Couldnt find a control file, your status file may be broken, status may be incorrect for %s", package_name);
+ bb_error_msg_and_die("ALERT: Couldnt find a control file, your status file may be broken, status may be incorrect for %s", package_name);
}
}
else if (strcmp("not-installed", name_hashtable[state_status]) == 0) {
if (rename("/var/lib/dpkg/status", "/var/lib/dpkg/status.udeb.bak") == -1) {
struct stat stat_buf;
if (stat("/var/lib/dpkg/status", &stat_buf) == 0) {
- error_msg_and_die("Couldnt create backup status file");
+ bb_error_msg_and_die("Couldnt create backup status file");
}
/* Its ok if renaming the status file fails becasue status
* file doesnt exist, maybe we are starting from scratch */
- error_msg("No status file found, creating new one");
+ bb_error_msg("No status file found, creating new one");
}
if (rename("/var/lib/dpkg/status.udeb", "/var/lib/dpkg/status") == -1) {
- error_msg_and_die("DANGER: Couldnt create status file, you need to manually repair your status file");
+ bb_error_msg_and_die("DANGER: Couldnt create status file, you need to manually repair your status file");
}
}
}
if (result) {
- error_msg_and_die("Package %s conflicts with %s",
+ bb_error_msg_and_die("Package %s conflicts with %s",
name_hashtable[package_node->name],
name_hashtable[package_edge->name]);
}
}
if (result) {
- error_msg_and_die("Package %s pre-depends on %s, but it is not installed",
+ bb_error_msg_and_die("Package %s pre-depends on %s, but it is not installed",
name_hashtable[package_node->name],
name_hashtable[package_edge->name]);
}
}
/* It must be already installed, or to be installed */
if (result) {
- error_msg_and_die("Package %s depends on %s, but it is not installed, or flaged to be installed",
+ bb_error_msg_and_die("Package %s depends on %s, but it is not installed, or flaged to be installed",
name_hashtable[package_node->name],
name_hashtable[package_edge->name]);
}
return(NULL);
}
- while ((line = get_line_from_file(list_stream)) != NULL) {
+ while ((line = bb_get_chomped_line_from_file(list_stream)) != NULL) {
file_list = xrealloc(file_list, sizeof(char *) * (count + 2));
- chomp(line);
file_list[count] = line;
count++;
}
/* run prerm script */
return_value = run_package_script(package_name, "prerm");
if (return_value == -1) {
- error_msg_and_die("script failed, prerm failure");
+ bb_error_msg_and_die("script failed, prerm failure");
}
/* Create a list of files to remove, and a seperate list of those to keep */
/* Create a list of files in /var/lib/dpkg/info/<package>.* to keep */
exclude_files = xmalloc(sizeof(char*) * 3);
- exclude_files[0] = xstrdup(conffile_name);
+ exclude_files[0] = bb_xstrdup(conffile_name);
exclude_files[1] = xmalloc(package_name_length + 27);
sprintf(exclude_files[1], "/var/lib/dpkg/info/%s.postrm", package_name);
exclude_files[2] = NULL;
/* run prerm script */
if (run_package_script(package_name, "prerm") != 0) {
- error_msg_and_die("script failed, prerm failure");
+ bb_error_msg_and_die("script failed, prerm failure");
}
/* Create a list of files to remove */
/* run postrm script */
if (run_package_script(package_name, "postrm") == -1) {
- error_msg_and_die("postrm fialure.. set status to what?");
+ bb_error_msg_and_die("postrm fialure.. set status to what?");
}
/* Change package status */
/* Setup an ar archive handle that refers to the gzip sub archive */
ar_handle = init_handle();
ar_handle->filter = filter_accept_list_reassign;
- ar_handle->src_fd = xopen(filename, O_RDONLY);
+ ar_handle->src_fd = bb_xopen(filename, O_RDONLY);
return(ar_handle);
}
/* Run the preinst prior to extracting */
if (run_package_script(package_name, "preinst") != 0) {
/* when preinst returns exit code != 0 then quit installation process */
- error_msg_and_die("subprocess pre-installation script returned error.");
+ bb_error_msg_and_die("subprocess pre-installation script returned error.");
}
/* Extract data.tar.gz to the root directory */
/* Create the list file */
strcat(info_prefix, "list");
- out_stream = xfopen(info_prefix, "w");
+ out_stream = bb_xfopen(info_prefix, "w");
while (archive_handle->passed) {
/* blindly skip over the leading '.' */
fputs(archive_handle->passed->data + 1, out_stream);
/* Run the postinst script */
if (run_package_script(package_name, "postinst") != 0) {
/* TODO: handle failure gracefully */
- error_msg_and_die("postrm failure.. set status to what?");
+ bb_error_msg_and_die("postrm failure.. set status to what?");
}
/* Change status to reflect success */
set_status(status_num, "install", 1);
dpkg_opt |= dpkg_opt_filename;
break;
default:
- show_usage();
+ bb_show_usage();
}
}
/* check for non-otion argument if expected */
if ((dpkg_opt == 0) || ((argc == optind) && !(dpkg_opt && dpkg_opt_list_installed))) {
- show_usage();
+ bb_show_usage();
}
/* puts("(Reading database ... xxxxx files and directories installed.)"); */
init_archive_deb_control(archive_handle);
deb_file[deb_count]->control_file = deb_extract_control_file_to_buffer(archive_handle, control_list);
if (deb_file[deb_count]->control_file == NULL) {
- error_msg_and_die("Couldnt extract control file");
+ bb_error_msg_and_die("Couldnt extract control file");
}
- deb_file[deb_count]->filename = xstrdup(argv[optind]);
+ deb_file[deb_count]->filename = bb_xstrdup(argv[optind]);
package_num = fill_package_struct(deb_file[deb_count]->control_file);
if (package_num == -1) {
- error_msg("Invalid control file in %s", argv[optind]);
+ bb_error_msg("Invalid control file in %s", argv[optind]);
continue;
}
deb_file[deb_count]->package = (unsigned int) package_num;
search_name_hashtable(argv[optind]),
search_name_hashtable("ANY"), VER_ANY);
if (package_hashtable[deb_file[deb_count]->package] == NULL) {
- error_msg_and_die("Package %s is uninstalled or unknown\n", argv[optind]);
+ bb_error_msg_and_die("Package %s is uninstalled or unknown\n", argv[optind]);
}
state_status = get_status(search_status_hashtable(name_hashtable[package_hashtable[deb_file[deb_count]->package]->name]), 3);
if (dpkg_opt & dpkg_opt_remove) {
if ((strcmp(name_hashtable[state_status], "not-installed") == 0) ||
(strcmp(name_hashtable[state_status], "config-files") == 0)) {
- error_msg_and_die("%s is already removed.", name_hashtable[package_hashtable[deb_file[deb_count]->package]->name]);
+ bb_error_msg_and_die("%s is already removed.", name_hashtable[package_hashtable[deb_file[deb_count]->package]->name]);
}
}
else if (dpkg_opt & dpkg_opt_purge) {
/* if package status is "conf-files" then its ok */
if (strcmp(name_hashtable[state_status], "not-installed") == 0) {
- error_msg_and_die("%s is already purged.", name_hashtable[package_hashtable[deb_file[deb_count]->package]->name]);
+ bb_error_msg_and_die("%s is already purged.", name_hashtable[package_hashtable[deb_file[deb_count]->package]->name]);
}
}
}
/* TODO: check dependencies before removing */
if ((dpkg_opt & dpkg_opt_force_ignore_depends) != dpkg_opt_force_ignore_depends) {
if (!check_deps(deb_file, 0, deb_count)) {
- error_msg_and_die("Dependency check failed");
+ bb_error_msg_and_die("Dependency check failed");
}
}
tar_archive->action_data = data_extract_all;
break;
default:
- show_usage();
+ bb_show_usage();
}
}
if (optind + 2 < argc) {
- show_usage();
+ bb_show_usage();
}
- tar_archive->src_fd = ar_archive->src_fd = xopen(argv[optind++], O_RDONLY);
+ tar_archive->src_fd = ar_archive->src_fd = bb_xopen(argv[optind++], O_RDONLY);
/* Workout where to extract the files */
/* 2nd argument is a dir name */
int opt;
/* if called as zcat */
- if (strcmp(applet_name, "zcat") == 0) {
+ if (strcmp(bb_applet_name, "zcat") == 0) {
flags |= gunzip_to_stdout;
}
case 'd': /* Used to convert gzip to gunzip. */
break;
default:
- show_usage(); /* exit's inside usage */
+ bb_show_usage(); /* exit's inside usage */
}
}
src_fd = fileno(stdin);
flags |= gunzip_to_stdout;
} else {
- src_fd = xopen(old_path, O_RDONLY);
+ src_fd = bb_xopen(old_path, O_RDONLY);
/* Get the time stamp on the input file. */
if (stat(old_path, &stat_buf) < 0) {
- error_msg_and_die("Couldn't stat file %s", old_path);
+ bb_error_msg_and_die("Couldn't stat file %s", old_path);
}
}
/* Check that the input is sane. */
if (isatty(src_fd) && ((flags & gunzip_force) == 0)) {
- error_msg_and_die
+ bb_error_msg_and_die
("compressed data not read from terminal. Use -f to force it.");
}
/* Set output filename and number */
if (flags & gunzip_test) {
- dst_fd = xopen("/dev/null", O_WRONLY); /* why does test use filenum 2 ? */
+ dst_fd = bb_xopen("/dev/null", O_WRONLY); /* why does test use filenum 2 ? */
} else if (flags & gunzip_to_stdout) {
dst_fd = fileno(stdout);
} else {
char *extension;
- new_path = xstrdup(old_path);
+ new_path = bb_xstrdup(old_path);
extension = strrchr(new_path, '.');
#ifdef CONFIG_FEATURE_GUNZIP_UNCOMPRESS
extension[2] = 'a';
extension[3] = 'r';
} else {
- error_msg_and_die("Invalid extension");
+ bb_error_msg_and_die("Invalid extension");
}
/* Open output file */
- dst_fd = xopen(new_path, O_WRONLY | O_CREAT);
+ dst_fd = bb_xopen(new_path, O_WRONLY | O_CREAT);
/* Set permissions on the file */
chmod(new_path, stat_buf.st_mode);
}
/* do the decompression, and cleanup */
- if (xread_char(src_fd) == 0x1f) {
+ if (bb_xread_char(src_fd) == 0x1f) {
unsigned char magic2;
- magic2 = xread_char(src_fd);
+ magic2 = bb_xread_char(src_fd);
#ifdef CONFIG_FEATURE_GUNZIP_UNCOMPRESS
if (magic2 == 0x9d) {
status = uncompress(src_fd, dst_fd);
check_header_gzip(src_fd);
status = inflate(src_fd, dst_fd);
if (status != 0) {
- error_msg_and_die("Error inflating");
+ bb_error_msg_and_die("Error inflating");
}
check_trailer_gzip(src_fd);
} else {
- error_msg_and_die("Invalid magic");
+ bb_error_msg_and_die("Invalid magic");
}
} else {
- error_msg_and_die("Invalid magic");
+ bb_error_msg_and_die("Invalid magic");
}
if ((status != EXIT_SUCCESS) && (new_path)) {
/* delete_path will be NULL if in test mode or from stdin */
if (delete_path && (unlink(delete_path) == -1)) {
- error_msg_and_die("Couldn't remove %s", delete_path);
+ bb_error_msg_and_die("Couldn't remove %s", delete_path);
}
free(new_path);
/* Diagnostic functions */
#ifdef DEBUG
-# define Assert(cond,msg) {if(!(cond)) error_msg(msg);}
+# define Assert(cond,msg) {if(!(cond)) bb_error_msg(msg);}
# define Trace(x) fprintf x
# define Tracev(x) {if (verbose) fprintf x ;}
# define Tracevv(x) {if (verbose>1) fprintf x ;}
bytes_in = 0L;
}
-static void write_error_msg(void)
+static void write_bb_error_msg(void)
{
fputc('\n', stderr);
- perror_msg("");
+ bb_perror_nomsg();
abort_gzip();
}
while ((n = write(fd, buf, cnt)) != cnt) {
if (n == (unsigned) (-1)) {
- write_error_msg();
+ write_bb_error_msg();
}
cnt -= n;
buf = (void *) ((char *) buf + n);
/* check that the match is indeed a match */
if (memcmp((char *) window + match,
(char *) window + start, length) != EQUAL) {
- error_msg(" start %d, match %d, length %d", start, match, length);
- error_msg("invalid match");
+ bb_error_msg(" start %d, match %d, length %d", start, match, length);
+ bb_error_msg("invalid match");
}
if (verbose > 1) {
- error_msg("\\[%d,%d]", start - match, length);
+ bb_error_msg("\\[%d,%d]", start - match, length);
do {
putc(window[start++], stderr);
} while (--length != 0);
return gunzip_main(argc, argv);
#endif
default:
- show_usage();
+ bb_show_usage();
}
}
} else {
inFileNum = open(argv[i], O_RDONLY);
if (inFileNum < 0 || fstat(inFileNum, &statBuf) < 0)
- perror_msg_and_die("%s", argv[i]);
+ bb_perror_msg_and_die("%s", argv[i]);
time_stamp = statBuf.st_ctime;
ifile_size = statBuf.st_size;
outFileNum = open(path, O_RDWR | O_CREAT | O_EXCL);
#endif
if (outFileNum < 0) {
- perror_msg("%s", path);
+ bb_perror_msg("%s", path);
free(path);
continue;
}
}
if (path == NULL && isatty(outFileNum) && force == 0) {
- error_msg
+ bb_error_msg
("compressed data not written to a terminal. Use -f to force compression.");
free(path);
continue;
delFileName = path;
if (unlink(delFileName) < 0)
- perror_msg("%s", delFileName);
+ bb_perror_msg("%s", delFileName);
}
free(path);
#else /* DEBUG */
# define send_code(c, tree) \
- { if (verbose>1) error_msg("\ncd %3d ",(c)); \
+ { if (verbose>1) bb_error_msg("\ncd %3d ",(c)); \
send_bits(tree[c].Code, tree[c].Len); }
#endif
tree[n].Dad = tree[m].Dad = (ush) node;
#ifdef DUMP_BL_TREE
if (tree == bl_tree) {
- error_msg("\nnode %d(%d), sons %d(%d) %d(%d)",
+ bb_error_msg("\nnode %d(%d), sons %d(%d) %d(%d)",
node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
}
#endif
if (stored_len <= opt_lenb && eof && compressed_len == 0L && seekable()) {
/* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */
if (buf == (char *) 0)
- error_msg("block vanished");
+ bb_error_msg("block vanished");
copy_block(buf, (unsigned) stored_len, 0); /* without header */
compressed_len = stored_len << 3;
bin_freq += dyn_ltree[n++].Freq;
*file_type = bin_freq > (ascii_freq >> 2) ? BINARY : ASCII;
if (*file_type == BINARY && translate_eol) {
- error_msg("-l used on binary file");
+ bb_error_msg("-l used on binary file");
}
}
size = archive_xread(archive_handle, buffer, size);
if (write(dst_fd, buffer, size) != size) {
- error_msg_and_die ("Short write");
+ bb_error_msg_and_die ("Short write");
}
chunksize -= size;
}
size = archive_handle->read(archive_handle->src_fd, buf, count);
if (size == -1) {
- perror_msg_and_die("Read error");
+ bb_perror_msg_and_die("Read error");
}
return(size);
size = archive_xread(archive_handle, buf, count);
if (size != count) {
- error_msg_and_die("Short read");
+ bb_error_msg_and_die("Short read");
}
return;
}
size = archive_xread(archive_handle, buf, count);
if ((size != 0) && (size != count)) {
- perror_msg_and_die("Short read, read %d of %d", size, count);
+ bb_perror_msg_and_die("Short read, read %d of %d", size, count);
}
return(size);
}
} formated;
} header;
- xread_all(src_fd, header.raw, 8);
+ bb_xread_all(src_fd, header.raw, 8);
/* Check the compression method */
if (header.formated.method != 8) {
- error_msg_and_die("Unknown compression method %d",
+ bb_error_msg_and_die("Unknown compression method %d",
header.formated.method);
}
/* bit 2 set: extra field present */
unsigned char extra_short;
- extra_short = xread_char(src_fd) + (xread_char(src_fd) << 8);
+ extra_short = bb_xread_char(src_fd) + (bb_xread_char(src_fd) << 8);
while (extra_short > 0) {
/* Ignore extra field */
- xread_char(src_fd);
+ bb_xread_char(src_fd);
extra_short--;
}
}
/* Discard original name if any */
if (header.formated.flags & 0x08) {
/* bit 3 set: original file name present */
- while(xread_char(src_fd) != 0);
+ while(bb_xread_char(src_fd) != 0);
}
/* Discard file comment if any */
if (header.formated.flags & 0x10) {
/* bit 4 set: file comment present */
- while(xread_char(src_fd) != 0);
+ while(bb_xread_char(src_fd) != 0);
}
/* Read the header checksum */
if (header.formated.flags & 0x02) {
- xread_char(src_fd);
- xread_char(src_fd);
+ bb_xread_char(src_fd);
+ bb_xread_char(src_fd);
}
return;
int res;
if (archive_handle->flags & ARCHIVE_CREATE_LEADING_DIRS) {
- char *name = xstrdup(file_header->name);
- make_directory (dirname(name), 0777, FILEUTILS_RECUR);
+ char *name = bb_xstrdup(file_header->name);
+ bb_make_directory (dirname(name), 0777, FILEUTILS_RECUR);
free(name);
}
/* hard link */
res = link(file_header->link_name, file_header->name);
if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
- perror_msg("Couldnt create hard link");
+ bb_perror_msg("Couldnt create hard link");
}
} else
#endif
{
/* Regular file */
- dst_fd = xopen(file_header->name, O_WRONLY | O_CREAT);
+ dst_fd = bb_xopen(file_header->name, O_WRONLY | O_CREAT);
archive_copy_file(archive_handle, dst_fd);
close(dst_fd);
}
unlink(file_header->name);
res = mkdir(file_header->name, file_header->mode);
if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
- perror_msg("extract_archive: %s", file_header->name);
+ bb_perror_msg("extract_archive: %s", file_header->name);
}
break;
case S_IFLNK:
unlink(file_header->name);
res = symlink(file_header->link_name, file_header->name);
if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
- perror_msg("Cannot create symlink from %s to '%s'", file_header->name, file_header->link_name);
+ bb_perror_msg("Cannot create symlink from %s to '%s'", file_header->name, file_header->link_name);
}
break;
case S_IFSOCK:
unlink(file_header->name);
res = mknod(file_header->name, file_header->mode, file_header->device);
if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
- perror_msg("Cannot create node %s", file_header->name);
+ bb_perror_msg("Cannot create node %s", file_header->name);
}
break;
default:
- error_msg_and_die("Unrecognised file type");
+ bb_error_msg_and_die("Unrecognised file type");
}
chmod(file_header->name, file_header->mode);
while (1) {
if (bzf->strm.avail_in == 0) {
- n = xread(bzf->fd, bzf->buf, BZ_MAX_UNUSED);
+ n = bb_xread(bzf->fd, bzf->buf, BZ_MAX_UNUSED);
if (n == 0) {
break;
}
ret = BZ2_bzDecompress(&(bzf->strm));
if ((ret != BZ_OK) && (ret != BZ_STREAM_END)) {
- error_msg_and_die("Error decompressing");
+ bb_error_msg_and_die("Error decompressing");
}
if (ret == BZ_STREAM_END) {
while (bzerr == BZ_OK) {
nread = read_bz2(src_fd, obuf, 5000);
if (bzerr == BZ_DATA_ERROR_MAGIC) {
- error_msg_and_die("invalid magic");
+ bb_error_msg_and_die("invalid magic");
}
if (((bzerr == BZ_OK) || (bzerr == BZ_STREAM_END)) && (nread > 0)) {
if (write(dst_fd, obuf, nread) != nread) {
BZ2_bzReadClose();
- perror_msg_and_die("Couldnt write to file");
+ bb_perror_msg_and_die("Couldnt write to file");
}
}
}
insize = 0;
- inbuf[0] = xread_char(fd_in);
+ inbuf[0] = bb_xread_char(fd_in);
maxbits = inbuf[0] & BIT_MASK;
block_mode = inbuf[0] & BLOCK_MODE;
maxmaxcode = MAXCODE(maxbits);
if (maxbits > BITS) {
- error_msg("compressed with %d bits, can only handle %d bits", maxbits,
+ bb_error_msg("compressed with %d bits, can only handle %d bits", maxbits,
BITS);
return -1;
}
posbits -= n_bits;
p = &inbuf[posbits >> 3];
- error_msg
+ bb_error_msg
("insize:%d posbits:%d inbuf:%02X %02X %02X %02X %02X (%d)",
insize, posbits, p[-1], p[0], p[1], p[2], p[3],
(posbits & 07));
- error_msg("uncompress: corrupt input");
+ bb_error_msg("uncompress: corrupt input");
return -1;
}
/* Leave the first 4 bytes empty so we can always unwind the bitbuffer
* to the front of the bytebuffer, leave 4 bytes free at end of tail
* so we can easily top up buffer in check_trailer_gzip() */
- bytebuffer_size = 4 + xread(gunzip_src_fd, &bytebuffer[4], BYTEBUFFER_MAX - 8);
+ bytebuffer_size = 4 + bb_xread(gunzip_src_fd, &bytebuffer[4], BYTEBUFFER_MAX - 8);
bytebuffer_offset = 4;
}
}
if ((e = (t = tl + ((unsigned) b & ml))->e) > 16)
do {
if (e == 99) {
- error_msg_and_die("inflate_codes error 1");;
+ bb_error_msg_and_die("inflate_codes error 1");;
}
b >>= t->b;
k -= t->b;
if ((e = (t = td + ((unsigned) b & md))->e) > 16)
do {
if (e == 99)
- error_msg_and_die("inflate_codes error 2");;
+ bb_error_msg_and_die("inflate_codes error 2");;
b >>= t->b;
k -= t->b;
e -= 16;
if ((i = huft_build(ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) {
if (i == 1) {
- error_msg_and_die("Incomplete literal tree");
+ bb_error_msg_and_die("Incomplete literal tree");
huft_free(tl);
}
return i; /* incomplete code set */
bd = dbits;
if ((i = huft_build(ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) {
if (i == 1) {
- error_msg_and_die("incomplete distance tree");
+ bb_error_msg_and_die("incomplete distance tree");
huft_free(td);
}
huft_free(tl);
}
default:
/* bad block type */
- error_msg_and_die("bad block type %d\n", t);
+ bb_error_msg_and_die("bad block type %d\n", t);
}
}
break;
case -2: ret = inflate_codes(0,0,0,0,0);
break;
- default: error_msg_and_die("inflate error %d", method);
+ default: bb_error_msg_and_die("inflate error %d", method);
}
if (ret == 1) {
ssize_t nread, nwrote;
GZ_gzReadOpen(in, 0, 0);
- while(1) { // Robbed from copyfd.c
+ while(1) { // Robbed from bb_copyfd.c
nread = read_gz(in, buf, sizeof(buf));
if (nread == 0) break; // no data to write
else if (nread == -1) {
- perror_msg("read");
+ bb_perror_msg("read");
return -1;
}
- nwrote = full_write(out, buf, nread);
+ nwrote = bb_full_write(out, buf, nread);
if (nwrote == -1) {
- perror_msg("write");
+ bb_perror_msg("write");
return -1;
}
}
GZ_gzReadOpen(in, 0, 0);
while(1) {
int ret = inflate_get_next_window();
- nwrote = full_write(out, gunzip_window, gunzip_outbuf_count);
+ nwrote = bb_full_write(out, gunzip_window, gunzip_outbuf_count);
if (nwrote == -1) {
- perror_msg("write");
+ bb_perror_msg("write");
return -1;
}
if (ret == 0) break;
/* top up the input buffer with the rest of the trailer */
count = bytebuffer_size - bytebuffer_offset;
if (count < 8) {
- xread_all(src_fd, &bytebuffer[bytebuffer_size], 8 - count);
+ bb_xread_all(src_fd, &bytebuffer[bytebuffer_size], 8 - count);
bytebuffer_size += 8 - count;
}
for (count = 0; count != 4; count++) {
/* Validate decompression - crc */
if (stored_crc != (gunzip_crc ^ 0xffffffffL)) {
- error_msg_and_die("crc error");
+ bb_error_msg_and_die("crc error");
}
/* Validate decompression - size */
if (gunzip_bytes_out !=
(bytebuffer[bytebuffer_offset] | (bytebuffer[bytebuffer_offset+1] << 8) |
(bytebuffer[bytebuffer_offset+2] << 16) | (bytebuffer[bytebuffer_offset+3] << 24))) {
- error_msg_and_die("Incorrect length, but crc is correct");
+ bb_error_msg_and_die("Incorrect length, but crc is correct");
}
}
static unsigned int ar_long_name_size;
#endif
- /* dont use xread as we want to handle the error ourself */
+ /* dont use bb_xread as we want to handle the error ourself */
if (read(archive_handle->src_fd, ar.raw, 60) != 60) {
/* End Of File */
return(EXIT_FAILURE);
if (ar.raw[0] == '\n') {
/* fix up the header, we started reading 1 byte too early */
memmove(ar.raw, &ar.raw[1], 59);
- ar.raw[59] = xread_char(archive_handle->src_fd);
+ ar.raw[59] = bb_xread_char(archive_handle->src_fd);
archive_handle->offset++;
}
archive_handle->offset += 60;
/* align the headers based on the header magic */
if ((ar.formated.magic[0] != '`') || (ar.formated.magic[1] != '\n')) {
- error_msg_and_die("Invalid ar header");
+ bb_error_msg_and_die("Invalid ar header");
}
typed->mode = strtol(ar.formated.mode, NULL, 8);
* in static variable long_names for use in future entries */
ar_long_name_size = typed->size;
ar_long_names = xmalloc(ar_long_name_size);
- xread_all(archive_handle->src_fd, ar_long_names, ar_long_name_size);
+ bb_xread_all(archive_handle->src_fd, ar_long_names, ar_long_name_size);
archive_handle->offset += ar_long_name_size;
/* This ar entries data section only contained filenames for other records
* they are stored in the static ar_long_names for future reference */
(saved in variable long_name) that conatains the real filename */
const unsigned int long_offset = atoi(&ar.formated.name[1]);
if (long_offset >= ar_long_name_size) {
- error_msg_and_die("Cant resolve long filename");
+ bb_error_msg_and_die("Cant resolve long filename");
}
- typed->name = xstrdup(ar_long_names + long_offset);
+ typed->name = bb_xstrdup(ar_long_names + long_offset);
}
#else
- error_msg_and_die("long filenames not supported");
+ bb_error_msg_and_die("long filenames not supported");
#endif
} else {
/* short filenames */
- typed->name = xstrndup(ar.formated.name, 16);
+ typed->name = bb_xstrndup(ar.formated.name, 16);
}
typed->name[strcspn(typed->name, " /")] = '\0';
oldtmp = NULL;
while (tmp) {
- error_msg_and_die("need to fix this\n");
+ bb_error_msg_and_die("need to fix this\n");
if (tmp->entry->link_name) { /* Found a hardlink ready to be extracted */
file_header = tmp->entry;
if (oldtmp) {
cpio_header[2],
cpio_header[3],
cpio_header[4]);
- error_msg_and_die("Unsupported cpio format");
+ bb_error_msg_and_die("Unsupported cpio format");
}
if ((cpio_header[5] != '1') && (cpio_header[5] != '2')) {
- error_msg_and_die("Unsupported cpio format, use newc or crc");
+ bb_error_msg_and_die("Unsupported cpio format, use newc or crc");
}
{
hardlinks_t *tmp = saved_hardlinks;
hardlinks_t *oldtmp = NULL;
while (tmp) {
- error_msg("%s not created: cannot resolve hardlink", tmp->entry->name);
+ bb_error_msg("%s not created: cannot resolve hardlink", tmp->entry->name);
oldtmp = tmp;
tmp = tmp->next;
free (oldtmp->entry->name);
pending_hardlinks = 1;
while (tmp) {
if (tmp->inode == inode) {
- tmp->entry->link_name = xstrdup(file_header->name);
+ tmp->entry->link_name = bb_xstrdup(file_header->name);
nlink--;
}
tmp = tmp->next;
}
if (nlink > 1) {
- error_msg("error resolving hardlink: did you create the archive with GNU cpio 2.0-2.2?");
+ bb_error_msg("error resolving hardlink: did you create the archive with GNU cpio 2.0-2.2?");
}
}
}
if ((archive_handle->flags & ARCHIVE_EXTRACT_UNCONDITIONAL) || (statbuf.st_mtime < file_header->mtime)) {
/* Remove file if flag set or its older than the file to be extracted */
if (unlink(file_header->name) == -1) {
- perror_msg_and_die("Couldnt remove old file");
+ bb_perror_msg_and_die("Couldnt remove old file");
}
} else {
if (! archive_handle->flags & ARCHIVE_EXTRACT_QUIET) {
- error_msg("%s not created: newer or same age file exists", file_header->name);
+ bb_error_msg("%s not created: newer or same age file exists", file_header->name);
}
extract_flag = FALSE;
}
#ifdef CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY
if (strncmp(tar.formated.magic, "\0\0\0\0\0", 5) != 0)
#endif
- error_msg_and_die("Invalid tar magic");
+ bb_error_msg_and_die("Invalid tar magic");
}
/* Do checksum on headers */
for (i = 0; i < 148 ; i++) {
sum += tar.raw[i];
}
if (sum != strtol(tar.formated.chksum, NULL, 8)) {
- error_msg("Invalid tar header checksum");
+ bb_error_msg("Invalid tar header checksum");
return(EXIT_FAILURE);
}
file_header->size = strtol(tar.formated.size, NULL, 8);
file_header->mtime = strtol(tar.formated.mtime, NULL, 8);
file_header->link_name = (tar.formated.linkname[0] != '\0') ?
- xstrdup(tar.formated.linkname) : NULL;
+ bb_xstrdup(tar.formated.linkname) : NULL;
file_header->device = (dev_t) ((strtol(tar.formated.devmajor, NULL, 8) << 8) +
strtol(tar.formated.devminor, NULL, 8));
file_header->mode |= S_IFREG;
break;
case '1':
- error_msg("Internal hard link not supported");
+ bb_error_msg("Internal hard link not supported");
break;
case '2':
file_header->mode |= S_IFLNK;
case 'N':
case 'S':
case 'V':
- error_msg("Ignoring GNU extension type %c", tar.formated.typeflag);
+ bb_error_msg("Ignoring GNU extension type %c", tar.formated.typeflag);
# endif
}
#endif
archive_xread_all(archive_handle, &magic, 2);
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
- error_msg_and_die("Invalid gzip magic");
+ bb_error_msg_and_die("Invalid gzip magic");
}
check_header_gzip(archive_handle->src_fd);
struct tm *mtime = localtime(&file_header->mtime);
printf("%s %d/%d%10u %4u-%02u-%02u %02u:%02u:%02u %s",
- mode_string(file_header->mode),
+ bb_mode_string(file_header->mode),
file_header->uid,
file_header->gid,
(unsigned int) file_header->size,
seek_by_char(archive_handle, amount);
} else
#endif
- perror_msg_and_die("Seek failure");
+ bb_perror_msg_and_die("Seek failure");
}
}
insize = 0;
- inbuf[0] = xread_char(fd_in);
+ inbuf[0] = bb_xread_char(fd_in);
maxbits = inbuf[0] & BIT_MASK;
block_mode = inbuf[0] & BLOCK_MODE;
maxmaxcode = MAXCODE(maxbits);
if (maxbits > BITS) {
- error_msg("compressed with %d bits, can only handle %d bits", maxbits,
+ bb_error_msg("compressed with %d bits, can only handle %d bits", maxbits,
BITS);
return -1;
}
posbits -= n_bits;
p = &inbuf[posbits >> 3];
- error_msg
+ bb_error_msg
("insize:%d posbits:%d inbuf:%02X %02X %02X %02X %02X (%d)",
insize, posbits, p[-1], p[0], p[1], p[2], p[3],
(posbits & 07));
- error_msg("uncompress: corrupt input");
+ bb_error_msg("uncompress: corrupt input");
return -1;
}
archive_xread_all(ar_archive, magic, 7);
if (strncmp(magic, "!<arch>", 7) != 0) {
- error_msg_and_die("Invalid ar magic");
+ bb_error_msg_and_die("Invalid ar magic");
}
ar_archive->offset += 7;
/* Leave the first 4 bytes empty so we can always unwind the bitbuffer
* to the front of the bytebuffer, leave 4 bytes free at end of tail
* so we can easily top up buffer in check_trailer_gzip() */
- bytebuffer_size = 4 + xread(gunzip_src_fd, &bytebuffer[4], BYTEBUFFER_MAX - 8);
+ bytebuffer_size = 4 + bb_xread(gunzip_src_fd, &bytebuffer[4], BYTEBUFFER_MAX - 8);
bytebuffer_offset = 4;
}
}
if ((e = (t = tl + ((unsigned) b & ml))->e) > 16)
do {
if (e == 99) {
- error_msg_and_die("inflate_codes error 1");;
+ bb_error_msg_and_die("inflate_codes error 1");;
}
b >>= t->b;
k -= t->b;
if ((e = (t = td + ((unsigned) b & md))->e) > 16)
do {
if (e == 99)
- error_msg_and_die("inflate_codes error 2");;
+ bb_error_msg_and_die("inflate_codes error 2");;
b >>= t->b;
k -= t->b;
e -= 16;
if ((i = huft_build(ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) {
if (i == 1) {
- error_msg_and_die("Incomplete literal tree");
+ bb_error_msg_and_die("Incomplete literal tree");
huft_free(tl);
}
return i; /* incomplete code set */
bd = dbits;
if ((i = huft_build(ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) {
if (i == 1) {
- error_msg_and_die("incomplete distance tree");
+ bb_error_msg_and_die("incomplete distance tree");
huft_free(td);
}
huft_free(tl);
}
default:
/* bad block type */
- error_msg_and_die("bad block type %d\n", t);
+ bb_error_msg_and_die("bad block type %d\n", t);
}
}
break;
case -2: ret = inflate_codes(0,0,0,0,0);
break;
- default: error_msg_and_die("inflate error %d", method);
+ default: bb_error_msg_and_die("inflate error %d", method);
}
if (ret == 1) {
ssize_t nread, nwrote;
GZ_gzReadOpen(in, 0, 0);
- while(1) { // Robbed from copyfd.c
+ while(1) { // Robbed from bb_copyfd.c
nread = read_gz(in, buf, sizeof(buf));
if (nread == 0) break; // no data to write
else if (nread == -1) {
- perror_msg("read");
+ bb_perror_msg("read");
return -1;
}
- nwrote = full_write(out, buf, nread);
+ nwrote = bb_full_write(out, buf, nread);
if (nwrote == -1) {
- perror_msg("write");
+ bb_perror_msg("write");
return -1;
}
}
GZ_gzReadOpen(in, 0, 0);
while(1) {
int ret = inflate_get_next_window();
- nwrote = full_write(out, gunzip_window, gunzip_outbuf_count);
+ nwrote = bb_full_write(out, gunzip_window, gunzip_outbuf_count);
if (nwrote == -1) {
- perror_msg("write");
+ bb_perror_msg("write");
return -1;
}
if (ret == 0) break;
/* top up the input buffer with the rest of the trailer */
count = bytebuffer_size - bytebuffer_offset;
if (count < 8) {
- xread_all(src_fd, &bytebuffer[bytebuffer_size], 8 - count);
+ bb_xread_all(src_fd, &bytebuffer[bytebuffer_size], 8 - count);
bytebuffer_size += 8 - count;
}
for (count = 0; count != 4; count++) {
/* Validate decompression - crc */
if (stored_crc != (gunzip_crc ^ 0xffffffffL)) {
- error_msg_and_die("crc error");
+ bb_error_msg_and_die("crc error");
}
/* Validate decompression - size */
if (gunzip_bytes_out !=
(bytebuffer[bytebuffer_offset] | (bytebuffer[bytebuffer_offset+1] << 8) |
(bytebuffer[bytebuffer_offset+2] << 16) | (bytebuffer[bytebuffer_offset+3] << 24))) {
- error_msg_and_die("Incorrect length, but crc is correct");
+ bb_error_msg_and_die("Incorrect length, but crc is correct");
}
}
break;
case 'q': // First arg: Query mode
if (!func) func |= rpm_query;
- else show_usage();
+ else bb_show_usage();
break;
case 'p': // Query a package
func |= rpm_query_package;
func |= rpm_query_list_config;
break;
default:
- show_usage();
+ bb_show_usage();
}
}
- if (optind == argc) show_usage();
+ if (optind == argc) bb_show_usage();
while (optind < argc) {
- rpm_fd = xopen(argv[optind], O_RDONLY);
+ rpm_fd = bb_xopen(argv[optind], O_RDONLY);
mytags = rpm_gettags(rpm_fd, (int *) &tagcount);
offset = lseek(rpm_fd, 0, SEEK_CUR);
if (!mytags) { printf("Error reading rpm header\n"); exit(-1); }
archive_handle->src_fd = fd;
archive_handle->offset = 0;
- xread_all(archive_handle->src_fd, &magic, 2);
+ bb_xread_all(archive_handle->src_fd, &magic, 2);
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
- error_msg_and_die("Invalid gzip magic");
+ bb_error_msg_and_die("Invalid gzip magic");
}
check_header_gzip(archive_handle->src_fd);
chdir("/"); // Install RPM's to root
if (rpm_getint(RPMTAG_FILEFLAGS, fileref) & RPMFILE_CONFIG) { /* Only need to backup config files */
stat_res = lstat (filename, &oldfile);
if (stat_res == 0 && S_ISREG(oldfile.st_mode)) { /* File already exists - really should check MD5's etc to see if different */
- newname = xstrdup(filename);
+ newname = bb_xstrdup(filename);
newname = strcat(newname, ".rpmorig");
copy_file(filename, newname, FILEUTILS_RECUR | FILEUTILS_PRESERVE_STATUS);
remove_file(filename, FILEUTILS_RECUR | FILEUTILS_FORCE);
{
struct rpm_header header;
- xread_all(rpm_fd, &header, sizeof(struct rpm_header));
+ bb_xread_all(rpm_fd, &header, sizeof(struct rpm_header));
if (strncmp((char *) &header.magic, RPM_HEADER_MAGIC, 3) != 0) {
- error_msg_and_die("Invalid RPM header magic"); /* Invalid magic */
+ bb_error_msg_and_die("Invalid RPM header magic"); /* Invalid magic */
}
if (header.version != 1) {
- error_msg_and_die("Unsupported RPM header version"); /* This program only supports v1 headers */
+ bb_error_msg_and_die("Unsupported RPM header version"); /* This program only supports v1 headers */
}
header.entries = ntohl(header.entries);
header.size = ntohl(header.size);
if (argc == 1) {
rpm_fd = fileno(stdin);
} else {
- rpm_fd = xopen(argv[1], O_RDONLY);
+ rpm_fd = bb_xopen(argv[1], O_RDONLY);
}
- xread_all(rpm_fd, &lead, sizeof(struct rpm_lead));
+ bb_xread_all(rpm_fd, &lead, sizeof(struct rpm_lead));
if (strncmp((char *) &lead.magic, RPM_MAGIC, 4) != 0) {
- error_msg_and_die("Invalid RPM magic"); /* Just check the magic, the rest is irrelevant */
+ bb_error_msg_and_die("Invalid RPM magic"); /* Just check the magic, the rest is irrelevant */
}
/* Skip the signature header */
/* Skip the main header */
skip_header(rpm_fd);
- xread_all(rpm_fd, &magic, 2);
+ bb_xread_all(rpm_fd, &magic, 2);
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
- error_msg_and_die("Invalid gzip magic");
+ bb_error_msg_and_die("Invalid gzip magic");
}
check_header_gzip(rpm_fd);
if (inflate(rpm_fd, fileno(stdout)) != 0) {
- error_msg("Error inflating");
+ bb_error_msg("Error inflating");
}
check_trailer_gzip(rpm_fd);
header.typeflag = REGTYPE;
putOctal(header.size, sizeof(header.size), statbuf->st_size);
} else {
- error_msg("%s: Unknown file type", real_name);
+ bb_error_msg("%s: Unknown file type", real_name);
return (FALSE);
}
/* Now write the header out to disk */
if ((size =
- full_write(tbInfo->tarFd, (char *) &header,
+ bb_full_write(tbInfo->tarFd, (char *) &header,
sizeof(struct TarHeader))) < 0) {
- error_msg(io_error, real_name);
+ bb_error_msg(bb_msg_io_error, real_name);
return (FALSE);
}
/* Pad the header up to the tar block size */
/* It is against the rules to archive a socket */
if (S_ISSOCK(statbuf->st_mode)) {
- error_msg("%s: socket ignored", fileName);
+ bb_error_msg("%s: socket ignored", fileName);
return (TRUE);
}
* the new tarball */
if (tbInfo->statBuf.st_dev == statbuf->st_dev &&
tbInfo->statBuf.st_ino == statbuf->st_ino) {
- error_msg("%s: file is the archive; skipping", fileName);
+ bb_error_msg("%s: file is the archive; skipping", fileName);
return (TRUE);
}
static int alreadyWarned = FALSE;
if (alreadyWarned == FALSE) {
- error_msg("Removing leading '/' from member names");
+ bb_error_msg("Removing leading '/' from member names");
alreadyWarned = TRUE;
}
header_name++;
}
if (strlen(fileName) >= NAME_SIZE) {
- error_msg(name_longer_than_foo, NAME_SIZE);
+ bb_error_msg(bb_msg_name_longer_than_foo, NAME_SIZE);
return (TRUE);
}
/* open the file we want to archive, and make sure all is well */
if ((inputFileFd = open(fileName, O_RDONLY)) < 0) {
- perror_msg("%s: Cannot open", fileName);
+ bb_perror_msg("%s: Cannot open", fileName);
return (FALSE);
}
/* write the file to the archive */
- while ((size = full_read(inputFileFd, buffer, sizeof(buffer))) > 0) {
- if (full_write(tbInfo->tarFd, buffer, size) != size) {
+ while ((size = bb_full_read(inputFileFd, buffer, sizeof(buffer))) > 0) {
+ if (bb_full_write(tbInfo->tarFd, buffer, size) != size) {
/* Output file seems to have a problem */
- error_msg(io_error, fileName);
+ bb_error_msg(bb_msg_io_error, fileName);
return (FALSE);
}
readSize += size;
}
if (size == -1) {
- error_msg(io_error, fileName);
+ bb_error_msg(bb_msg_io_error, fileName);
return (FALSE);
}
/* Pad the file up to the tar block size */
/* Make sure there is at least one file to tar up. */
if (include == NULL) {
- error_msg_and_die("Cowardly refusing to create an empty archive");
+ bb_error_msg_and_die("Cowardly refusing to create an empty archive");
}
/* Open the tar file for writing. */
}
if (tbInfo.tarFd < 0) {
- perror_msg("%s: Cannot open", tarName);
+ bb_perror_msg("%s: Cannot open", tarName);
freeHardLinkInfo(&tbInfo.hlInfoHead);
return (FALSE);
}
/* Store the stat info for the tarball's file, so
* can avoid including the tarball into itself.... */
if (fstat(tbInfo.tarFd, &tbInfo.statBuf) < 0)
- error_msg_and_die(io_error, tarName);
+ bb_error_msg_and_die(bb_msg_io_error, tarName);
#ifdef CONFIG_FEATURE_TAR_GZIP
if (gzip) {
if (pipe(gzipDataPipe) < 0 || pipe(gzipStatusPipe) < 0) {
- perror_msg_and_die("Failed to create gzip pipe");
+ bb_perror_msg_and_die("Failed to create gzip pipe");
}
signal(SIGPIPE, SIG_IGN); /* we only want EPIPE on errors */
if (n == 0 && vfork_exec_errno != 0) {
errno = vfork_exec_errno;
- perror_msg_and_die("Could not exec gzip process");
+ bb_perror_msg_and_die("Could not exec gzip process");
} else if ((n < 0) && (errno == EAGAIN || errno == EINTR))
continue; /* try it again */
break;
tbInfo.tarFd = gzipDataPipe[1];
} else {
- perror_msg_and_die("Failed to vfork gzip process");
+ bb_perror_msg_and_die("Failed to vfork gzip process");
}
}
#endif
/* Hang up the tools, close up shop, head home */
close(tbInfo.tarFd);
if (errorFlag)
- error_msg("Error exit delayed from previous errors");
+ bb_error_msg("Error exit delayed from previous errors");
freeHardLinkInfo(&tbInfo.hlInfoHead);
#ifdef CONFIG_FEATURE_TAR_EXCLUDE
static llist_t *append_file_list_to_list(const char *filename, llist_t *list)
{
- FILE *src_stream = xfopen(filename, "r");
+ FILE *src_stream = bb_xfopen(filename, "r");
char *line;
- while((line = get_line_from_file(src_stream)) != NULL) {
- chomp(line);
+ while((line = bb_get_chomped_line_from_file(src_stream)) != NULL) {
list = llist_add_to(list, line);
}
fclose(src_stream);
unsigned char ctx_flag = 0;
if (argc < 2) {
- show_usage();
+ bb_show_usage();
}
/* Prepend '-' to the first argument if required */
break;
#endif
default:
- show_usage();
+ bb_show_usage();
}
}
/* Check one and only one context option was given */
if ((ctx_flag != CTX_CREATE) && (ctx_flag != CTX_TEST) && (ctx_flag != CTX_EXTRACT)) {
- show_usage();
+ bb_show_usage();
}
/* Check if we are reading from stdin */
tar_handle->src_fd = fileno(stdin);
tar_handle->seek = seek_by_char;
} else {
- tar_handle->src_fd = xopen(tar_filename, O_RDONLY);
+ tar_handle->src_fd = bb_xopen(tar_filename, O_RDONLY);
}
if ((base_dir) && (chdir(base_dir))) {
- perror_msg_and_die("Couldnt chdir");
+ bb_perror_msg_and_die("Couldnt chdir");
}
while (get_header_ptr(tar_handle) == EXIT_SUCCESS);
while (tar_handle->accept) {
if (find_list_entry(tar_handle->reject, tar_handle->accept->data) == NULL) {
if (find_list_entry(tar_handle->passed, tar_handle->accept->data) == NULL) {
- error_msg_and_die("%s: Not found in archive\n", tar_handle->accept->data);
+ bb_error_msg_and_die("%s: Not found in archive\n", tar_handle->accept->data);
}
}
tar_handle->accept = tar_handle->accept->link;
flags |= gunzip_force;
break;
default:
- show_usage(); /* exit's inside usage */
+ bb_show_usage(); /* exit's inside usage */
}
}
src_fd = fileno(stdin);
flags |= gunzip_to_stdout;
} else {
- src_fd = xopen(old_path, O_RDONLY);
+ src_fd = bb_xopen(old_path, O_RDONLY);
/* Get the time stamp on the input file. */
if (stat(old_path, &stat_buf) < 0) {
- error_msg_and_die("Couldn't stat file %s", old_path);
+ bb_error_msg_and_die("Couldn't stat file %s", old_path);
}
}
/* Check that the input is sane. */
if (isatty(src_fd) && ((flags & gunzip_force) == 0)) {
- error_msg_and_die
+ bb_error_msg_and_die
("compressed data not read from terminal. Use -f to force it.");
}
} else {
char *extension;
- new_path = xstrdup(old_path);
+ new_path = bb_xstrdup(old_path);
extension = strrchr(new_path, '.');
if (!extension || (strcmp(extension, ".Z") != 0)) {
- error_msg_and_die("Invalid extension");
+ bb_error_msg_and_die("Invalid extension");
}
*extension = '\0';
/* Open output file */
- dst_fd = xopen(new_path, O_WRONLY | O_CREAT);
+ dst_fd = bb_xopen(new_path, O_WRONLY | O_CREAT);
/* Set permissions on the file */
chmod(new_path, stat_buf.st_mode);
}
/* do the decompression, and cleanup */
- if ((xread_char(src_fd) == 0x1f) && (xread_char(src_fd) == 0x9d)) {
+ if ((bb_xread_char(src_fd) == 0x1f) && (bb_xread_char(src_fd) == 0x9d)) {
status = uncompress(src_fd, dst_fd);
} else {
- error_msg_and_die("Invalid magic");
+ bb_error_msg_and_die("Invalid magic");
}
if ((status != EXIT_SUCCESS) && (new_path)) {
/* delete_path will be NULL if in test mode or from stdin */
if (delete_path && (unlink(delete_path) == -1)) {
- error_msg_and_die("Couldn't remove %s", delete_path);
+ bb_error_msg_and_die("Couldn't remove %s", delete_path);
}
free(new_path);
break;
#endif
default:
- show_usage();
+ bb_show_usage();
}
}
if (argc == optind) {
- show_usage();
+ bb_show_usage();
}
printf("Archive: %s\n", argv[optind]);
archive_handle->src_fd = fileno(stdin);
archive_handle->seek = seek_by_char;
} else {
- archive_handle->src_fd = xopen(argv[optind++], O_RDONLY);
+ archive_handle->src_fd = bb_xopen(argv[optind++], O_RDONLY);
}
if ((base_dir) && (chdir(base_dir))) {
- perror_msg_and_die("Couldnt chdir");
+ bb_perror_msg_and_die("Couldnt chdir");
}
while (optind < argc) {
break;
}
else if (magic != ZIP_FILEHEADER_MAGIC) {
- error_msg_and_die("Invlaide zip magic");
+ bb_error_msg_and_die("Invlaide zip magic");
}
/* Read the file header */
archive_handle->file_header->mode = S_IFREG | 0777;
if (zip_header.formated.method != 8) {
- error_msg_and_die("Unsupported compression method %d\n", zip_header.formated.method);
+ bb_error_msg_and_die("Unsupported compression method %d\n", zip_header.formated.method);
}
/* Read filename */
if (archive_handle->action_data) {
archive_handle->action_data(archive_handle);
} else {
- dst_fd = xopen(archive_handle->file_header->name, O_WRONLY | O_CREAT);
+ dst_fd = bb_xopen(archive_handle->file_header->name, O_WRONLY | O_CREAT);
inflate(archive_handle->src_fd, dst_fd);
close(dst_fd);
chmod(archive_handle->file_header->name, archive_handle->file_header->mode);
/* Validate decompression - crc */
if (zip_header.formated.crc32 != (gunzip_crc ^ 0xffffffffL)) {
- error_msg("Invalid compressed data--crc error");
+ bb_error_msg("Invalid compressed data--crc error");
}
/* Validate decompression - size */
if (gunzip_bytes_out != zip_header.formated.ucmpsize) {
- error_msg("Invalid compressed data--length error");
+ bb_error_msg("Invalid compressed data--length error");
}
}
int fd, num;
if ((argc != 2) || (**(argv + 1) == '-'))
- show_usage();
+ bb_show_usage();
fd = get_console_fd();
num = atoi(argv[1]);
if (ioctl(fd, VT_ACTIVATE, num))
- perror_msg_and_die("VT_ACTIVATE");
+ bb_perror_msg_and_die("VT_ACTIVATE");
if (ioctl(fd, VT_WAITACTIVE, num))
- perror_msg_and_die("VT_WAITACTIVE");
+ bb_perror_msg_and_die("VT_WAITACTIVE");
return EXIT_SUCCESS;
}
//if ((argc > 2) || ((argv == 2) && (**(argv + 1) == '-')))
if (argc > 2)
- show_usage();
+ bb_show_usage();
fd = get_console_fd();
if (argc == 1) {
/* deallocate all unused consoles */
if (ioctl(fd, VT_DISALLOCATE, 0))
- perror_msg_and_die("VT_DISALLOCATE");
+ bb_perror_msg_and_die("VT_DISALLOCATE");
} else {
for (i = 1; i < argc; i++) {
num = atoi(argv[i]);
if (num == 0)
- error_msg("0: illegal VT number");
+ bb_error_msg("0: illegal VT number");
else if (num == 1)
- error_msg("VT 1 cannot be deallocated");
+ bb_error_msg("VT 1 cannot be deallocated");
else if (ioctl(fd, VT_DISALLOCATE, num))
- perror_msg_and_die("VT_DISALLOCATE");
+ bb_perror_msg_and_die("VT_DISALLOCATE");
}
}
char flags[MAX_NR_KEYMAPS], magic[] = "bkeymap";
if (argc>=2 && *argv[1]=='-') {
- show_usage();
+ bb_show_usage();
}
fd = open(CURRENT_VC, O_RDWR);
if (fd < 0) {
- perror_msg("Error opening " CURRENT_VC);
+ bb_perror_msg("Error opening " CURRENT_VC);
return EXIT_FAILURE;
}
ke.kb_table = i;
if (ioctl(fd, KDGKBENT, &ke) < 0) {
- error_msg("ioctl returned: %m, %s, %s, %xqq", (char *)&ke.kb_index,(char *)&ke.kb_table,(int)&ke.kb_value);
+ bb_error_msg("ioctl returned: %m, %s, %s, %xqq", (char *)&ke.kb_index,(char *)&ke.kb_table,(int)&ke.kb_value);
}
else {
write(1,(void*)&ke.kb_value,2);
int fd;
if (argc>=2 && *argv[1]=='-') {
- show_usage();
+ bb_show_usage();
}
fd = open(CURRENT_VC, O_RDWR);
if (fd < 0) {
- perror_msg_and_die("Error opening " CURRENT_VC);
+ bb_perror_msg_and_die("Error opening " CURRENT_VC);
}
if (screen_map_load(fd, stdin)) {
- perror_msg_and_die("Error loading acm");
+ bb_perror_msg_and_die("Error loading acm");
}
write(fd, "\033(K", 3);
int is_unicode;
if (fstat(fileno(fp), &stbuf))
- perror_msg_and_die("Cannot stat map file");
+ bb_perror_msg_and_die("Cannot stat map file");
/* first try a UTF screen-map: either ASCII (no restriction) or binary (regular file) */
if (!
if (parse_failed) {
if (-1 == fseek(fp, 0, SEEK_SET)) {
if (errno == ESPIPE)
- error_msg_and_die("16bit screen-map MUST be a regular file.");
+ bb_error_msg_and_die("16bit screen-map MUST be a regular file.");
else
- perror_msg_and_die("fseek failed reading binary 16bit screen-map");
+ bb_perror_msg_and_die("fseek failed reading binary 16bit screen-map");
}
if (fread(wbuf, sizeof(unicode) * E_TABSZ, 1, fp) != 1)
- perror_msg_and_die("Cannot read [new] map from file");
+ bb_perror_msg_and_die("Cannot read [new] map from file");
#if 0
else
- error_msg("Input screen-map is binary.");
+ bb_error_msg("Input screen-map is binary.");
#endif
}
/* same if it was binary, ie. if parse_failed */
if (parse_failed || is_unicode) {
if (ioctl(fd, PIO_UNISCRNMAP, wbuf))
- perror_msg_and_die("PIO_UNISCRNMAP ioctl");
+ bb_perror_msg_and_die("PIO_UNISCRNMAP ioctl");
else
return 0;
}
/* rewind... */
if (-1 == fseek(fp, 0, SEEK_SET)) {
if (errno == ESPIPE)
- error_msg("Assuming 8bit screen-map - MUST be a regular file."),
+ bb_error_msg("Assuming 8bit screen-map - MUST be a regular file."),
exit(1);
else
- perror_msg_and_die("fseek failed assuming 8bit screen-map");
+ bb_perror_msg_and_die("fseek failed assuming 8bit screen-map");
}
/* ... and try an old 8-bit screen-map */
if (-1 == fseek(fp, 0, SEEK_SET)) {
if (errno == ESPIPE)
/* should not - it succedeed above */
- error_msg_and_die("fseek() returned ESPIPE !");
+ bb_error_msg_and_die("fseek() returned ESPIPE !");
else
- perror_msg_and_die("fseek for binary 8bit screen-map");
+ bb_perror_msg_and_die("fseek for binary 8bit screen-map");
}
if (fread(buf, E_TABSZ, 1, fp) != 1)
- perror_msg_and_die("Cannot read [old] map from file");
+ bb_perror_msg_and_die("Cannot read [old] map from file");
#if 0
else
- error_msg("Input screen-map is binary.");
+ bb_error_msg("Input screen-map is binary.");
#endif
}
if (ioctl(fd, PIO_SCRNMAP, buf))
- perror_msg_and_die("PIO_SCRNMAP ioctl");
+ bb_perror_msg_and_die("PIO_SCRNMAP ioctl");
else
return 0;
}
- error_msg("Error parsing symbolic map");
+ bb_error_msg("Error parsing symbolic map");
return(1);
}
if (feof(fp))
break;
else
- perror_msg_and_die("uni_screen_map_read_ascii() can't read line");
+ bb_perror_msg_and_die("uni_screen_map_read_ascii() can't read line");
}
/* get "charset-relative charcode", stripping leading spaces */
int fd;
if (argc != 1)
- show_usage();
+ bb_show_usage();
fd = open(CURRENT_VC, O_RDWR);
if (fd < 0)
- perror_msg_and_die("Error opening " CURRENT_VC);
+ bb_perror_msg_and_die("Error opening " CURRENT_VC);
loadnewfont(fd);
return EXIT_SUCCESS;
memset(buf, 0, sizeof(buf));
if (unit < 1 || unit > 32)
- error_msg_and_die("Bad character size %d", unit);
+ bb_error_msg_and_die("Bad character size %d", unit);
for (i = 0; i < fontsize; i++)
memcpy(buf + (32 * i), inbuf + (unit * i), unit);
if (ioctl(fd, PIO_FONTX, &cfd) == 0)
return; /* success */
- perror_msg("PIO_FONTX ioctl error (trying PIO_FONT)");
+ bb_perror_msg("PIO_FONTX ioctl error (trying PIO_FONT)");
}
#endif
if (ioctl(fd, PIO_FONT, buf))
- perror_msg_and_die("PIO_FONT ioctl error");
+ bb_perror_msg_and_die("PIO_FONT ioctl error");
}
static void
if (ioctl(fd, PIO_UNIMAPCLR, &advice)) {
#ifdef ENOIOCTLCMD
if (errno == ENOIOCTLCMD) {
- error_msg("It seems this kernel is older than 1.1.92");
- error_msg_and_die("No Unicode mapping table loaded.");
+ bb_error_msg("It seems this kernel is older than 1.1.92");
+ bb_error_msg_and_die("No Unicode mapping table loaded.");
} else
#endif
- perror_msg_and_die("PIO_UNIMAPCLR");
+ bb_perror_msg_and_die("PIO_UNIMAPCLR");
}
ud.entry_ct = ct;
ud.entries = up;
/* change advice parameters */
}
#endif
- perror_msg_and_die("PIO_UNIMAP");
+ bb_perror_msg_and_die("PIO_UNIMAP");
}
}
*/
inputlth = fread(inbuf, 1, sizeof(inbuf), stdin);
if (ferror(stdin))
- perror_msg_and_die("Error reading input font");
+ bb_perror_msg_and_die("Error reading input font");
/* use malloc/realloc in case of giant files;
maybe these do not occur: 16kB for the font,
and 16kB for the map leaves 32 unicode values
for each font position */
if (!feof(stdin))
- perror_msg_and_die("Font too large");
+ bb_perror_msg_and_die("Font too large");
/* test for psf first */
{
goto no_psf;
if (psfhdr.mode > PSF_MAXMODE)
- error_msg_and_die("Unsupported psf file mode");
+ bb_error_msg_and_die("Unsupported psf file mode");
fontsize = ((psfhdr.mode & PSF_MODE512) ? 512 : 256);
#if !defined( PIO_FONTX ) || defined( __sparc__ )
if (fontsize != 256)
- error_msg_and_die("Only fontsize 256 supported");
+ bb_error_msg_and_die("Only fontsize 256 supported");
#endif
hastable = (psfhdr.mode & PSF_MODEHASTAB);
unit = psfhdr.charsize;
head = head0 + fontsize * unit;
if (head > inputlth || (!hastable && head != inputlth))
- error_msg_and_die("Input file: bad length");
+ bb_error_msg_and_die("Input file: bad length");
do_loadfont(fd, inbuf + head0, unit, fontsize);
if (hastable)
do_loadtable(fd, inbuf + head, inputlth - head, fontsize);
} else {
/* bare font */
if (inputlth & 0377)
- error_msg_and_die("Bad input file size");
+ bb_error_msg_and_die("Bad input file size");
offset = 0;
unit = inputlth / 256;
}
char flags[MAX_NR_KEYMAPS], buff[7];
if (argc != 1)
- show_usage();
+ bb_show_usage();
fd = open(CURRENT_VC, O_RDWR);
if (fd < 0)
- perror_msg_and_die("Error opening " CURRENT_VC);
+ bb_perror_msg_and_die("Error opening " CURRENT_VC);
read(0, buff, 7);
if (0 != strncmp(buff, BINARY_KEYMAP_MAGIC, 7))
- error_msg_and_die("This is not a valid binary keymap.");
+ bb_error_msg_and_die("This is not a valid binary keymap.");
if (MAX_NR_KEYMAPS != read(0, flags, MAX_NR_KEYMAPS))
- perror_msg_and_die("Error reading keymap flags");
+ bb_perror_msg_and_die("Error reading keymap flags");
ibuff = (u_short *) xmalloc(ibuffsz);
pos = 0;
while (pos < ibuffsz) {
if ((readsz = read(0, (char *) ibuff + pos, ibuffsz - pos)) < 0)
- perror_msg_and_die("Error reading keymap");
+ bb_perror_msg_and_die("Error reading keymap");
pos += readsz;
}
for (j = 0; j < NR_KEYS; j++) {
char * cmd_args = NULL;
if (argc < 3)
- show_usage();
+ bb_show_usage();
if (!isdigit(argv[1][0]))
- show_usage();
+ bb_show_usage();
vtno = (int) atol(argv[1]);
/* if (vtno <= 0 || vtno > 63) */
if (vtno <= 0 || vtno > 12)
- error_msg_and_die("Illegal vt number (%d)", vtno);
+ bb_error_msg_and_die("Illegal vt number (%d)", vtno);
sprintf(vtname, VTNAME, vtno);
if (setsid() < 0) {
#endif
- perror_msg_and_die("Unable to set new session");
+ bb_perror_msg_and_die("Unable to set new session");
}
close(0); /* so that new vt becomes stdin */
/* and grab new one */
if ((fd = open(vtname, O_RDWR)) == -1)
- perror_msg_and_die("could not open %s", vtname);
+ bb_perror_msg_and_die("could not open %s", vtname);
/* Reassign stdout and sterr */
close(1);
struct kbkeycode a;
if (argc % 2 != 1 || argc < 2) {
- show_usage();
+ bb_show_usage();
}
fd = get_console_fd();
a.keycode = atoi(argv[2]);
a.scancode = sc = strtol(argv[1], &ep, 16);
if (*ep) {
- error_msg_and_die("error reading SCANCODE: '%s'", argv[1]);
+ bb_error_msg_and_die("error reading SCANCODE: '%s'", argv[1]);
}
if (a.scancode > 127) {
a.scancode -= 0xe000;
a.scancode += 128;
}
if (a.scancode > 255 || a.keycode > 127) {
- error_msg_and_die("SCANCODE or KEYCODE outside bounds");
+ bb_error_msg_and_die("SCANCODE or KEYCODE outside bounds");
}
if (ioctl(fd,KDSETKEYCODE,&a)) {
perror("KDSETKEYCODE");
- error_msg_and_die("failed to set SCANCODE %x to KEYCODE %d", sc, a.keycode);
+ bb_error_msg_and_die("failed to set SCANCODE %x to KEYCODE %d", sc, a.keycode);
}
argc -= 2;
argv += 2;
Please submit a patch to add help text for this item.
config CONFIG_DU
- bool "du"
+ bool "du (default blocksize of 512 bytes)"
default n
help
Please submit a patch to add help text for this item.
+config CONFIG_FEATURE_DU_DEFALT_BLOCKSIZE_1K
+ bool " Use a default blocksize of 1024 bytes (1K)"
+ default y
+ depends on CONFIG_DU
+ help
+ Please submit a patch to add help text for this item.
+
config CONFIG_ECHO
- bool "echo"
+ bool "echo (basic SUSv3 version taking no options"
default n
help
Please submit a patch to add help text for this item.
+config CONFIG_FEATURE_FANCY_ECHO
+ bool " Enable echo options (-n and -e)"
+ default y
+ depends on CONFIG_ECHO
+ help
+ Please submit a patch to add help text for this item.
+
config CONFIG_ENV
bool "env"
default n
help
Please submit a patch to add help text for this item.
+config CONFIG_FEATURE_FANCY_HEAD
+ bool " Enable head options (-c, -q, and -v)"
+ default n
+ depends on CONFIG_HEAD
+ help
+ Please submit a patch to add help text for this item.
+
config CONFIG_HOSTID
bool "hostid"
default n
Compute and check SHA1 message digest
config CONFIG_SLEEP
- bool "sleep"
+ bool "sleep (single integer arg with no suffix)"
+ default n
+ help
+ Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_FANCY_SLEEP
+ bool " Enable multiple integer args and optional time suffixes"
default n
+ depends on CONFIG_SLEEP
help
Please submit a patch to add help text for this item.
help
Please submit a patch to add help text for this item.
+config CONFIG_FEATURE_TEE_USE_BLOCK_IO
+ bool " Enable block i/o (larger/faster) instead of byte i/o."
+ default n
+ depends on CONFIG_TEE
+ help
+ Please submit a patch to add help text for this item.
+
if CONFIG_ASH || CONFIG_HUSH || CONFIG_LASH || CONFIG_MSH
config CONFIG_TEST
default y
*
*/
-/* getopt not needed */
+/* BB_AUDIT SUSv3 compliant */
+/* http://www.opengroup.org/onlinepubs/007904975/utilities/basename.html */
+
+
+/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
+ *
+ * Changes:
+ * 1) Now checks for too many args. Need at least one and at most two.
+ * 2) Don't check for options, as per SUSv3.
+ * 3) Save some space by using strcmp(). Calling strncmp() here was silly.
+ */
#include <stdlib.h>
-#include "busybox.h"
+#include <stdio.h>
#include <string.h>
+#include "busybox.h"
extern int basename_main(int argc, char **argv)
{
- int m, n;
+ size_t m, n;
char *s;
- if ((argc < 2) || (**(argv + 1) == '-')) {
- show_usage();
+ if (((unsigned int)(argc-2)) >= 2) {
+ bb_show_usage();
}
- argv++;
-
- s = get_last_path_component(*argv);
+ s = bb_get_last_path_component(*++argv);
- if (argc>2) {
- argv++;
+ if (*++argv) {
n = strlen(*argv);
m = strlen(s);
- if (m>n && strncmp(s+m-n, *argv, n)==0)
+ if ((m > n) && ((strcmp)(s+m-n, *argv) == 0)) {
s[m-n] = '\0';
+ }
}
+
puts(s);
- return EXIT_SUCCESS;
+
+ bb_fflush_stdout_and_exit(EXIT_SUCCESS);
}
+/* NOTE:
+ *
+ * Apparently, all "Steven J. Merrifield" did was grab the util-linux cal applet,
+ * spend maybe 5 minutes integrating it into busybox, slapped a copyright on it,
+ * and submitted it. I certainly saw no evidence of any attempt at size reduction.
+ * Not only do I consider his copyright below meaningless, I also consider his
+ * actions shameful.
+ *
+ * Manuel Novoa III (mjn3@codepoet.org)
+ */
+
/*
* Calendar implementation for busybox
*
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
-
+
+/* BB_AUDIT SUSv3 compliant with -j and -y extensions (from util-linux). */
+/* BB_AUDIT BUG: The output of 'cal -j 1752' is incorrect. The upstream
+ * BB_AUDIT BUG: version in util-linux seems to be broken as well. */
+/* http://www.opengroup.org/onlinepubs/007904975/utilities/cal.html */
+
+/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
+ *
+ * Major size reduction... over 50% (>1.5k) on i386.
+ */
#include <sys/types.h>
#include <ctype.h>
#define MAXDAYS 42 /* max slots in a month array */
#define SPACE -1 /* used in day array */
-static int days_in_month[2][13] = {
- {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
- {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
+static const char days_in_month[] = {
+ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
-int sep1752[MAXDAYS] = {
- SPACE, SPACE, 1, 2, 14, 15, 16,
+static const char sep1752[] = {
+ 1, 2, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23,
- 24, 25, 26, 27, 28, 29, 30,
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
-}, j_sep1752[MAXDAYS] = {
- SPACE, SPACE, 245, 246, 258, 259, 260,
- 261, 262, 263, 264, 265, 266, 267,
- 268, 269, 270, 271, 272, 273, 274,
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
-}, empty[MAXDAYS] = {
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
+ 24, 25, 26, 27, 28, 29, 30
};
-char *month_names[12];
-
-char day_headings[] = " ";
-char j_day_headings[] = " ";
+static int julian;
/* leap year -- account for gregorian reformation in 1752 */
#define leap_year(yr) \
((yr) <= 1752 ? !((yr) % 4) : \
(!((yr) % 4) && ((yr) % 100)) || !((yr) % 400))
+static int is_leap_year(int year)
+{
+ return leap_year(year);
+}
+#undef leap_year
+#define leap_year(yr) is_leap_year(yr)
+
/* number of centuries since 1700, not inclusive */
#define centuries_since_1700(yr) \
((yr) > 1700 ? (yr) / 100 - 17 : 0)
#define leap_years_since_year_1(yr) \
((yr) / 4 - centuries_since_1700(yr) + quad_centuries_since_1700(yr))
-int julian;
-void ascii_day __P((char *, int));
-void center __P((char *, int, int));
-void day_array __P((int, int, int *));
-int day_in_week __P((int, int, int));
-int day_in_year __P((int, int, int));
-void j_yearly __P((int));
-void monthly __P((int, int));
-void trim_trailing_spaces __P((char *));
-void yearly __P((int));
+static void center __P((char *, int, int));
+static void day_array __P((int, int, int *));
+static void trim_trailing_spaces_and_print __P((char *));
+
+static void blank_string(char *buf, size_t buflen);
+static char *build_row(char *p, int *dp);
+
+#define DAY_LEN 3 /* 3 spaces per day */
+#define J_DAY_LEN (DAY_LEN + 1)
+#define WEEK_LEN 20 /* 7 * 3 - one space at the end */
+#define J_WEEK_LEN (WEEK_LEN + 7)
+#define HEAD_SEP 2 /* spaces between day headings */
int cal_main(int argc, char **argv)
{
struct tm *local_time;
- static struct tm zero_tm;
+ struct tm zero_tm;
time_t now;
- int ch, month, year, yflag, i;
+ int month, year, flags, i;
+ char *month_names[12];
+ char day_headings[28]; /* 28 for julian, 21 for nonjulian */
char buf[40];
#ifdef CONFIG_LOCALE_SUPPORT
setlocale(LC_TIME, "");
#endif
- yflag = 0;
- while ((ch = getopt(argc, argv, "jy")) != -1)
- switch(ch) {
- case 'j':
- julian = 1;
- break;
- case 'y':
- yflag = 1;
- break;
- default:
- show_usage();
- }
- argc -= optind;
+ flags = bb_getopt_ulflags(argc, argv, "jy");
+
+ julian = flags & 1;
+
argv += optind;
month = 0;
- switch(argc) {
- case 2:
- if ((month = atoi(*argv++)) < 1 || month > 12)
- error_msg_and_die("Illegal month value: use 1-12");
- /* FALLTHROUGH */
- case 1:
- if ((year = atoi(*argv)) < 1 || year > 9999)
- error_msg_and_die("Illegal year value: use 1-9999");
- break;
- case 0:
+
+ if ((argc -= optind) > 2) {
+ bb_show_usage();
+ }
+
+ if (!argc) {
time(&now);
local_time = localtime(&now);
year = local_time->tm_year + 1900;
- if (!yflag)
+ if (!(flags & 2)) {
month = local_time->tm_mon + 1;
- break;
- default:
- show_usage();
+ }
+ } else {
+ if (argc == 2) {
+ month = bb_xgetularg10_bnd(*argv++, 1, 12);
+ }
+ year = bb_xgetularg10_bnd(*argv, 1, 9999);
}
- for (i = 0; i < 12; i++) {
+ blank_string(day_headings, sizeof(day_headings) - 7 + 7*julian);
+
+ i = 0;
+ do {
zero_tm.tm_mon = i;
strftime(buf, sizeof(buf), "%B", &zero_tm);
- month_names[i] = xstrdup(buf);
- }
- for (i = 0; i < 7; i++) {
- zero_tm.tm_wday = i;
- strftime(buf, sizeof(buf), "%a", &zero_tm);
- strncpy(day_headings + i * 3, buf, 2);
- strncpy(j_day_headings + i * 4 + 1, buf, 2);
- }
-
- if (month)
- monthly(month, year);
- else if (julian)
- j_yearly(year);
- else
- yearly(year);
- exit(0);
-}
+ month_names[i] = bb_xstrdup(buf);
-#define DAY_LEN 3 /* 3 spaces per day */
-#define J_DAY_LEN 4 /* 4 spaces per day */
-#define WEEK_LEN 20 /* 7 * 3 - one space at the end */
-#define J_WEEK_LEN 27 /* 7 * 4 - one space at the end */
-#define HEAD_SEP 2 /* spaces between day headings */
-#define J_HEAD_SEP 2
-
-void monthly(int month, int year)
-{
- int col, row, len, days[MAXDAYS];
- char *p, lineout[30];
-
- day_array(month, year, days);
- len = sprintf(lineout, "%s %d", month_names[month - 1], year);
- printf("%*s%s\n%s\n",
- ((julian ? J_WEEK_LEN : WEEK_LEN) - len) / 2, "",
- lineout, julian ? j_day_headings : day_headings);
- for (row = 0; row < 6; row++) {
- for (col = 0, p = lineout; col < 7; col++,
- p += julian ? J_DAY_LEN : DAY_LEN)
- ascii_day(p, days[row * 7 + col]);
- *p = '\0';
- trim_trailing_spaces(lineout);
- printf("%s\n", lineout);
- }
-}
-
-void j_yearly(int year)
-{
- int col, *dp, i, month, row, which_cal;
- int days[12][MAXDAYS];
- char *p, lineout[80];
-
- sprintf(lineout, "%d", year);
- center(lineout, J_WEEK_LEN * 2 + J_HEAD_SEP, 0);
- printf("\n\n");
- for (i = 0; i < 12; i++)
- day_array(i + 1, year, days[i]);
- memset(lineout, ' ', sizeof(lineout) - 1);
- lineout[sizeof(lineout) - 1] = '\0';
- for (month = 0; month < 12; month += 2) {
- center(month_names[month], J_WEEK_LEN, J_HEAD_SEP);
- center(month_names[month + 1], J_WEEK_LEN, 0);
- printf("\n%s%*s%s\n", j_day_headings, J_HEAD_SEP, "",
- j_day_headings);
- for (row = 0; row < 6; row++) {
- for (which_cal = 0; which_cal < 2; which_cal++) {
- p = lineout + which_cal * (J_WEEK_LEN + 2);
- dp = &days[month + which_cal][row * 7];
- for (col = 0; col < 7; col++, p += J_DAY_LEN)
- ascii_day(p, *dp++);
- }
- *p = '\0';
- trim_trailing_spaces(lineout);
- printf("%s\n", lineout);
+ if (i < 7) {
+ zero_tm.tm_wday = i;
+ strftime(buf, sizeof(buf), "%a", &zero_tm);
+ strncpy(day_headings + i * (3+julian) + julian, buf, 2);
}
- }
- printf("\n");
-}
-
-void yearly(int year)
-{
- int col, *dp, i, month, row, which_cal;
- int days[12][MAXDAYS];
- char *p, lineout[80];
-
- sprintf(lineout, "%d", year);
- center(lineout, WEEK_LEN * 3 + HEAD_SEP * 2, 0);
- printf("\n\n");
- for (i = 0; i < 12; i++)
- day_array(i + 1, year, days[i]);
- memset(lineout, ' ', sizeof(lineout) - 1);
- lineout[sizeof(lineout) - 1] = '\0';
- for (month = 0; month < 12; month += 3) {
- center(month_names[month], WEEK_LEN, HEAD_SEP);
- center(month_names[month + 1], WEEK_LEN, HEAD_SEP);
- center(month_names[month + 2], WEEK_LEN, 0);
- printf("\n%s%*s%s%*s%s\n", day_headings, HEAD_SEP,
- "", day_headings, HEAD_SEP, "", day_headings);
+ } while (++i < 12);
+
+ if (month) {
+ int row, len, days[MAXDAYS];
+ int *dp = days;
+ char lineout[30];
+
+ day_array(month, year, dp);
+ len = sprintf(lineout, "%s %d", month_names[month - 1], year);
+ bb_printf("%*s%s\n%s\n",
+ ((7*julian + WEEK_LEN) - len) / 2, "",
+ lineout, day_headings);
for (row = 0; row < 6; row++) {
- for (which_cal = 0; which_cal < 3; which_cal++) {
- p = lineout + which_cal * (WEEK_LEN + 2);
- dp = &days[month + which_cal][row * 7];
- for (col = 0; col < 7; col++, p += DAY_LEN)
- ascii_day(p, *dp++);
+ build_row(lineout, dp)[0] = '\0';
+ dp += 7;
+ trim_trailing_spaces_and_print(lineout);
+ }
+ } else {
+ int row, which_cal, week_len, days[12][MAXDAYS];
+ int *dp;
+ char lineout[80];
+
+ sprintf(lineout, "%d", year);
+ center(lineout,
+ (WEEK_LEN * 3 + HEAD_SEP * 2)
+ + julian * (J_WEEK_LEN * 2 + HEAD_SEP
+ - (WEEK_LEN * 3 + HEAD_SEP * 2)),
+ 0);
+ puts("\n"); /* two \n's */
+ for (i = 0; i < 12; i++) {
+ day_array(i + 1, year, days[i]);
+ }
+ blank_string(lineout, sizeof(lineout));
+ week_len = WEEK_LEN + julian * (J_WEEK_LEN - WEEK_LEN);
+ for (month = 0; month < 12; month += 3-julian) {
+ center(month_names[month], week_len, HEAD_SEP);
+ if (!julian) {
+ center(month_names[month + 1], week_len, HEAD_SEP);
+ }
+ center(month_names[month + 2 - julian], week_len, 0);
+ bb_printf("\n%s%*s%s", day_headings, HEAD_SEP, "", day_headings);
+ if (!julian) {
+ bb_printf("%*s%s", HEAD_SEP, "", day_headings);
+ }
+ putchar('\n');
+ for (row = 0; row < (6*7); row += 7) {
+ for (which_cal = 0; which_cal < 3-julian; which_cal++) {
+ dp = days[month + which_cal] + row;
+ build_row(lineout + which_cal * (week_len + 2), dp);
+ }
+ /* blank_string took care of nul termination. */
+ trim_trailing_spaces_and_print(lineout);
}
- *p = '\0';
- trim_trailing_spaces(lineout);
- printf("%s\n", lineout);
}
}
- printf("\n");
+
+ bb_fflush_stdout_and_exit(0);
}
/*
* out end to end. You would have 42 numbers or spaces. This routine
* builds that array for any month from Jan. 1 through Dec. 9999.
*/
-void day_array(int month, int year, int *days)
+static void day_array(int month, int year, int *days)
{
+ long temp;
+ int i;
+ int j_offset;
int day, dw, dm;
+ memset(days, SPACE, MAXDAYS * sizeof(int));
+
if ((month == 9) && (year == 1752)) {
- memmove(days,
- julian ? j_sep1752 : sep1752, MAXDAYS * sizeof(int));
+ j_offset = julian * 244;
+ i = 0;
+ do {
+ days[i+2] = sep1752[i] + j_offset;
+ } while (++i < sizeof(sep1752));
+
return;
}
- memmove(days, empty, MAXDAYS * sizeof(int));
- dm = days_in_month[leap_year(year)][month];
- dw = day_in_week(1, month, year);
- day = julian ? day_in_year(1, month, year) : 1;
- while (dm--)
- days[dw++] = day++;
-}
-/*
- * day_in_year --
- * return the 1 based day number within the year
- */
-int day_in_year(int day, int month, int year)
-{
- int i, leap;
-
- leap = leap_year(year);
- for (i = 1; i < month; i++)
- day += days_in_month[leap][i];
- return (day);
-}
+ /* day_in_year
+ * return the 1 based day number within the year
+ */
+ day = 1;
+ if ((month > 2) && leap_year(year)) {
+ ++day;
+ }
-/*
- * day_in_week
- * return the 0 based day number for any date from 1 Jan. 1 to
- * 31 Dec. 9999. Assumes the Gregorian reformation eliminates
- * 3 Sep. 1752 through 13 Sep. 1752. Returns Thursday for all
- * missing days.
- */
-int day_in_week(int day, int month, int year)
-{
- long temp;
+ i = month;
+ while (i) {
+ day += days_in_month[--i];
+ }
+ /* day_in_week
+ * return the 0 based day number for any date from 1 Jan. 1 to
+ * 31 Dec. 9999. Assumes the Gregorian reformation eliminates
+ * 3 Sep. 1752 through 13 Sep. 1752. Returns Thursday for all
+ * missing days.
+ */
+ dw = THURSDAY;
temp = (long)(year - 1) * 365 + leap_years_since_year_1(year - 1)
- + day_in_year(day, month, year);
- if (temp < FIRST_MISSING_DAY)
- return ((temp - 1 + SATURDAY) % 7);
- if (temp >= (FIRST_MISSING_DAY + NUMBER_MISSING_DAYS))
- return (((temp - 1 + SATURDAY) - NUMBER_MISSING_DAYS) % 7);
- return (THURSDAY);
+ + day;
+ if (temp < FIRST_MISSING_DAY) {
+ dw = ((temp - 1 + SATURDAY) % 7);
+ } else if (temp >= (FIRST_MISSING_DAY + NUMBER_MISSING_DAYS)) {
+ dw = (((temp - 1 + SATURDAY) - NUMBER_MISSING_DAYS) % 7);
+ }
+
+ if (!julian) {
+ day = 1;
+ }
+
+ dm = days_in_month[month];
+ if ((month == 2) && leap_year(year)) {
+ ++dm;
+ }
+
+ while (dm) {
+ days[dw++] = day++;
+ --dm;
+ }
}
-void ascii_day(char *p, int day)
+static void trim_trailing_spaces_and_print(char *s)
{
- int display, val;
- static char *aday[] = {
- "",
- " 1", " 2", " 3", " 4", " 5", " 6", " 7",
- " 8", " 9", "10", "11", "12", "13", "14",
- "15", "16", "17", "18", "19", "20", "21",
- "22", "23", "24", "25", "26", "27", "28",
- "29", "30", "31",
- };
-
- if (day == SPACE) {
- memset(p, ' ', julian ? J_DAY_LEN : DAY_LEN);
- return;
+ char *p = s;
+
+ while (*p) {
+ ++p;
}
- if (julian) {
- if ((val = day / 100) != 0) {
- day %= 100;
- *p++ = val + '0';
- display = 1;
- } else {
- *p++ = ' ';
- display = 0;
+ while (p > s) {
+ --p;
+ if (!(isspace)(*p)) { /* We want the function... not the inline. */
+ p[1] = '\0';
+ break;
}
- val = day / 10;
- if (val || display)
- *p++ = val + '0';
- else
- *p++ = ' ';
- *p++ = day % 10 + '0';
- } else {
- *p++ = aday[day][0];
- *p++ = aday[day][1];
}
- *p = ' ';
+
+ puts(s);
}
-void trim_trailing_spaces(char *s)
+static void center(char *str, int len, int separate)
{
- char *p;
+ int n = strlen(str);
+ len -= n;
+ bb_printf("%*s%*s", (len/2) + n, str, (len/2) + (len % 2) + separate, "");
+}
- for (p = s; *p; ++p)
- continue;
- while (p > s && (--p, isspace(*p)))
- continue;
- if (p > s)
- ++p;
- *p = '\0';
+static void blank_string(char *buf, size_t buflen)
+{
+ memset(buf, ' ', buflen);
+ buf[buflen-1] = '\0';
}
-void center(char *str, int len, int separate)
+static char *build_row(char *p, int *dp)
{
+ int col, val, day;
+
+ memset(p, ' ', (julian + DAY_LEN) * 7);
+
+ col = 0;
+ do {
+ if ((day = *dp++) != SPACE) {
+ if (julian) {
+ *++p;
+ if (day >= 100) {
+ *p = '0';
+ p[-1] = (day / 100) + '0';
+ day %= 100;
+ }
+ }
+ if ((val = day / 10) > 0) {
+ *p = val + '0';
+ }
+ *++p = day % 10 + '0';
+ p += 2;
+ } else {
+ p += DAY_LEN + julian;
+ }
+ } while (++col < 7);
- len -= strlen(str);
- printf("%*s%s%*s", len / 2, "", str, len / 2 + len % 2, "");
- if (separate)
- printf("%*s", separate, "");
+ return p;
}
-
/*
* Copyright (c) 1989, 1993, 1994
* The Regents of the University of California. All rights reserved.
/* vi: set sw=4 ts=4: */
/*
- * Mini Cat implementation for busybox
+ * cat implementation for busybox
*
- * Copyright (C) 1999,2000 by Lineo, inc. and Erik Andersen
- * Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.org>
+ * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
*/
+/* BB_AUDIT SUSv3 compliant */
+/* http://www.opengroup.org/onlinepubs/007904975/utilities/cat.html */
+
+/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
+ *
+ * This is a new implementation of 'cat' which aims to be SUSv3 compliant.
+ *
+ * Changes from the previous implementation include:
+ * 1) Multiple '-' args are accepted as required by SUSv3. The previous
+ * implementation would close stdin and segfault on a subsequent '-'.
+ * 2) The '-u' options is required by SUSv3. Note that the specified
+ * behavior for '-u' is done by default, so all we need do is accept
+ * the option.
+ */
+
#include <stdlib.h>
-#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
#include "busybox.h"
extern int cat_main(int argc, char **argv)
{
- int status = EXIT_SUCCESS;
+ FILE *f;
+ int retval = EXIT_SUCCESS;
- if (argc == 1) {
- print_file(stdin);
- return status;
+ bb_getopt_ulflags(argc, argv, "u");
+
+ argv += optind;
+ if (!*argv) {
+ *--argv = "-";
}
- while (--argc > 0) {
- if(!(strcmp(*++argv, "-"))) {
- print_file(stdin);
- } else if (! print_file_by_name(*argv)) {
- status = EXIT_FAILURE;
+ do {
+ if ((f = bb_wfopen_input(*argv)) != NULL) {
+ int r = bb_copyfd(fileno(f), STDOUT_FILENO, 0);
+ bb_fclose_nonstdin(f);
+ if (r >= 0) {
+ continue;
+ }
}
- }
- return status;
-}
+ retval = EXIT_FAILURE;
+ } while (*++argv);
-/*
-Local Variables:
-c-file-style: "linux"
-c-basic-offset: 4
-tab-width: 4
-End:
-*/
+ return retval;
+}
*
*/
-#include <stdio.h>
+/* BB_AUDIT SUSv3 defects - unsupported options -h, -H, -L, and -P. */
+/* BB_AUDIT GNU defects - unsupported options -h, -c, -f, -v, and long options. */
+/* BB_AUDIT Note: gnu chgrp does not support -H, -L, or -P. */
+/* http://www.opengroup.org/onlinepubs/007904975/utilities/chgrp.html */
+
#include <stdlib.h>
-#include <string.h>
#include <unistd.h>
#include "busybox.h"
#define lchown chown
#endif
-
-static long gid;
-
static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
{
- if (lchown(fileName, statbuf->st_uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
+ if (lchown(fileName, statbuf->st_uid, *((long *) junk)) == 0) {
return (TRUE);
}
- perror(fileName);
+ bb_perror_msg("%s", fileName); /* Avoid multibyte problems. */
return (FALSE);
}
int chgrp_main(int argc, char **argv)
{
- int opt;
- int recursiveFlag = FALSE;
- char *p=NULL;
+ long gid;
+ int recursiveFlag;;
+ int retval = EXIT_SUCCESS;
+ char *p;
- /* do normal option parsing */
- while ((opt = getopt(argc, argv, "R")) > 0) {
- switch (opt) {
- case 'R':
- recursiveFlag = TRUE;
- break;
- default:
- show_usage();
- }
+ recursiveFlag = bb_getopt_ulflags(argc, argv, "R");
+
+ if (argc - optind < 2) {
+ bb_show_usage();
}
- if (argc > optind && argc > 2 && argv[optind]) {
- /* Find the selected group */
- gid = strtoul(argv[optind], &p, 10); /* maybe it's already numeric */
- if (argv[optind] == p)
- gid = my_getgrnam(argv[optind]);
- } else {
- error_msg_and_die(too_few_args);
+ argv += optind;
+
+ /* Find the selected group */
+ gid = strtoul(*argv, &p, 10); /* maybe it's already numeric */
+ if (*p || (p == *argv)) { /* trailing chars or nonnumeric */
+ gid = my_getgrnam(*argv);
}
+ ++argv;
/* Ok, ready to do the deed now */
- while (++optind < argc) {
- if (! recursive_action (argv[optind], recursiveFlag, FALSE, FALSE,
- fileAction, fileAction, NULL)) {
- return EXIT_FAILURE;
+ do {
+ if (! recursive_action (*argv, recursiveFlag, FALSE, FALSE,
+ fileAction, fileAction, &gid)) {
+ retval = EXIT_FAILURE;
}
- }
- return EXIT_SUCCESS;
+ } while (*++argv);
+ return retval;
}
/*
*
*/
+/* BB_AUDIT SUSv3 compliant */
+/* BB_AUDIT GNU defects - unsupported options -c, -f, -v, and long options. */
+/* http://www.opengroup.org/onlinepubs/007904975/utilities/chmod.html */
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <getopt.h>
+#include <sys/stat.h>
#include "busybox.h"
static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
{
- if (!parse_mode((char *)junk, &(statbuf->st_mode)))
- error_msg_and_die( "unknown mode: %s", (char *)junk);
+ if (!bb_parse_mode((char *)junk, &(statbuf->st_mode)))
+ bb_error_msg_and_die( "unknown mode: %s", (char *)junk);
if (chmod(fileName, statbuf->st_mode) == 0)
return (TRUE);
- perror(fileName);
+ bb_perror_msg("%s", fileName); /* Avoid multibyte problems. */
return (FALSE);
}
int chmod_main(int argc, char **argv)
{
- int opt;
+ int retval = EXIT_SUCCESS;
int recursiveFlag = FALSE;
- int modeind = 0; /* Index of the mode argument in `argv'. */
+ int count;
char *smode;
- static const char chmod_modes[] = "Rrwxstugoa,+-=";
+ char **p;
+ char *p0;
+ char opt = '-';
- /* do normal option parsing */
- while (1) {
- int thisind = optind ? optind : 1;
+ ++argv;
+ count = 0;
- opt = getopt(argc, argv, chmod_modes);
- if (opt == EOF)
- break;
- smode = strchr(chmod_modes, opt);
- if(smode == NULL)
- show_usage();
- if(smode == chmod_modes) { /* 'R' */
- recursiveFlag = TRUE;
- } else {
- if (modeind != 0 && modeind != thisind)
- show_usage();
- modeind = thisind;
+ for (p = argv ; *p ; p++) {
+ p0 = p[0];
+ if (p0[0] == opt) {
+ if ((p0[1] == '-') && !p0[2]) {
+ opt = 0; /* Disable further option processing. */
+ continue;
+ }
+ if (p0[1] == 'R') {
+ char *s = p0 + 2;
+ while (*s == 'R') {
+ ++s;
+ }
+ if (*s) {
+ bb_show_usage();
+ }
+ recursiveFlag = TRUE;
+ continue;
+ }
+ if (count) {
+ bb_show_usage();
+ }
}
+ argv[count] = p0;
+ ++count;
}
- if (modeind == 0)
- modeind = optind++;
+ argv[count] = NULL;
- opt = optind;
- if (opt >= argc) {
- error_msg_and_die(too_few_args);
+ if (count < 2) {
+ bb_show_usage();
}
- smode = argv[modeind];
+ smode = *argv;
+ ++argv;
+
/* Ok, ready to do the deed now */
- for (; opt < argc; opt++) {
- if (! recursive_action (argv[opt], recursiveFlag, FALSE, FALSE, fileAction,
- fileAction, smode)) {
- return EXIT_FAILURE;
+ do {
+ if (! recursive_action (*argv, recursiveFlag, FALSE, FALSE,
+ fileAction, fileAction, smode)) {
+ retval = EXIT_FAILURE;
}
- }
- return EXIT_SUCCESS;
+ } while (*++argv);
+
+ return retval;
}
/*
*
*/
-#include <stdio.h>
+/* BB_AUDIT SUSv3 defects - unsupported options -h, -H, -L, and -P. */
+/* BB_AUDIT GNU defects - unsupported options -h, -c, -f, -v, and long options. */
+/* BB_AUDIT Note: gnu chown does not support -H, -L, or -P. */
+/* http://www.opengroup.org/onlinepubs/007904975/utilities/chown.html */
+
#include <stdlib.h>
-#include <string.h>
#include <unistd.h>
+#include <string.h>
#include "busybox.h"
/* Don't use lchown for libc5 or glibc older then 2.1.x */
if (chown_func(fileName, uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
return (TRUE);
}
- perror(fileName);
+ bb_perror_msg("%s", fileName); /* Avoid multibyte problems. */
return (FALSE);
}
+#define FLAG_R 1
+#define FLAG_h 2
+
+static unsigned long get_ug_id(const char *s, long (*my_getxxnam)(const char *))
+{
+ unsigned long r;
+ char *p;
+
+ r = strtoul(s, &p, 10);
+ if (*p || (s == p)) {
+ r = my_getxxnam(s);
+ }
+
+ return r;
+}
+
int chown_main(int argc, char **argv)
{
- int opt;
- int recursiveFlag = FALSE,
- noderefFlag = FALSE;
- char *groupName=NULL;
- char *p=NULL;
-
- /* do normal option parsing */
- while ((opt = getopt(argc, argv, "Rh")) > 0) {
- switch (opt) {
- case 'R':
- recursiveFlag = TRUE;
- break;
- case 'h':
- noderefFlag = TRUE;
- break;
- default:
- show_usage();
- }
+ int flags;
+ int retval = EXIT_SUCCESS;
+ char *groupName;
+
+ flags = bb_getopt_ulflags(argc, argv, "Rh");
+
+ if (flags & FLAG_h) chown_func = lchown;
+
+ if (argc - optind < 2) {
+ bb_show_usage();
}
- if (noderefFlag) chown_func = lchown;
-
- if (argc > optind && argc > 2 && argv[optind]) {
- /* First, check if there is a group name here */
- groupName = strchr(argv[optind], '.');
- if (groupName == NULL)
- groupName = strchr(argv[optind], ':');
- if (groupName) {
- *groupName++ = '\0';
- gid = strtoul(groupName, &p, 10);
- if (groupName == p)
- gid = my_getgrnam(groupName);
- } else {
- gid = -1;
- }
- /* Now check for the username */
- uid = strtoul(argv[optind], &p, 10); /* Is is numeric? */
- if (argv[optind] == p) {
- uid = my_getpwnam(argv[optind]);
- }
- } else {
- error_msg_and_die(too_few_args);
+ argv += optind;
+
+ /* First, check if there is a group name here */
+ if ((groupName = strchr(*argv, '.')) == NULL) {
+ groupName = strchr(*argv, ':');
+ }
+
+ gid = -1;
+ if (groupName) {
+ *groupName++ = '\0';
+ gid = get_ug_id(groupName, my_getgrnam);
}
+ /* Now check for the username */
+ uid = get_ug_id(*argv, my_getpwnam);
+
+ ++argv;
+
/* Ok, ready to do the deed now */
- while (++optind < argc) {
- if (! recursive_action (argv[optind], recursiveFlag, FALSE, FALSE,
- fileAction, fileAction, NULL)) {
- return EXIT_FAILURE;
+ do {
+ if (! recursive_action (*argv, (flags & FLAG_R), FALSE, FALSE,
+ fileAction, fileAction, NULL)) {
+ retval = EXIT_FAILURE;
}
- }
- return EXIT_SUCCESS;
+ } while (*++argv);
+ return retval;
}
/*
*
*/
+/* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */
+
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int chroot_main(int argc, char **argv)
{
- char *prog;
-
- if ((argc < 2) || (**(argv + 1) == '-')) {
- show_usage();
+ if (argc < 2) {
+ bb_show_usage();
}
- argc--;
- argv++;
+ ++argv;
if (chroot(*argv) || (chdir("/"))) {
- perror_msg_and_die("cannot change root directory to %s", *argv);
+ bb_perror_msg_and_die("cannot change root directory to %s", *argv);
}
- argc--;
- argv++;
- if (argc >= 1) {
- prog = *argv;
- execvp(*argv, argv);
- } else {
-#if defined shell_main && defined CONFIG_FEATURE_SH_STANDALONE_SHELL
- char shell[] = "/bin/sh";
- char *shell_argv[2] = { shell, NULL };
- applet_name = shell;
- shell_main(1, shell_argv);
- return EXIT_SUCCESS;
-#else
- prog = getenv("SHELL");
- if (!prog)
- prog = "/bin/sh";
- execlp(prog, prog, NULL);
-#endif
+ ++argv;
+ if (argc == 2) {
+ argv -= 2;
+ if (!(*argv = getenv("SHELL"))) {
+ *argv = (char *) "/bin/sh";
+ }
+ argv[1] = (char *) "-i";
}
- perror_msg_and_die("cannot execute %s", prog);
+ execvp(*argv, argv);
+ bb_perror_msg_and_die("cannot execute %s", *argv);
}
-
-
-/*
-Local Variables:
-c-file-style: "linux"
-c-basic-offset: 4
-tab-width: 4
-End:
-*/
*
*/
+/* BB_AUDIT SUSv3 (virtually) compliant -- uses nicer GNU format for -l. */
+/* http://www.opengroup.org/onlinepubs/007904975/utilities/cmp.html */
+
+/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
+ *
+ * Original version majorly reworked for SUSv3 compliance, bug fixes, and
+ * size optimizations. Changes include:
+ * 1) Now correctly distingusishes between errors and actual file differences.
+ * 2) Proper handling of '-' args.
+ * 3) Actual error checking of i/o.
+ * 4) Accept SUSv3 -l option. Note that we use the slightly nicer gnu format
+ * in the '-l' case.
+ */
+
#include <stdio.h>
-#include <string.h>
-#include <errno.h>
#include <stdlib.h>
-#include <getopt.h>
+#include <unistd.h>
#include "busybox.h"
+static FILE *cmp_xfopen_input(const char *filename)
+{
+ FILE *fp;
+
+ if ((fp = bb_wfopen_input(filename)) != NULL) {
+ return fp;
+ }
+
+ exit(bb_default_error_retval); /* We already output an error message. */
+}
+
+static const char fmt_eof[] = "cmp: EOF on %s\n";
+static const char fmt_differ[] = "%s %s differ: char %d, line %d\n";
+#if 0
+static const char fmt_l_opt[] = "%.0s%.0s%d %o %o\n"; /* SUSv3 format */
+#else
+static const char fmt_l_opt[] = "%.0s%.0s%d %3o %3o\n"; /* nicer gnu format */
+#endif
+
+static const char opt_chars[] = "sl";
+
+enum {
+ OPT_s = 1,
+ OPT_l = 2
+};
+
int cmp_main(int argc, char **argv)
{
- FILE *fp1 = NULL, *fp2 = stdin;
- char *filename1, *filename2 = "-";
- int c, c1, c2, char_pos = 1, line_pos = 1, silent = FALSE;
-
- while ((c = getopt(argc, argv, "s")) != EOF) {
- switch (c) {
- case 's':
- silent = TRUE;
- break;
- default:
- show_usage();
- }
+ FILE *fp1, *fp2, *outfile = stdout;
+ const char *filename1, *filename2;
+ const char *fmt;
+ int c1, c2, char_pos, line_pos;
+ int opt_flags;
+ int exit_val = 0;
+
+ bb_default_error_retval = 2; /* 1 is returned if files are different. */
+
+ opt_flags = bb_getopt_ulflags(argc, argv, opt_chars);
+
+ if ((opt_flags == 3) || (((unsigned int)(--argc - optind)) > 1)) {
+ bb_show_usage();
}
- filename1 = argv[optind];
- switch (argc - optind) {
- case 2:
- fp2 = xfopen(filename2 = argv[optind + 1], "r");
- case 1:
- fp1 = xfopen(filename1, "r");
- break;
- default:
- show_usage();
+ fp1 = cmp_xfopen_input(filename1 = *(argv += optind));
+
+ filename2 = "-";
+ if (*++argv) {
+ filename2 = *argv;
}
+ fp2 = cmp_xfopen_input(filename2);
+ if (fp1 == fp2) { /* Paranioa check... stdin == stdin? */
+ /* Note that we don't bother reading stdin. Neither does gnu wc.
+ * But perhaps we should, so that other apps down the chain don't
+ * get the input. Consider 'echo hello | (cmp - - && cat -)'.
+ */
+ return 0;
+ }
+
+ fmt = fmt_differ;
+ if (opt_flags == OPT_l) {
+ fmt = fmt_l_opt;
+ }
+
+ char_pos = 0;
+ line_pos = 1;
do {
- c1 = fgetc(fp1);
- c2 = fgetc(fp2);
- if (c1 != c2) {
- if (silent)
- return EXIT_FAILURE;
- if (c1 == EOF)
- printf("EOF on %s\n", filename1);
- else if (c2 == EOF)
- printf("EOF on %s\n", filename2);
- else
- printf("%s %s differ: char %d, line %d\n", filename1, filename2,
- char_pos, line_pos);
- return EXIT_FAILURE;
+ c1 = getc(fp1);
+ c2 = getc(fp2);
+ ++char_pos;
+ if (c1 != c2) { /* Remember -- a read error may have occurred. */
+ exit_val = 1; /* But assume the files are different for now. */
+ if (c2 == EOF) {
+ /* We know that fp1 isn't at EOF or in an error state. But to
+ * save space below, things are setup to expect an EOF in fp1
+ * if an EOF occurred. So, swap things around.
+ */
+ fp1 = fp2;
+ filename1 = filename2;
+ c1 = c2;
+ }
+ if (c1 == EOF) {
+ bb_xferror(fp1, filename1);
+ fmt = fmt_eof; /* Well, no error, so it must really be EOF. */
+ outfile = stderr;
+ /* There may have been output to stdout (option -l), so
+ * make sure we fflush before writing to stderr. */
+ bb_xfflush_stdout();
+ }
+ if (opt_flags != OPT_s) {
+ if (opt_flags == OPT_l) {
+ line_pos = c1; /* line_pos is unused in the -l case. */
+ }
+ bb_fprintf(outfile, fmt, filename1, filename2, char_pos, line_pos, c2);
+ if (opt_flags) { /* This must be -l since not -s. */
+ /* If we encountered and EOF, the while check will catch it. */
+ continue;
+ }
+ }
+ break;
+ }
+ if (c1 == '\n') {
+ ++line_pos;
}
- char_pos++;
- if (c1 == '\n')
- line_pos++;
} while (c1 != EOF);
- return EXIT_SUCCESS;
+ bb_xferror(fp1, filename1);
+ bb_xferror(fp2, filename2);
+
+ bb_fflush_stdout_and_exit(exit_val);
}
/*
* Mini cp implementation for busybox
*
- *
* Copyright (C) 2000 by Matt Kraai <kraai@alumni.carnegiemellon.edu>
*
* This program is free software; you can redistribute it and/or modify
*
*/
+/* BB_AUDIT SUSv3 defects - unsupported options -H, -L, and -P. */
+/* BB_AUDIT GNU defects - only extension options supported are -a and -d. */
+/* http://www.opengroup.org/onlinepubs/007904975/utilities/cp.html */
+
+/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
+ *
+ * Size reduction.
+ */
+
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <dirent.h>
#include <stdlib.h>
-
+#include <assert.h>
#include "busybox.h"
+#include "libcoreutils/coreutils.h"
+
+static const char cp_opts[] = "pdRfia"; /* WARNING!! ORDER IS IMPORTANT!! */
extern int cp_main(int argc, char **argv)
{
+ struct stat source_stat;
+ struct stat dest_stat;
+ const char *last;
+ const char *dest;
+ int s_flags;
+ int d_flags;
+ int flags;
int status = 0;
- int opt;
- int flags = FILEUTILS_DEREFERENCE;
- int i;
- while ((opt = getopt(argc, argv, "adfipR")) != -1)
- switch (opt) {
- case 'a':
- flags |= FILEUTILS_PRESERVE_STATUS | FILEUTILS_RECUR;
- /* fallthrough */
- case 'd':
- flags &= ~FILEUTILS_DEREFERENCE;
- break;
- case 'f':
- flags |= FILEUTILS_FORCE;
- break;
- case 'i':
- flags |= FILEUTILS_INTERACTIVE;
- break;
- case 'p':
- flags |= FILEUTILS_PRESERVE_STATUS;
- break;
- case 'R':
- flags |= FILEUTILS_RECUR;
- break;
- default:
- show_usage();
- }
-
- if (optind + 2 > argc)
- show_usage();
+ /* Since these are enums, #if tests will not work. So use assert()s. */
+ assert(FILEUTILS_PRESERVE_STATUS == 1);
+ assert(FILEUTILS_DEREFERENCE == 2);
+ assert(FILEUTILS_RECUR == 4);
+ assert(FILEUTILS_FORCE == 8);
+ assert(FILEUTILS_INTERACTIVE == 16);
- /* If there are only two arguments and... */
- if (optind + 2 == argc) {
- struct stat source_stat;
- struct stat dest_stat;
- int source_exists = 1;
- int dest_exists = 1;
+ flags = bb_getopt_ulflags(argc, argv, cp_opts);
- if ((!(flags & FILEUTILS_DEREFERENCE) &&
- lstat(argv[optind], &source_stat) < 0) ||
- ((flags & FILEUTILS_DEREFERENCE) &&
- stat(argv[optind], &source_stat))) {
- if (errno != ENOENT)
- perror_msg_and_die("unable to stat `%s'", argv[optind]);
- source_exists = 0;
- }
+ if (flags & 32) {
+ flags |= (FILEUTILS_PRESERVE_STATUS | FILEUTILS_RECUR | FILEUTILS_DEREFERENCE);
+ }
+
+ flags ^= FILEUTILS_DEREFERENCE; /* The sense of this flag was reversed. */
+
+ if (optind + 2 > argc) {
+ bb_show_usage();
+ }
+
+ last = argv[argc - 1];
+ argv += optind;
- if (stat(argv[optind + 1], &dest_stat) < 0) {
- if (errno != ENOENT)
- perror_msg_and_die("unable to stat `%s'", argv[optind + 1]);
- dest_exists = 0;
+ /* If there are only two arguments and... */
+ if (optind + 2 == argc) {
+ s_flags = cp_mv_stat2(*argv, &source_stat,
+ (flags & FILEUTILS_DEREFERENCE) ? stat : lstat);
+ if ((s_flags < 0) || ((d_flags = cp_mv_stat(last, &dest_stat)) < 0)) {
+ exit(EXIT_FAILURE);
}
-
/* ...if neither is a directory or... */
- if (((!source_exists || !S_ISDIR(source_stat.st_mode)) &&
- (!dest_exists || !S_ISDIR(dest_stat.st_mode))) ||
- /* ...recursing, the first is a directory, and the
- * second doesn't exist, then... */
- ((flags & FILEUTILS_RECUR) && S_ISDIR(source_stat.st_mode) &&
- !dest_exists)) {
+ if ( !((s_flags | d_flags) & 2) ||
+ /* ...recursing, the 1st is a directory, and the 2nd doesn't exist... */
+ /* ((flags & FILEUTILS_RECUR) && (s_flags & 2) && !d_flags) */
+ /* Simplify the above since FILEUTILS_RECUR >> 1 == 2. */
+ ((((flags & FILEUTILS_RECUR) >> 1) & s_flags) && !d_flags)
+ ) {
/* ...do a simple copy. */
- if (copy_file(argv[optind], argv[optind + 1], flags) < 0)
- status = 1;
- return status;
+ dest = last;
+ goto DO_COPY; /* Note: optind+2==argc implies argv[1]==last below. */
}
}
- for (i = optind; i < argc - 1; i++) {
- char *dest = concat_path_file(argv[argc - 1],
- get_last_path_component(argv[i]));
- if (copy_file(argv[i], dest, flags) < 0)
+ do {
+ dest = concat_path_file(last, bb_get_last_path_component(*argv));
+ DO_COPY:
+ if (copy_file(*argv, dest, flags) < 0) {
status = 1;
- free(dest);
- }
+ }
+ if (*++argv == last) {
+ break;
+ }
+ free((void *) dest);
+ } while (1);
- return status;
+ exit(status);
}
} else {
s = strtoul(ntok, &junk, 10);
if(*junk != '\0' || s < 0)
- error_msg_and_die("invalid byte or field list");
+ bb_error_msg_and_die("invalid byte or field list");
/* account for the fact that arrays are zero based, while the user
* expects the first char on the line to be char # 1 */
} else {
e = strtoul(ntok, &junk, 10);
if(*junk != '\0' || e < 0)
- error_msg_and_die("invalid byte or field list");
+ bb_error_msg_and_die("invalid byte or field list");
/* if the user specified and end position of 0, that means "til the
* end of the line */
if (e == 0)
/* if there's something left to tokenize, the user past an invalid list */
if (ltok)
- error_msg_and_die("invalid byte or field list");
+ bb_error_msg_and_die("invalid byte or field list");
/* add the new list */
cut_lists = xrealloc(cut_lists, sizeof(struct cut_list) * (++nlists));
/* make sure we got some cut positions out of all that */
if (nlists == 0)
- error_msg_and_die("missing list of positions");
+ bb_error_msg_and_die("missing list of positions");
/* now that the lists are parsed, we need to sort them to make life easier
* on us when it comes time to print the chars / fields / lines */
unsigned int linenum = 0; /* keep these zero-based to be consistent */
/* go through every line in the file */
- while ((line = get_line_from_file(file)) != NULL) {
- chomp(line);
+ while ((line = bb_get_chomped_line_from_file(file)) != NULL) {
/* cut based on chars/bytes XXX: only works when sizeof(char) == byte */
if (part == 'c' || part == 'b')
case 'f':
/* make sure they didn't ask for two types of lists */
if (part != 0) {
- error_msg_and_die("only one type of list may be specified");
+ bb_error_msg_and_die("only one type of list may be specified");
}
part = (char)opt;
parse_lists(optarg);
break;
case 'd':
if (strlen(optarg) > 1) {
- error_msg_and_die("the delimiter must be a single character");
+ bb_error_msg_and_die("the delimiter must be a single character");
}
delim = optarg[0];
break;
}
if (part == 0) {
- error_msg_and_die("you must specify a list of bytes, characters, or fields");
+ bb_error_msg_and_die("you must specify a list of bytes, characters, or fields");
}
/* non-field (char or byte) cutting has some special handling */
if (part != 'f') {
if (supress_non_delimited_lines) {
- error_msg_and_die("suppressing non-delimited lines makes sense"
+ bb_error_msg_and_die("suppressing non-delimited lines makes sense"
" only when operating on fields");
}
if (delim != '\t' && part != 'f') {
- error_msg_and_die("a delimiter may be specified only when operating on fields");
+ bb_error_msg_and_die("a delimiter may be specified only when operating on fields");
}
}
int i;
FILE *file;
for (i = optind; i < argc; i++) {
- file = wfopen(argv[i], "r");
+ file = bb_wfopen(argv[i], "r");
if(file) {
cut_file(file);
fclose(file);
&(tm_time->tm_year));
if (nr < 4 || nr > 5) {
- error_msg_and_die(invalid_date, t_string);
+ bb_error_msg_and_die(bb_msg_invalid_date, t_string);
}
/* correct for century - minor Y2K problem here? */
t.tm_year -= 1900; /* Adjust years */
t.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */
} else {
- error_msg_and_die(invalid_date, t_string);
+ bb_error_msg_and_die(bb_msg_invalid_date, t_string);
}
*tm_time = t;
return (tm_time);
case 's':
set_time = 1;
if ((date_str != NULL) || ((date_str = optarg) == NULL)) {
- show_usage();
+ bb_show_usage();
}
break;
case 'u':
utc = 1;
if (putenv("TZ=UTC0") != 0)
- error_msg_and_die(memory_exhausted);
+ bb_error_msg_and_die(bb_msg_memory_exhausted);
break;
case 'd':
use_arg = 1;
if ((date_str != NULL) || ((date_str = optarg) == NULL))
- show_usage();
+ bb_show_usage();
break;
#ifdef CONFIG_FEATURE_DATE_ISOFMT
case 'I':
if (!optarg)
ifmt = 1;
else {
- int ifmt_len = xstrlen(optarg);
+ int ifmt_len = bb_strlen(optarg);
if ((ifmt_len <= 4)
&& (strncmp(optarg, "date", ifmt_len) == 0)) {
}
}
if (ifmt) {
- break; /* else show_usage(); */
+ break; /* else bb_show_usage(); */
}
#endif
default:
- show_usage();
+ bb_show_usage();
}
}
/* Correct any day of week and day of year etc. fields */
tm = mktime(&tm_time);
if (tm < 0) {
- error_msg_and_die(invalid_date, date_str);
+ bb_error_msg_and_die(bb_msg_invalid_date, date_str);
}
if (utc && (putenv("TZ=UTC0") != 0)) {
- error_msg_and_die(memory_exhausted);
+ bb_error_msg_and_die(bb_msg_memory_exhausted);
}
/* if setting time, set it */
if (set_time && (stime(&tm) < 0)) {
- perror_msg("cannot set date");
+ bb_perror_msg("cannot set date");
}
}
int ifd;
int ofd;
int i;
- char *infile = NULL;
- char *outfile = NULL;
+ const char *infile = NULL;
+ const char *outfile = NULL;
char *buf;
for (i = 1; i < argc; i++) {
if (strncmp("bs=", argv[i], 3) == 0)
- bs = parse_number(argv[i]+3, dd_suffixes);
+ bs = bb_xparse_number(argv[i]+3, dd_suffixes);
else if (strncmp("count=", argv[i], 6) == 0)
- count = parse_number(argv[i]+6, dd_suffixes);
+ count = bb_xparse_number(argv[i]+6, dd_suffixes);
else if (strncmp("seek=", argv[i], 5) == 0)
- seek = parse_number(argv[i]+5, dd_suffixes);
+ seek = bb_xparse_number(argv[i]+5, dd_suffixes);
else if (strncmp("skip=", argv[i], 5) == 0)
- skip = parse_number(argv[i]+5, dd_suffixes);
+ skip = bb_xparse_number(argv[i]+5, dd_suffixes);
else if (strncmp("if=", argv[i], 3) == 0)
infile = argv[i]+3;
else if (strncmp("of=", argv[i], 3) == 0)
noerror = TRUE;
buf += 7;
} else {
- error_msg_and_die("invalid conversion `%s'", argv[i]+5);
+ bb_error_msg_and_die("invalid conversion `%s'", argv[i]+5);
}
if (buf[0] == '\0')
break;
buf++;
}
} else
- show_usage();
+ bb_show_usage();
}
buf = xmalloc(bs);
if (infile != NULL) {
if ((ifd = open(infile, O_RDONLY)) < 0) {
- perror_msg_and_die("%s", infile);
+ bb_perror_msg_and_die("%s", infile);
}
} else {
ifd = STDIN_FILENO;
- infile = "standard input";
+ infile = bb_msg_standard_input;
}
if (outfile != NULL) {
}
if ((ofd = open(outfile, oflag, 0666)) < 0) {
- perror_msg_and_die("%s", outfile);
+ bb_perror_msg_and_die("%s", outfile);
}
if (seek && trunc) {
if (fstat (ofd, &st) < 0 || S_ISREG (st.st_mode) ||
S_ISDIR (st.st_mode)) {
- perror_msg_and_die("%s", outfile);
+ bb_perror_msg_and_die("%s", outfile);
}
}
}
} else {
ofd = STDOUT_FILENO;
- outfile = "standard output";
+ outfile = bb_msg_standard_output;
}
if (skip) {
if (lseek(ifd, skip * bs, SEEK_CUR) < 0) {
- perror_msg_and_die("%s", infile);
+ bb_perror_msg_and_die("%s", infile);
}
}
if (seek) {
if (lseek(ofd, seek * bs, SEEK_CUR) < 0) {
- perror_msg_and_die("%s", outfile);
+ bb_perror_msg_and_die("%s", outfile);
}
}
if (n < 0) {
if (noerror) {
n = bs;
- perror_msg("%s", infile);
+ bb_perror_msg("%s", infile);
} else {
- perror_msg_and_die("%s", infile);
+ bb_perror_msg_and_die("%s", infile);
}
}
if (n == 0) {
memset(buf + n, '\0', bs - n);
n = bs;
}
- n = full_write(ofd, buf, n);
+ n = bb_full_write(ofd, buf, n);
if (n < 0) {
- perror_msg_and_die("%s", outfile);
+ bb_perror_msg_and_die("%s", outfile);
}
if (n == bs) {
out_full++;
}
if (close (ifd) < 0) {
- perror_msg_and_die("%s", infile);
+ bb_perror_msg_and_die("%s", infile);
}
if (close (ofd) < 0) {
- perror_msg_and_die("%s", outfile);
+ bb_perror_msg_and_die("%s", outfile);
}
- fprintf(stderr, "%ld+%ld records in\n", (long)in_full, (long)in_part);
- fprintf(stderr, "%ld+%ld records out\n", (long)out_full, (long)out_part);
+ fprintf(stderr, "%ld+%ld records in\n%ld+%ld records out\n",
+ (long)in_full, (long)in_part,
+ (long)out_full, (long)out_part);
return EXIT_SUCCESS;
}
*
*/
+/* BB_AUDIT SUSv3 _NOT_ compliant -- options -P and -t missing. Also blocksize. */
+/* http://www.opengroup.org/onlinepubs/007904975/utilities/df.html */
+
+/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
+ *
+ * Size reduction. Removed floating point dependency. Added error checking
+ * on output. Output stats on 0-sized filesystems if specificly listed on
+ * the command line. Properly round *-blocks, Used, and Available quantities.
+ */
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include <mntent.h>
#include <sys/vfs.h>
-#include <getopt.h>
#include "busybox.h"
-extern const char mtab_file[]; /* Defined in utility.c */
-#ifdef CONFIG_FEATURE_HUMAN_READABLE
-static unsigned long df_disp_hr = KILOBYTE;
+#ifndef CONFIG_FEATURE_HUMAN_READABLE
+static long kscale(long b, long bs)
+{
+ return ( b * (long long) bs + KILOBYTE/2 ) / KILOBYTE;
+}
#endif
-static int do_df(char *device, const char *mount_point)
+extern int df_main(int argc, char **argv)
{
- struct statfs s;
long blocks_used;
long blocks_percent_used;
-
- if (statfs(mount_point, &s) != 0) {
- perror_msg("%s", mount_point);
- return FALSE;
- }
-
- if (s.f_blocks > 0) {
- blocks_used = s.f_blocks - s.f_bfree;
- if(blocks_used == 0)
- blocks_percent_used = 0;
- else {
- blocks_percent_used = (long)
- (blocks_used * 100.0 / (blocks_used + s.f_bavail) + 0.5);
- }
- if (strcmp(device, "/dev/root") == 0) {
- /* Adjusts device to be the real root device,
- * or leaves device alone if it can't find it */
- device = find_real_root_device_name(device);
- if(device==NULL)
- return FALSE;
- }
#ifdef CONFIG_FEATURE_HUMAN_READABLE
- printf("%-20s %9s ", device,
- make_human_readable_str(s.f_blocks, s.f_bsize, df_disp_hr));
-
- printf("%9s ",
- make_human_readable_str( (s.f_blocks - s.f_bfree), s.f_bsize, df_disp_hr));
-
- printf("%9s %3ld%% %s\n",
- make_human_readable_str(s.f_bavail, s.f_bsize, df_disp_hr),
- blocks_percent_used, mount_point);
-#else
- printf("%-20s %9ld %9ld %9ld %3ld%% %s\n",
- device,
- (long) (s.f_blocks * (s.f_bsize / (double)KILOBYTE)),
- (long) ((s.f_blocks - s.f_bfree)*(s.f_bsize/(double)KILOBYTE)),
- (long) (s.f_bavail * (s.f_bsize / (double)KILOBYTE)),
- blocks_percent_used, mount_point);
+ unsigned long df_disp_hr = KILOBYTE;
#endif
- }
-
- return TRUE;
-}
-
-extern int df_main(int argc, char **argv)
-{
int status = EXIT_SUCCESS;
- int opt = 0;
- int i = 0;
- char disp_units_hdr[80] = "1k-blocks"; /* default display is kilobytes */
+ int opt;
+ FILE *mount_table;
+ struct mntent *mount_entry;
+ struct statfs s;
+ static const char hdr_1k[] = "1k-blocks"; /* default display is kilobytes */;
+ const char *disp_units_hdr = hdr_1k;
while ((opt = getopt(argc, argv, "k"
#ifdef CONFIG_FEATURE_HUMAN_READABLE
#ifdef CONFIG_FEATURE_HUMAN_READABLE
case 'h':
df_disp_hr = 0;
- strcpy(disp_units_hdr, " Size");
+ disp_units_hdr = " Size";
break;
case 'm':
df_disp_hr = MEGABYTE;
- strcpy(disp_units_hdr, "1M-blocks");
+ disp_units_hdr = "1M-blocks";
break;
#endif
case 'k':
/* default display is kilobytes */
+#ifdef CONFIG_FEATURE_HUMAN_READABLE
+ df_disp_hr = KILOBYTE;
+ disp_units_hdr = hdr_1k;
+#endif
break;
default:
- show_usage();
+ bb_show_usage();
}
}
- printf("%-20s %-14s %s %s %s %s\n", "Filesystem", disp_units_hdr,
- "Used", "Available", "Use%", "Mounted on");
+ bb_printf("Filesystem%11s%-15sUsed Available Use%% Mounted on\n",
+ "", disp_units_hdr);
- if(optind < argc) {
- struct mntent *mount_entry;
- for(i = optind; i < argc; i++)
- {
- if ((mount_entry = find_mount_point(argv[i], mtab_file)) == 0) {
- error_msg("%s: can't find mount point.", argv[i]);
- status = EXIT_FAILURE;
- } else if (!do_df(mount_entry->mnt_fsname, mount_entry->mnt_dir))
- status = EXIT_FAILURE;
+ mount_table = NULL;
+ argv += optind;
+ if (optind >= argc) {
+ if (!(mount_table = setmntent(bb_path_mtab_file, "r"))) {
+ bb_perror_msg_and_die(bb_path_mtab_file);
}
- } else {
- FILE *mount_table;
- struct mntent *mount_entry;
+ }
- mount_table = setmntent(mtab_file, "r");
- if (mount_table == 0) {
- perror_msg("%s", mtab_file);
- return EXIT_FAILURE;
- }
+ do {
+ const char *device;
+ const char *mount_point;
- while ((mount_entry = getmntent(mount_table))) {
- if (!do_df(mount_entry->mnt_fsname, mount_entry->mnt_dir))
+ if (mount_table) {
+ if (!(mount_entry = getmntent(mount_table))) {
+ endmntent(mount_table);
+ break;
+ }
+ } else {
+ if (!(mount_point = *argv++)) {
+ break;
+ }
+ if (!(mount_entry = find_mount_point(mount_point, bb_path_mtab_file))) {
+ bb_error_msg("%s: can't find mount point.", mount_point);
+ SET_ERROR:
status = EXIT_FAILURE;
+ continue;
+ }
}
- endmntent(mount_table);
- }
- return status;
+ device = mount_entry->mnt_fsname;
+ mount_point = mount_entry->mnt_dir;
+
+ if (statfs(mount_point, &s) != 0) {
+ bb_perror_msg("%s", mount_point);
+ goto SET_ERROR;
+ }
+
+ if ((s.f_blocks > 0) || !mount_table){
+ blocks_used = s.f_blocks - s.f_bfree;
+ blocks_percent_used = 0;
+ if (blocks_used + s.f_bavail) {
+ blocks_percent_used = (((long long) blocks_used) * 100
+ + (blocks_used + s.f_bavail)/2
+ ) / (blocks_used + s.f_bavail);
+ }
+
+ if (strcmp(device, "/dev/root") == 0) {
+ /* Adjusts device to be the real root device,
+ * or leaves device alone if it can't find it */
+ if ((device = find_real_root_device_name(device)) != NULL) {
+ goto SET_ERROR;
+ }
+ }