Не могу написать на стандартный ввод данных с открытым доступом с записью - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь создать графический интерфейс для linux-версии windscribe, поэтому я хочу связаться с CLI-модулем windscribe из моей C-программы. Я решил использовать popen.

Я могу написать отдельные команды с помощью popen («команда», «w»), но я хочу добавить информацию при запросе, например, войти в CLI:

$ windscribe login
Windscribe Username: myname
Windscribe Password: mypassword

Так что я держу ФАЙЛ открытым и использую fputs для продолжения отправки информации. Я наконец написал эту функцию:

void write_in_shell_commands(char** commands, int length){
    FILE *fp = NULL;

    // sending first command
    if (length > 0) {
        debug("Writing \"%s\" to shell.", commands[0]);
        fp = popen(commands[0], "w");
    }

    // sending the rest
    if (fp) {
        debug("File successfully opened.");

        for (int i = 1; i < length; i++){
            debug("%s", "Writing to shell.");
            fputs(commands[i], fp);
        }

        pclose(fp);
    } else {
        debug("Operation failed.");
    }
}

Но когда я использую эту функцию (например,) для входа в систему, она не работает, как я ожидал, кажется, что дополнительные команды теряются и не учитываются.

char* cmd1 = "windscribe login";
char* cmd2 = "myname";
char* cmd3 = "mypassword";

char** commands = malloc(3 * sizeof(char*));
commands[0] = cmd1;
commands[1] = cmd2;
commands[2] = cmd3;

write_in_shell_commands(commands, 3);

Я ожидаю, что программа:

  1. Написать cmd1 в оболочке
  2. Запишите cmd2 в стандартный ввод
  3. Запишите cmd3 в стандартный ввод

Но на самом деле это происходит

DEBUG output/shellwriter.c:22: Writing "windscribe login" to shell. 
DEBUG output/shellwriter.c:27: File successfully opened. 
DEBUG output/shellwriter.c:30: Writing to shell. 
DEBUG output/shellwriter.c:30: Writing to shell. 
Windscribe Password: Windscribe Username: 

На самом деле он запрашивает пароль в терминале и в конечном итоге дает сбой, потому что учетные данные неверны.

Что на самом деле здесь происходит? Где мои вторая и третья команды? Я использую неправильные функции?

1 Ответ

0 голосов
/ 08 сентября 2018

cmd1, cmd2, cmd3 - указатели на символ. Таким образом, вы должны выделить 3 указателя памяти для char для commands, который является указателем на указатель на символ.

char** commands = malloc(3*sizeof(char*));
...