Browse Source

update-alternatives: new syserr() function

This function is to be used when a syscall failed and when we want
to print strerror(errno) after the error message.

Update all the code to use this function. This allows to reduce the
number of strings to translate as we're now reusing the same strings
than those passed to oshite() in dpkg.
Raphaël Hertzog 15 years ago
parent
commit
c28eadb19f
1 changed files with 33 additions and 25 deletions
  1. 33 25
      utils/update-alternatives.c

+ 33 - 25
utils/update-alternatives.c

@@ -155,6 +155,19 @@ error(char const *fmt, ...)
 	exit(2);
 }
 
+static void DPKG_ATTR_NORET DPKG_ATTR_PRINTF(1)
+syserr(char const *fmt, ...)
+{
+	va_list args;
+
+	fprintf(stderr, "%s: %s: ", PROGNAME, _("error"));
+	va_start(args, fmt);
+	vfprintf(stderr, fmt, args);
+	va_end(args);
+	fprintf(stderr, ": %s\n", strerror(errno));
+	exit(2);
+}
+
 static void DPKG_ATTR_NORET DPKG_ATTR_PRINTF(1)
 badusage(char const *fmt, ...)
 {
@@ -277,7 +290,7 @@ xreadlink(const char *linkname, bool error_out)
 	if (lstat(linkname, &st)) {
 		if (!error_out)
 			return NULL;
-		error(_("cannot stat %s: %s"), linkname, strerror(errno));
+		syserr(_("cannot stat file '%s'"), linkname);
 	}
 	buf = xmalloc(st.st_size + 1);
 
@@ -288,7 +301,7 @@ xreadlink(const char *linkname, bool error_out)
 			free(buf);
 			return NULL;
 		}
-		error(_("readlink(%s) failed: %s"), linkname, strerror(errno));
+		syserr(_("unable to read link `%.255s'"), linkname);
 	}
 	buf[size] = '\0';
 
@@ -355,7 +368,7 @@ log_msg(const char *fmt, ...)
 	if (fh_log == NULL) {
 		fh_log = fopen(log_file, "a");
 		if (fh_log == NULL && errno != EACCES)
-			error(_("cannot append to %s: %s"), log_file, strerror(errno));
+			syserr(_("cannot append to '%s'"), log_file);
 	}
 
 	if (fh_log) {
@@ -392,7 +405,7 @@ get_all_alternatives(struct dirent ***table)
 
 	count = scandir(admdir, table, filter_altdir, alphasort);
 	if (count < 0)
-		error(_("scan of %s failed: %s"), admdir, strerror(errno));
+		syserr(_("cannot scan directory `%.255s'"), admdir);
 
 	return count;
 }
@@ -417,7 +430,7 @@ spawn(const char *prog, const char *args[])
 		error(_("fork failed"));
 	if (pid == 0) {
 		execvp(prog, (char *const *)cmd);
-		error(_("failed to execute %s: %s"), prog, strerror(errno));
+		syserr(_("unable to execute %s (%s)"), prog, prog);
 	}
 	while ((r = waitpid(pid, &status, 0)) == -1 && errno == EINTR) ;
 	if (r != pid)
@@ -500,15 +513,14 @@ static void
 checked_symlink(const char *filename, const char *linkname)
 {
 	if (symlink(filename, linkname))
-		error(_("unable to make %s a symlink to %s: %s"), linkname,
-		      filename, strerror(errno));
+		syserr(_("error creating symbolic link `%.255s'"), linkname);
 }
 
 static void
 checked_mv(const char *src, const char *dst)
 {
 	if (!rename_mv(src, dst))
-		error(_("unable to install %s as %s: %s"), src, dst, strerror(errno));
+		syserr(_("unable to install `%.250s' as `%.250s'"), src, dst);
 }
 
 static void
@@ -518,7 +530,7 @@ checked_rm(const char *f)
 		return;
 
 	if (errno != ENOENT)
-		error(_("unable to remove %s: %s"), f, strerror(errno));
+		syserr(_("unable to remove '%s'"), f);
 }
 
 static void DPKG_ATTR_PRINTF(1)
@@ -644,8 +656,7 @@ fileset_can_install_slave(struct fileset *fs, const char *slave_name)
 
 		errno = 0;
 		if (stat(slave, &st) == -1 && errno != ENOENT)
-			error(_("cannot stat %s: %s"), slave,
-			      strerror(errno));
+			syserr(_("cannot stat file '%s'"), slave);
 		install_slave = (errno == 0) ? true : false;
 	}
 
@@ -1100,7 +1111,7 @@ altdb_print_line(struct altdb_context *ctx, const char *line)
 		      line);
 
 	if (fprintf(ctx->fh, "%s\n", line) < (int) strlen(line) + 1)
-		error(_("while writing %s: %s"), ctx->filename, strerror(errno));
+		syserr(_("unable to write file '%s'"), ctx->filename);
 }
 
 static bool
@@ -1168,8 +1179,7 @@ alternative_parse_fileset(struct alternative *a, struct altdb_context *ctx,
 		char *junk;
 
 		if (errno != ENOENT)
-			error(_("cannot stat %s: %s"), master_file,
-			      strerror(errno));
+			syserr(_("cannot stat file '%s'"), master_file);
 
 		/* File not found - remove. */
 		if (!must_not_die)
@@ -1231,8 +1241,7 @@ alternative_load(struct alternative *a, bool must_not_die)
 		if (errno == ENOENT)
 			return false;
 		else
-			error(_("cannot stat %s: %s"), ctx.filename,
-			      strerror(errno));
+			syserr(_("cannot stat file '%s'"), ctx.filename);
 	}
 	if (st.st_size == 0) {
 		return false;
@@ -1241,7 +1250,7 @@ alternative_load(struct alternative *a, bool must_not_die)
 	/* Open the database file */
 	ctx.fh = fopen(ctx.filename, "r");
 	if (ctx.fh == NULL)
-		error(_("unable to read %s: %s"), ctx.filename, strerror(errno));
+		syserr(_("unable to open file '%s'"), ctx.filename);
 
 	/* Start parsing mandatory attributes (link+status) of the alternative */
 	alternative_reset(a);
@@ -1262,7 +1271,7 @@ alternative_load(struct alternative *a, bool must_not_die)
 
 	/* Close database file */
 	if (fclose(ctx.fh))
-		error(_("unable to close %s: %s"), ctx.filename, strerror(errno));
+		syserr(_("unable to close file '%s'"), ctx.filename);
 	free(ctx.filename);
 
 	/* Initialize the modified field which has been erroneously changed
@@ -1321,7 +1330,7 @@ alternative_save(struct alternative *a)
 	ctx.filename = filenew;
 	ctx.fh = fopen(ctx.filename, "w");
 	if (ctx.fh == NULL)
-		error(_("cannot write %s: %s"), ctx.filename, strerror(errno));
+		syserr(_("unable to create file '%s'"), ctx.filename);
 
 	altdb_print_line(&ctx, alternative_status_string(a->status));
 	altdb_print_line(&ctx, a->master_link);
@@ -1352,7 +1361,7 @@ alternative_save(struct alternative *a)
 
 	/* Close database file */
 	if (fclose(ctx.fh))
-		error(_("unable to close %s: %s"), ctx.filename, strerror(errno));
+		syserr(_("unable to close file '%s'"), ctx.filename);
 
 	/* Put in place atomically. */
 	checked_mv(filenew, file);
@@ -1385,7 +1394,7 @@ alternative_has_current_link(struct alternative *a)
 			free(curlink);
 			return false;
 		}
-		error(_("cannot stat %s: %s"), curlink, strerror(errno));
+		syserr(_("cannot stat file '%s'"), curlink);
 	} else {
 		free(curlink);
 		return true;
@@ -1629,8 +1638,7 @@ alternative_prepare_install_single(struct alternative *a, const char *name,
 	errno = 0;
 	if (lstat(linkname, &st) == -1) {
 		if (errno != ENOENT)
-			error(_("cannot stat %s: %s"), linkname,
-			      strerror(errno));
+			syserr(_("cannot stat file '%s'"), linkname);
 		create_link = true;
 	} else {
 		create_link = S_ISLNK(st.st_mode);
@@ -1901,7 +1909,7 @@ alternative_set_selections(struct alternative_map *all, FILE* input, const char
 		 * contain a space */
 		res = fgets(line, sizeof(line), input);
 		if (res == NULL && errno) {
-			error(_("while reading %s: %s"), desc, strerror(errno));
+			syserr(_("read error in %.250s"), desc);
 		} else if (res == NULL) {
 			break;
 		}
@@ -2035,7 +2043,7 @@ main(int argc, char **argv)
 	admdir = admindir_init();
 
 	if (setvbuf(stdout, NULL, _IONBF, 0))
-		error("setvbuf failed: %s", strerror(errno));
+		syserr("setvbuf failed");
 
 	prog_path = argv[0];