LCOV - code coverage report
Current view: top level - common/utils - prompt.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 43 0.0 %
Date: 2021-10-13 02:24:04 Functions: 0 2 0.0 %

          Line data    Source code
       1             : /*
       2             :  * This Source Code Form is subject to the terms of the Mozilla Public
       3             :  * License, v. 2.0.  If a copy of the MPL was not distributed with this
       4             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       5             :  *
       6             :  * Copyright 1997 - July 2008 CWI, August 2008 - 2021 MonetDB B.V.
       7             :  */
       8             : 
       9             : #include "monetdb_config.h"
      10             : #include <unistd.h>
      11             : #include <string.h>
      12             : #ifndef _MSC_VER
      13             : #ifdef HAVE_TERMIOS_H
      14             : #include <termios.h>
      15             : #endif
      16             : #endif
      17             : #include "mprompt.h"
      18             : 
      19             : #ifdef _MSC_VER
      20             : #define fileno _fileno
      21             : #include <conio.h>
      22             : #endif
      23             : 
      24             : #ifndef HAVE_GETLOGIN
      25             : /* we assume this must be windows */
      26             : static char *defaultlogin = "win32";
      27             : #endif
      28             : 
      29             : char *
      30           0 : prompt_getlogin(void)
      31             : {
      32             : #ifdef HAVE_GETLOGIN
      33             : # ifdef __sun__
      34             :         /* from Solaris' getlogin manpage:
      35             :          *  The correct procedure for determining the login name is to call
      36             :          *  cuserid(3C), or to call getlogin() and if  it fails to call
      37             :          *  getpwuid(3C). */
      38             :         return cuserid(NULL);
      39             : # else
      40           0 :         return getlogin();
      41             : # endif
      42             : #else
      43             :         return defaultlogin;
      44             : #endif
      45             : }
      46             : 
      47             : #ifdef _MSC_VER
      48             : char *
      49             : simple_prompt(const char *prompt, int maxlen, int echo, const char *def)
      50             : {
      51             :         size_t length = 0;
      52             :         char *destination = NULL;
      53             : 
      54             :         destination = (char *) malloc(maxlen + 2);
      55             :         if (!destination)
      56             :                 return NULL;
      57             : 
      58             :         if (prompt) {
      59             :                 _cputs(prompt);
      60             :                 if (def) {
      61             :                         _cputs("(");
      62             :                         _cputs(def);
      63             :                         _cputs(")");
      64             :                 }
      65             :                 _cputs(":");
      66             :         }
      67             :         if (echo) {
      68             :                 _cgets_s(destination, maxlen, &length);
      69             :                 while (length > 0 &&
      70             :                        (destination[length - 1] == '\n' ||
      71             :                         destination[length - 1] == '\r'))
      72             :                         destination[--length] = 0;
      73             :         } else {
      74             :                 int c;
      75             : 
      76             :                 while ((c = _getch()) != '\r' && c != '\n') {
      77             :                         if (length < (size_t) maxlen)
      78             :                                 destination[length++] = c;
      79             :                 }
      80             :                 destination[length] = 0;
      81             :                 _cputs("\r\n");
      82             :         }
      83             :         if (length == 0 && def)
      84             :                 strcpy(destination, def);
      85             :         return destination;
      86             : }
      87             : #else
      88             : char *
      89           0 : simple_prompt(const char *prompt, int maxlen, int echo, const char *def)
      90             : {
      91             :         size_t length = 0;
      92             :         char *destination = NULL;
      93             :         FILE *termin = NULL, *termout = NULL;
      94             : 
      95             : #ifdef HAVE_TERMIOS_H
      96             :         struct termios t_orig, t;
      97             : #else
      98             :         (void) echo;
      99             : #endif
     100             : 
     101           0 :         destination = (char *) malloc(maxlen + 2);
     102           0 :         if (!destination)
     103             :                 return NULL;
     104             : 
     105           0 :         termin = fopen("/dev/tty", "r");
     106           0 :         termout = fopen("/dev/tty", "w");
     107             : 
     108           0 :         if (termin == NULL || termout == NULL) {
     109           0 :                 if (termin)
     110           0 :                         fclose(termin);
     111           0 :                 if (termout)
     112           0 :                         fclose(termout);
     113           0 :                 termin = stdin;
     114           0 :                 termout = stderr;
     115             :         }
     116             : 
     117             : #ifdef HAVE_TERMIOS_H
     118           0 :         if (!echo) {
     119           0 :                 tcgetattr(fileno(termin), &t);
     120           0 :                 t_orig = t;
     121           0 :                 t.c_lflag &= ~ECHO;
     122           0 :                 tcsetattr(fileno(termin), TCSAFLUSH, &t);
     123             :         }
     124             : #endif
     125           0 :         if (prompt) {
     126           0 :                 if (def)
     127           0 :                         fprintf(termout, "%s(%s):", prompt, def);
     128             :                 else
     129           0 :                         fprintf(termout, "%s:", prompt);
     130           0 :                 fflush(termout);
     131             :         }
     132           0 :         if (fgets(destination, maxlen, termin) == NULL)
     133           0 :                 destination[0] = '\0';
     134             : 
     135           0 :         length = strlen(destination);
     136           0 :         if (length > 0 && destination[length - 1] != '\n') {
     137             :                 char buf[128];
     138             :                 size_t buflen;
     139             : 
     140             :                 do {
     141           0 :                         if (fgets(buf, sizeof(buf), termin) == NULL)
     142             :                                 break;
     143           0 :                         buflen = strlen(buf);
     144           0 :                 } while (buflen > 0 && buf[buflen - 1] != '\n');
     145             :         }
     146             : 
     147           0 :         if (length > 0 && destination[length - 1] == '\n')
     148           0 :                 destination[length - 1] = '\0';
     149             : #ifdef HAVE_TERMIOS_H
     150           0 :         if (!echo) {
     151           0 :                 tcsetattr(fileno(termin), TCSAFLUSH, &t_orig);
     152           0 :                 fputs("\n", termout);
     153           0 :                 fflush(termout);
     154             :         }
     155             : #endif
     156           0 :         if (termin != stdin)
     157           0 :                 fclose(termin);
     158           0 :         if (termout != stdout)
     159           0 :                 fclose(termout);
     160           0 :         if (destination[0] == 0 && def)
     161           0 :                 strcpy(destination, def);
     162             :         return destination;
     163             : }
     164             : #endif /* _MSC_VER */

Generated by: LCOV version 1.14