this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Support the -l option with sudo (#357)

+74 -16
+74 -16
src/tools/sudo.c
··· 17 17 along with Darling. If not, see <http://www.gnu.org/licenses/>. 18 18 */ 19 19 20 + #include <stdlib.h> 20 21 #include <unistd.h> 21 22 #include <stdio.h> 22 23 #include <string.h> 24 + #include <sys/types.h> 23 25 24 26 unsigned int firstarg = 1, uid = 0, gid = 0; 25 27 28 + static int list_mode = 0; 29 + 26 30 int argparse(int, char**); 27 31 int usage(int, int); 28 32 29 33 int main(int argc, char **argv) 30 34 { 31 - if ( ( argparse(argc, argv) || usage(argc, 0) ) == 1 ) 32 - return 1; 35 + char *path = getenv("PATH"), *path_orig, *fullpath = NULL; 36 + int i, len; 37 + if (argparse(argc, argv)) 38 + return 1; 33 39 34 40 setuid(uid); 35 41 setgid(gid); 36 42 37 - execvp(argv[firstarg], &argv[firstarg]); 38 - perror("Error"); 39 - return 1; 43 + if (firstarg == argc && list_mode) 44 + { 45 + printf("List mode without command not supported yet.\n"); 46 + return EXIT_SUCCESS; 47 + } 48 + else if (list_mode) 49 + { 50 + /* Print fill path to command, then args if present */ 51 + if (!path) 52 + printf("can't search for command if no path\n"); 53 + path = strdup(path); 54 + path_orig = path; 55 + len = strlen(path_orig); 56 + for (i = 0; i < len; i++) 57 + { 58 + if (path_orig[i] == ':' || path_orig[i] == '\0') 59 + { 60 + path_orig[i] = '\0'; 61 + fullpath = malloc(strlen(argv[firstarg])+strlen(path)+2); 62 + strcpy(fullpath, path); 63 + fullpath[strlen(path)] = '/'; 64 + strcpy(fullpath+strlen(path)+1, argv[firstarg]); 65 + if (access(fullpath, X_OK) == 0) 66 + break; 67 + free(fullpath); 68 + fullpath = NULL; 69 + path = path_orig+i+1; 70 + } 71 + } 72 + free(path_orig); 73 + if (!fullpath) 74 + { 75 + fprintf(stderr, "%s: %s: command not found\n", argv[0], argv[firstarg]); 76 + return EXIT_FAILURE; 77 + } 78 + printf("%s", fullpath); 79 + free(fullpath); 80 + for (i = firstarg+1; i < argc; i++) 81 + { 82 + printf(" %s", argv[i]); 83 + } 84 + putchar('\n'); 85 + return EXIT_SUCCESS; 86 + } 87 + else 88 + { 89 + if (firstarg < argc) 90 + { 91 + execvp(argv[firstarg], &argv[firstarg]); 92 + perror("Running sudo failed"); 93 + } 94 + else 95 + return EXIT_SUCCESS; 96 + } 97 + return EXIT_FAILURE; 40 98 } 41 99 42 100 int argparse(int argc, char **argv) 43 101 { 44 - while( (argv[firstarg] != NULL) && (!strncmp(argv[firstarg], "-", 1)) ) 102 + for (firstarg = 1; firstarg < argc; firstarg++) 45 103 { 46 104 if(!strcmp(argv[firstarg], "-g")) 47 105 { 48 106 sscanf(argv[++firstarg], "%u", &gid); 49 - firstarg++; 50 107 } 51 108 else if(!strcmp(argv[firstarg], "-u")) 52 109 { 53 110 sscanf(argv[++firstarg], "%u", &uid); 54 - firstarg++; 55 111 } 56 112 else if (!strcmp(argv[firstarg], "-A")) 57 113 { 58 - firstarg++; 59 114 } 60 115 else if (!strcmp(argv[firstarg], "-n")) 61 116 { 62 - firstarg++; 63 117 } 64 118 else if (!strcmp(argv[firstarg], "-v")) 65 119 { 66 - firstarg++; 67 120 } 68 121 else if(!strcmp(argv[firstarg], "--")) 69 122 { 70 - firstarg++; 71 123 break; 72 124 } 73 125 else if(!strcmp(argv[firstarg], "-k")) 74 - firstarg++; 126 + { 127 + } 75 128 else if(!strcmp(argv[firstarg], "--help")) 129 + { 76 130 return usage(argc, 1); 131 + } 132 + else if (!strcmp(argv[firstarg], "-l")) 133 + { 134 + list_mode = 1; 135 + } 77 136 else 78 137 { 79 - fprintf(stderr, "Unknown option: %s\n", argv[firstarg]); 80 - return usage(argc, 1); 138 + break; 81 139 } 82 140 } 83 141 return 0; ··· 85 143 86 144 int usage(int argc, int arg_help) 87 145 { 88 - if (argc <= (int)firstarg || arg_help == 1) 146 + if (argc <= firstarg || arg_help == 1) 89 147 { 90 148 fprintf(stderr, "This is a fake 'sudo' implementation, intended for use in Darling.\n" 91 149 "Processes will think they are run as UID/GID 0, but they are still run as your original UID/GID.\n"