Beispiel #1
0
void nls_set_lang(const char *s)
{
  int i;

  for(i = 0 ; langs[i] ; i++) {
    if(!strcmp(s, langs[i]->name)) {
      nls_hash = langs[i]->hash;
      gettext_init();
      return ;
    }
  }
}
Beispiel #2
0
/**
 * main() - IUCV CONN program startup
 */
int main(int argc, char *argv[])
{
	int			rc;
	int 			server;
	struct sockaddr_iucv	addr;
	struct termios		ios;
	struct sigaction	sigact;
	struct passwd		*passwd;
	struct iucvterm_cfg	conf;


	/* gettext initialization */
	gettext_init();

	/* parse command line options */
	parse_options(PROG_IUCV_CONN, &conf, argc, argv);

	/* open session audit log */
	if (conf.sessionlog != NULL)
		if (open_session_log(conf.sessionlog)) {
			print_error("Creating the terminal session "
				    "log files failed");
			return 1;
		}

	/* open socket and connect to server */
	server = iucvtty_socket(&addr, conf.host, conf.service);
	if (server == -1) {
		print_error((errno == EAFNOSUPPORT)
			    ? N_("The AF_IUCV address family is not available")
			    : N_("Creating the AF_IUCV socket failed"));
		return 1;
	}

	/* syslog */
	openlog(SYSLOG_IDENT, LOG_PID, LOG_AUTHPRIV);

	/* get user information for syslog */
	passwd = getpwuid(geteuid());

	if (connect(server, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
		switch (errno) {
		case EAGAIN:
			print_error("The new connection would exceed the "
				    "maximum number of IUCV connections");
			break;
		case ENETUNREACH:
			print_error("The target z/VM guest virtual machine "
				    "is not logged on");
			break;
		case EACCES:
			print_error("The IUCV authorizations do not permit "
				    "connecting to the target z/VM guest");
			break;
		default:
			print_error("Connecting to the z/VM guest virtual "
				    "machine failed");
			break;
		}
		AUDIT("Connection to %s/%s failed for user %s (uid=%i)",
			conf.host, conf.service,
			(passwd != NULL) ? passwd->pw_name : "n/a", geteuid());
		rc = 2;
		goto return_on_error;
	}
	AUDIT("Established connection to %s/%s for user %s (uid=%i)",
		conf.host, conf.service,
		(passwd != NULL) ? passwd->pw_name : "n/a", geteuid());

	/* send client params */
	iucvtty_tx_termenv(server, DEFAULT_TERM);
	iucvtty_tx_winsize(server, STDIN_FILENO);

	/* register signal handler */
	sigemptyset(&sigact.sa_mask);
	sigact.sa_flags = SA_RESTART;
	sigact.sa_handler = sig_handler;
	sigaction(SIGWINCH, &sigact, NULL);
	sigaction(SIGTERM,  &sigact, NULL);

	/* modify terminal settings */
	if (tcgetattr(STDIN_FILENO, &ios_orig)) {
		print_error("Getting the terminal I/O settings failed");
		rc = 3;
		goto return_on_error;
	}
	memcpy(&ios, &ios_orig, sizeof(ios));

	/* put terminal into raw mode */
	cfmakeraw(&ios);
	/* NOTE: If the tty driver (ldisc) runs in TTY_DRIVER_REAL_RAW,
	 *       we need to do the input character processing here;
	 *       that means to translate CR into CR + NL (ICRNL).
	 * Define TTY_REAL_RAW in for that case. */
#ifdef TTY_REAL_RAW
	ios.c_iflag |= ICRNL;			/* | IGNPAR | IGNBRK; */
#endif
	tcflush(STDIN_FILENO, TCIOFLUSH);
	if (tcsetattr(STDIN_FILENO, TCSANOW, &ios)) {
		print_error("Modifying the terminal I/O settings failed");
		rc = 4;
		goto return_on_error;
	}

	iucvtty_worker(server, &conf);

	tcsetattr(STDIN_FILENO, TCSANOW, &ios_orig);

	rc = 0;
return_on_error:
	close(server);
	closelog();
	close_session_log();

	return rc;
}
Beispiel #3
0
void nls_init(void)
{
  nls_hash = 0;
  gettext_init();
}
Beispiel #4
0
/**
 * main() - IUCV TTY program startup
 */
int main(int argc, char *argv[])
{
    struct iucvterm_cfg	conf;		/* program configuration */
    struct sockaddr_iucv	saddr, caddr;	/* IUCV socket address info */
    char 			client_host[9];	/* client guest name */
    int 			server, client;	/* socket file descriptors */
    int 			master, slave;	/* pre-allocated PTY fds */
    struct sigaction	sigact;		/* signal handler */
    int 			rc;
    socklen_t		len;


    /* gettext initialization */
    gettext_init();

    /* parse command line arguments */
    parse_options(PROG_IUCV_TTY, &conf, argc, argv);

    /* create server socket... */
    server = iucvtty_socket(&saddr, NULL, conf.service);
    if (server == -1) {
        print_error((errno == EAFNOSUPPORT)
                    ? N_("The AF_IUCV address family is not available")
                    : N_("Creating the AF_IUCV socket failed"));
        return 1;
    }
    if (bind(server, (struct sockaddr *) &saddr, sizeof(saddr)) == -1) {
        print_error("Binding the AF_IUCV socket failed");
        close(server);
        return 1;
    }
    if (listen(server, 1) == -1) {
        print_error("Listening for incoming connections failed");
        close(server);
        return 1;
    }

    /* pre-allocate PTY master/slave file descriptors */
    if (openpty(&master, &slave, NULL, NULL, NULL)) {
        print_error("Opening a new PTY master/slave device pair failed");
        close(server);
        return 1;
    }

    /* set close-on-exec for file descriptors */
    fcntl(master, F_SETFD, FD_CLOEXEC);
    fcntl(server, F_SETFD, FD_CLOEXEC);

    /* syslog */
    openlog(SYSLOG_IDENT, LOG_PID, LOG_AUTHPRIV);
    syslog(LOG_INFO, "Listening on terminal ID: %s, using pts device: %s",
           conf.service, ttyname(slave));

    rc = 0;
    len = sizeof(struct sockaddr_iucv);
    /* accept a new client connection */
    client = accept(server, (struct sockaddr *) &caddr, &len);
    if (client == -1) {
        print_error("An incoming connection could not be accepted");
        rc = 2;
        goto exit_on_error;
    }

    /* check if client is allowed to connect */
    userid_cpy(client_host, caddr.siucv_user_id);
    if (is_client_allowed(client_host, &conf)) {
        iucvtty_tx_error(client, ERR_NOT_AUTHORIZED);
        syslog(LOG_WARNING, "Rejected client connection from %s; "
               "Client is not allowed to connect.",
               client_host);
        rc = 3;

    } else { /* client is allowed to connect */
        syslog(LOG_INFO, "Accepted client connection from %s",
               client_host);
        /* set close-on-exec for client socket */
        fcntl(client, F_SETFD, FD_CLOEXEC);
        /* close server socket */
        close(server);

        /* setup signal handler to notify shutdown signal */
        sigemptyset(&sigact.sa_mask);
        sigact.sa_flags = SA_RESTART;
        sigact.sa_handler = sig_handler;
        if (sigaction(SIGCHLD, &sigact, NULL)
                || sigaction(SIGTERM, &sigact, NULL)
                || sigaction(SIGINT,  &sigact, NULL)
                || sigaction(SIGPIPE, &sigact, NULL)) {
            print_error("Registering a signal handler failed");
            rc = 4;
            goto exit_on_error;
        }

        /* handle client terminal connection */
        rc = iucvtty_worker(client, master, slave, &conf);
    }

    close(client);

exit_on_error:
    close(slave);
    close(master);
    closelog();

    return rc;
}