version 1.29, 2015/04/24 16:30:06 |
version 1.30, 2015/04/24 16:47:32 |
|
|
int |
int |
main(int argc, char **argv) |
main(int argc, char **argv) |
{ |
{ |
struct input_file *files = NULL; |
struct input_file inf; |
int nfiles, opt, i, width = 0; |
int opt, i, width = 0; |
FILE *f; |
FILE *f; |
struct magic *m; |
struct magic *m; |
char *home, *path; |
char *home, *path; |
|
|
} else if (argc == 0) |
} else if (argc == 0) |
usage(); |
usage(); |
|
|
nfiles = argc; |
|
if (nfiles != 0) { |
|
files = xcalloc(nfiles, sizeof *files); |
|
for (i = 0; i < argc; i++) |
|
open_file(&files[i], argv[i], &width); |
|
} |
|
|
|
home = getenv("HOME"); |
home = getenv("HOME"); |
if (home == NULL || *home == '\0') { |
if (home == NULL || *home == '\0') { |
pw = getpwuid(getuid()); |
pw = getpwuid(getuid()); |
|
|
if (f == NULL) |
if (f == NULL) |
err(1, "%s", path); |
err(1, "%s", path); |
|
|
if (geteuid() == 0) { |
|
pw = getpwnam(FILE_USER); |
|
if (pw == NULL) |
|
errx(1, "unknown user %s", FILE_USER); |
|
if (setgroups(1, &pw->pw_gid) != 0) |
|
err(1, "setgroups"); |
|
if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) != 0) |
|
err(1, "setresgid"); |
|
if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) != 0) |
|
err(1, "setresuid"); |
|
} |
|
|
|
m = magic_load(f, path, cflag || Wflag); |
m = magic_load(f, path, cflag || Wflag); |
if (cflag) { |
if (cflag) { |
magic_dump(m); |
magic_dump(m); |
exit(0); |
exit(0); |
} |
} |
|
|
for (i = 0; i < nfiles; i++) |
for (i = 0; i < argc; i++) { |
test_file(m, &files[i], width); |
memset(&inf, 0, sizeof inf); |
|
open_file(&inf, argv[i], &width); |
|
test_file(m, &inf, width); |
|
} |
exit(0); |
exit(0); |
} |
} |
|
|
|
|
} |
} |
if (got == 0) |
if (got == 0) |
break; |
break; |
next = (char*)next + got; |
next = (char *)next + got; |
left -= got; |
left -= got; |
} |
} |
|
|
|
|
printf("%s\n", inf->result); |
printf("%s\n", inf->result); |
else |
else |
printf("%-*s %s\n", width, inf->label, inf->result); |
printf("%-*s %s\n", width, inf->label, inf->result); |
|
free(inf->result); |
|
|
if (inf->mapped && inf->base != NULL) |
if (inf->mapped && inf->base != NULL) |
munmap(inf->base, inf->size); |
munmap(inf->base, inf->size); |
inf->base = NULL; |
inf->base = NULL; |
|
|
free(inf->result); |
if (inf->fd != -1) |
|
close(inf->fd); |
|
free((void *)inf->label); |
|
free((void *)inf->path); |
} |
} |