Description:
add option -A <opt> to box. This options allow more argument to be explicitly passed to the program
We have to use this because if the argument we wish to pass to the program is option (in -? format),
box will intepret it as its option and failed accordingly.
be noted that, by the definition of getopt, these options will be put after original argument
(check the code for more info)
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
r186:c8d646326d0a - - 1 file changed: 17 inserted, 4 deleted
@@ -1653,23 +1653,27 | |||||
|
1653 | -t <time>\tSet run time limit (seconds, fractions allowed)\n\ |
|
1653 | -t <time>\tSet run time limit (seconds, fractions allowed)\n\ |
|
1654 | -T\t\tAllow syscalls for measuring run time\n\ |
|
1654 | -T\t\tAllow syscalls for measuring run time\n\ |
|
1655 | -v\t\tBe verbose (use multiple times for even more verbosity)\n\ |
|
1655 | -v\t\tBe verbose (use multiple times for even more verbosity)\n\ |
|
1656 | -w <time>\tSet wall clock time limit (seconds, fractions allowed)\n\ |
|
1656 | -w <time>\tSet wall clock time limit (seconds, fractions allowed)\n\ |
|
1657 | -x <time>\tSet extra timeout, before which a timing-out program is not yet killed,\n\ |
|
1657 | -x <time>\tSet extra timeout, before which a timing-out program is not yet killed,\n\ |
|
1658 | \t\tso that its real execution time is reported (seconds, fractions allowed)\n\ |
|
1658 | \t\tso that its real execution time is reported (seconds, fractions allowed)\n\ |
|
|
1659 | + -A <opt>\tPass <opt> as additional argument to the <command>\n\ | ||
|
|
1660 | + \t\tBe noted that this option will be appended after <arguments> respectively\n\ | ||
|
1659 | "); |
|
1661 | "); |
|
1660 | exit(2); |
|
1662 | exit(2); |
|
1661 | } |
|
1663 | } |
|
1662 |
|
1664 | ||
|
1663 | int |
|
1665 | int |
|
1664 | main(int argc, char **argv) |
|
1666 | main(int argc, char **argv) |
|
1665 | { |
|
1667 | { |
|
1666 | int c; |
|
1668 | int c; |
|
1667 | uid_t uid; |
|
1669 | uid_t uid; |
|
|
1670 | + char **prog_argv = xmalloc(sizeof(char*) * argc); | ||
|
|
1671 | + int prog_argc = 0; | ||
|
1668 |
|
1672 | ||
|
1669 | - while ((c = getopt(argc, argv, "a:c:eE:fi:k:m:M:o:p:r:s:t:Tvw:x:")) >= 0) |
|
1673 | + while ((c = getopt(argc, argv, "a:c:eE:fi:k:m:M:o:p:r:s:t:Tvw:x:A:")) >= 0) |
|
1670 | switch (c) |
|
1674 | switch (c) |
|
1671 | { |
|
1675 | { |
|
1672 | case 'a': |
|
1676 | case 'a': |
|
1673 | file_access = atol(optarg); |
|
1677 | file_access = atol(optarg); |
|
1674 | break; |
|
1678 | break; |
|
1675 | case 'c': |
|
1679 | case 'c': |
@@ -1722,12 +1726,15 | |||||
|
1722 | break; |
|
1726 | break; |
|
1723 | case 'w': |
|
1727 | case 'w': |
|
1724 | wall_timeout = 1000*atof(optarg); |
|
1728 | wall_timeout = 1000*atof(optarg); |
|
1725 | break; |
|
1729 | break; |
|
1726 | case 'x': |
|
1730 | case 'x': |
|
1727 | extra_timeout = 1000*atof(optarg); |
|
1731 | extra_timeout = 1000*atof(optarg); |
|
|
1732 | + case 'A': | ||
|
|
1733 | + prog_argv[prog_argc++] = strdup(optarg); | ||
|
|
1734 | + break; | ||
|
1728 | break; |
|
1735 | break; |
|
1729 | default: |
|
1736 | default: |
|
1730 | usage(); |
|
1737 | usage(); |
|
1731 | } |
|
1738 | } |
|
1732 | if (optind >= argc) |
|
1739 | if (optind >= argc) |
|
1733 | usage(); |
|
1740 | usage(); |
@@ -1736,12 +1743,18 | |||||
|
1736 | uid = geteuid(); |
|
1743 | uid = geteuid(); |
|
1737 | if (setreuid(uid, uid) < 0) |
|
1744 | if (setreuid(uid, uid) < 0) |
|
1738 | die("setreuid: %m"); |
|
1745 | die("setreuid: %m"); |
|
1739 | box_pid = fork(); |
|
1746 | box_pid = fork(); |
|
1740 | if (box_pid < 0) |
|
1747 | if (box_pid < 0) |
|
1741 | die("fork: %m"); |
|
1748 | die("fork: %m"); |
|
1742 | - if (!box_pid) |
|
1749 | + if (!box_pid) { |
|
1743 | - box_inside(argc-optind, argv+optind); |
|
1750 | + int real_argc = prog_argc + argc - optind; |
|
1744 | - else |
|
1751 | + char **real_argv = xmalloc(sizeof(char*) * (real_argc)); |
|
|
1752 | + for (int i = 0;i < argc-optind;i++) | ||
|
|
1753 | + real_argv[i] = strdup(argv[i+optind]); | ||
|
|
1754 | + for (int i = 0;i < prog_argc;i++) | ||
|
|
1755 | + real_argv[argc - optind + i] = strdup(prog_argv[i]); | ||
|
|
1756 | + box_inside(real_argc, real_argv); | ||
|
|
1757 | + } else | ||
|
1745 | boxkeeper(); |
|
1758 | boxkeeper(); |
|
1746 | die("Internal error: fell over edge of the world"); |
|
1759 | die("Internal error: fell over edge of the world"); |
|
1747 | } |
|
1760 | } |
You need to be logged in to leave comments.
Login now