LCOV - code coverage report
Current view: top level - common/utils - prompt.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 50 0.0 %
Date: 2024-12-19 20:05:57 Functions: 0 2 0.0 %

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

Generated by: LCOV version 1.14