summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--helpers/mknod.c80
1 files changed, 44 insertions, 36 deletions
diff --git a/helpers/mknod.c b/helpers/mknod.c
index 7328d66..ef7ce98 100644
--- a/helpers/mknod.c
+++ b/helpers/mknod.c
@@ -55,10 +55,25 @@ static const struct option _LONGOPTS[] = {
static const unsigned int _TIMEOUT = 10U;
+static char *_program_name;
+
+static int
+_strtol_or_err(const char *str, long int *l)
+{
+ char *end;
+
+ *l = strtol(str, &end, 10);
+ if (*end != '\0') {
+ fprintf(stderr, _("%s: Invalid number \"%s\"\n"),
+ _program_name, str);
+ return OPKG_OPK_ERROR;
+ }
+ return OPKG_OPK_OK;
+}
+
int
main(int argc, char *argv[])
{
- char *program_name;
char *work_area;
char **exec_argv;
int arg;
@@ -66,7 +81,6 @@ main(int argc, char *argv[])
int opt;
char *name;
char type;
- char *end;
long int major;
long int minor;
char *specials_file_name;
@@ -86,27 +100,27 @@ main(int argc, char *argv[])
setlocale(LC_ALL, "");
#endif
- program_name = argv[0];
+ _program_name = argv[0];
work_area = getenv("OPK_WORK_AREA");
if (work_area == NULL || work_area[0] == '\0') {
fprintf(stderr, _("%s: OPK_WORK_AREA environment variable not "
- "set\n"), program_name);
+ "set\n"), _program_name);
fprintf(stderr, _("%s: Possibly building package dependent on "
"opkg-opk with opkbuild too old to use "
- "it\n"), program_name);
+ "it\n"), _program_name);
fprintf(stderr, _("%s: Executing system mknod instead\n"),
- program_name);
+ _program_name);
exec_argv = calloc(argc + 1, sizeof(*exec_argv));
if (exec_argv == NULL) {
fprintf(stderr, _("%s: Failed to allocate memory\n"),
- program_name);
+ _program_name);
return EXIT_FAILURE;
}
exec_argv[0] = malloc(strlen(MKNOD) + 1);
if (exec_argv[0] == NULL) {
fprintf(stderr, _("%s: Failed to allocate memory\n"),
- program_name);
+ _program_name);
free(exec_argv);
return EXIT_FAILURE;
}
@@ -117,7 +131,7 @@ main(int argc, char *argv[])
exec_argv[argc] = NULL;
execve(MKNOD, exec_argv, NULL); /* Shouldn't return */
fprintf(stderr, _("%s: Failed to execute system mknod\n"),
- program_name);
+ _program_name);
free(exec_argv[0]);
free(exec_argv);
return EXIT_FAILURE;
@@ -139,14 +153,14 @@ main(int argc, char *argv[])
&mode) != OPKG_OPK_OK) {
fprintf(stderr, _("%s: Invalid mode "
"\"%s\"\n"),
- program_name, optarg);
+ _program_name, optarg);
return EXIT_FAILURE;
}
break;
default:
fprintf(stderr, _("%s: Warning: Unknown option:"
" \"%c\"\n"),
- program_name, optopt);
+ _program_name, optopt);
return EXIT_FAILURE;
}
}
@@ -155,7 +169,7 @@ main(int argc, char *argv[])
if (argc < 2) {
fprintf(stderr, _("%s: Wrong number of operands\n"),
- program_name);
+ _program_name);
return EXIT_FAILURE;
}
name = argv[0];
@@ -171,37 +185,29 @@ main(int argc, char *argv[])
if (argc != 2) {
fprintf(stderr, _("%s: Wrong number of "
"operands\n"),
- program_name);
+ _program_name);
return EXIT_FAILURE;
}
if (mkfifo(name, mode) != 0) {
fprintf(stderr, _("%s: Failed to create link "
"\"%s\"\n"),
- program_name, name);
+ _program_name, name);
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
default:
fprintf(stderr, _("%s: Invalid node type \"%c\"\n"),
- program_name, argv[1][0]);
+ _program_name, argv[1][0]);
return EXIT_FAILURE;
}
if (argc != 4) {
fprintf(stderr, _("%s: Wrong number of operands\n"),
- program_name);
+ _program_name);
return EXIT_FAILURE;
}
- major = strtol(argv[2], &end, 10);
- if (*end != '\0') {
- fprintf(stderr, _("%s: Invalid number \"%s\"\n"),
- program_name, argv[2]);
- return EXIT_FAILURE;
- }
- minor = strtol(argv[3], &end, 10);
- if (*end != '\0') {
- fprintf(stderr, _("%s: Invalid number \"%s\"\n"),
- program_name, argv[3]);
+ if (_strtol_or_err(argv[2], &major) != OPKG_OPK_OK ||
+ _strtol_or_err(argv[3], &minor) != OPKG_OPK_OK) {
return EXIT_FAILURE;
}
@@ -209,14 +215,14 @@ main(int argc, char *argv[])
+ 1 /* "\0" */);
if (specials_file_name == NULL) {
fprintf(stderr, _("%s: Failed to allocate memory\n"),
- program_name);
+ _program_name);
return EXIT_FAILURE;
}
specials_lock_name = malloc(strlen(work_area) + strlen("/specials~")
+ 1 /* "\0" */);
if (specials_lock_name == NULL) {
fprintf(stderr, _("%s: Failed to allocate memory\n"),
- program_name);
+ _program_name);
free(specials_file_name);
return EXIT_FAILURE;
}
@@ -228,7 +234,8 @@ main(int argc, char *argv[])
*/
fd = open(name, O_CREAT | O_EXCL, mode);
if (fd < 0 || close(fd) < 0) {
- fprintf(stderr, _("%s: Failed to create node\n"), program_name);
+ fprintf(stderr, _("%s: Failed to create node\n"),
+ _program_name);
free(specials_file_name);
free(specials_lock_name);
return EXIT_FAILURE;
@@ -236,12 +243,13 @@ main(int argc, char *argv[])
/* Acquire lock ("specials~"). */
for (timeout = _TIMEOUT; timeout > 0; --timeout) {
- specials_fd = open(specials_lock_name, O_CREAT | O_EXCL, 0644);
+ specials_fd = open(specials_lock_name,
+ O_CREAT | O_EXCL | O_WRONLY, 0644);
if (specials_fd >= 0) {
goto opened;
}
}
- fprintf(stderr, _("%s: Failed to lock specials file\n"), program_name);
+ fprintf(stderr, _("%s: Failed to lock specials file\n"), _program_name);
free(specials_file_name);
free(specials_lock_name);
unlink(name);
@@ -251,7 +259,7 @@ main(int argc, char *argv[])
specials_file = fdopen(specials_fd, "a");
if (specials_file == NULL) {
fprintf(stderr, _("%s: Failed to open specials file stream\n"),
- program_name);
+ _program_name);
close(specials_fd);
free(specials_file_name);
free(specials_lock_name);
@@ -263,7 +271,7 @@ main(int argc, char *argv[])
if (stat(specials_file_name, &stat_buf) != 0) {
if (errno != ENOENT) {
fprintf(stderr, _("%s: Failed to stat specials file\n"),
- program_name);
+ _program_name);
fclose(specials_file);
free(specials_file_name);
free(specials_lock_name);
@@ -274,7 +282,7 @@ main(int argc, char *argv[])
fputs("type major minor name\n",
specials_file) < 0) {
fprintf(stderr, _("%s: Failed to write specials file\n")
- , program_name);
+ , _program_name);
fclose(specials_file);
free(specials_file_name);
free(specials_lock_name);
@@ -285,7 +293,7 @@ main(int argc, char *argv[])
if (fprintf(specials_file, "%c %8ld %8ld %s\n", type, major, minor,
name) < 0) {
fprintf(stderr, _("%s: Failed to write specials file\n"),
- program_name);
+ _program_name);
fclose(specials_file);
free(specials_file_name);
free(specials_lock_name);
@@ -296,7 +304,7 @@ main(int argc, char *argv[])
if (rename(specials_lock_name, specials_file_name) != 0) {
fprintf(stderr, _("%s: Failed to move specials file\n"),
- program_name);
+ _program_name);
free(specials_file_name);
free(specials_lock_name);
unlink(name);