Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 12 │ int mysystem(const char* str) {
- 13 │ int argc = 0, sz = 0;
- 14 │ char** argv = NULL;
- 15 │
- 16 │ int n = strlen(str);
- 17 │ int L = 0;
- 18 │ while (L < n) {
- 19 │ if (isspace(str[L])) {
- 20 │ ++L;
- 21 │ continue;
- 22 │ }
- 23 │ int R = L;
- 24 │ while (R < n && !isspace(str[R])) {
- 25 │ ++R;
- 26 │ }
- 27 │
- 28 │ if (argc + 1 >= sz) {
- 29 │ if (!(sz *= 2)) {
- 30 │ sz = 64;
- 31 │ }
- 32 │ argv = realloc(argv, sz * sizeof(argv[0]));
- 33 │ }
- 34 │ argv[argc] = malloc(R - L + 1);
- 35 │ memcpy(argv[argc], str + L, R - L);
- 36 │ argv[argc][R - L] = '\0';
- 37 │ // printf("argv[%d] = \"%s\"\n", argc, argv[argc]);
- 38 │ ++argc;
- 39 │ L = R + 1;
- 40 │ }
- 41 │ if (argc == 0) {
- 42 │ return -1;
- 43 │ }
- 44 │
- 45 │ argv[argc] = NULL;
- 46 │ int pid = fork();
- 47 │ if (pid < 0) {
- 48 │ return -1;
- 49 │ }
- 50 │ if (!pid) {
- 51 │ execvp(argv[0], argv);
- 52 │ _exit(1);
- 53 │ }
- 54 │ int status;
- 55 │ while (waitpid(pid, &status, 0) > 0) {}
- 56 │ if (WIFEXITED(status)) {
- 57 │ return WEXITSTATUS(status);
- 58 │ } else if (WIFSIGNALED(status)) {
- 59 │ return 1024 + WTERMSIG(status);
- 60 │ } else {
- 61 │ return 1;
- : 63 │ }
- 64 │
- 65 │ // int main(int argc, char* argv[]) {
- 66 │ // if (argc != 2) {
- 67 │ // return 1;
- 68 │ // }
- 69 │ // printf("exited with code %d\n", mysystem(argv[1]));
- 70 │ // }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement