Changeset 70d689a in rtems for cpukit/libmisc/shell/shell.c


Ignore:
Timestamp:
Aug 9, 2001, 10:08:46 PM (20 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
b6a2d2fa
Parents:
bd520203
Message:

2001-08-09 Fernando-Ruiz Casas <correo@…>

  • shell/Makefile.am, shell/README, shell/cmds.c, shell/shell.c, shell/shell.h: Updates.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libmisc/shell/shell.c

    rbd520203 r70d689a  
    1717#endif
    1818
     19#undef  __STRICT_ANSI__  /* fileno() */
    1920#include <stdio.h>
    2021
     
    3031#include <stdlib.h>
    3132#include <ctype.h>
     33#include <sys/stat.h>
    3234#include <unistd.h>
    3335#include <errno.h>
     
    223225  shell_cmd_t * shell_cmd=shell_first_cmd;
    224226  if (argc<2) {
    225    printf("help: TOPIC? The topics are\n");       
     227   printf("help: ('r' repeat last cmd - 'e' edit last cmd)\n"     
     228          "  TOPIC? The topics are\n");   
    226229   topic=shell_first_topic;
    227230   col=0;
     
    276279}
    277280/* ----------------------------------------------- *
    278  * TODO:Change to bash readline() better.
     281 * TODO: Add improvements. History, edit vi or emacs, ...
    279282 * ----------------------------------------------- */
    280283int shell_scanline(char * line,int size,FILE * in,FILE * out) {
    281284  int c,col;
    282285  col=0;
     286  if (*line) {
     287   col=strlen(line);     
     288   if (out) fprintf(out,"%s",line);
     289  };
     290  tcdrain(fileno(in ));
    283291  tcdrain(fileno(out));
    284292  for (;;) {
     
    344352}
    345353
     354void write_file(char * name,char * content) {
     355        FILE * fd;
     356        fd=fopen(name,"w");
     357        if (fd) {
     358         fwrite(content,1,strlen(content),fd);
     359         fclose(fd);
     360        }; 
     361}
     362
     363void init_issue(void) {
     364 static char issue_inited=FALSE;
     365 struct stat buf;
     366 if (issue_inited) return;
     367 issue_inited=TRUE;
     368 getpwnam("root"); /* dummy call to init /etc dir */
     369 if (stat("/etc/issue",&buf))
     370  write_file("/etc/issue",
     371             "Welcome to @V\\n"
     372             "Login into @S(@L)\\n");
     373 if (stat("/etc/issue.net",&buf))
     374  write_file("/etc/issue.net",
     375             "Welcome to %v\n"
     376             "running on %m\n");
     377}
     378
    346379int shell_login(FILE * in,FILE * out) {
    347380        FILE * fd;
     
    352385        char pass[128];
    353386        struct passwd * passwd;
     387        init_issue();
    354388        setuid(0);
    355389        setgid(0);
     
    360394            (current_shell_env->devname[6]!='t')||
    361395            (current_shell_env->devname[7]!='y')) {
    362            cat_file(out,"/etc/issue");
     396          fd=fopen("/etc/issue","r");
     397          if (fd) {
     398           while ((c=fgetc(fd))!=EOF) {
     399            if (c=='@')  {
     400             switch(c=fgetc(fd)) {
     401              case 'L':fprintf(out,"%s",current_shell_env->devname);
     402                      break;
     403              case 'B':fprintf(out,"0");
     404                      break;
     405              case 'T':
     406              case 'D':time(&t);
     407                      fprintf(out,"%s",ctime(&t));
     408                      break;
     409              case 'S':fprintf(out,"RTEMS");
     410                      break;
     411              case 'V':fprintf(out,"%s\n%s",_RTEMS_version,_Copyright_Notice);
     412                      break;
     413              case '@':fprintf(out,"@");
     414                      break;
     415              default :fprintf(out,"@%c",c);
     416                      break;
     417             };
     418            } else
     419            if (c=='\\')  {
     420             switch(c=fgetc(fd)) {
     421              case '\\':fprintf(out,"\\");
     422                      break;
     423              case 'b':fprintf(out,"\b"); break;
     424              case 'f':fprintf(out,"\f"); break;
     425              case 'n':fprintf(out,"\n"); break;
     426              case 'r':fprintf(out,"\r"); break;
     427              case 's':fprintf(out," "); break;
     428              case 't':fprintf(out,"\t"); break;
     429              case '@':fprintf(out,"@"); break;
     430             };
     431            } else {
     432             fputc(c,out);                             
     433            };
     434           };
     435           fclose(fd);
     436          }
    363437         } else { 
    364438          fd=fopen("/etc/issue.net","r");
     
    398472        };
    399473        times=0;
     474        strcpy(name,"");
     475        strcpy(pass,"");
    400476        for (;;) {
    401477                times++;
     
    407483                if (out) fprintf(out,"\n");
    408484                if ((passwd=getpwnam(name))) {
    409                  setuid(passwd->pw_uid);                       
    410                  setgid(passwd->pw_gid);                       
    411                  rtems_current_user_env->euid=
    412                  rtems_current_user_env->egid=0;
    413                  chown(current_shell_env->devname,passwd->pw_uid,0);
    414                  rtems_current_user_env->euid=passwd->pw_uid;                   
    415                  rtems_current_user_env->egid=passwd->pw_gid;                   
    416                  if (!strcmp(passwd->pw_passwd,"*")) {
    417                  /* /etc/shadow */
    418                   return 0;
    419                  } else {
    420                   /* crypt() */
    421                   return 0;
     485                 if (strcmp(passwd->pw_passwd,"!")) { /* valid user */
     486                  setuid(passwd->pw_uid);                       
     487                  setgid(passwd->pw_gid);                       
     488                  rtems_current_user_env->euid=
     489                  rtems_current_user_env->egid=0;
     490                  chown(current_shell_env->devname,passwd->pw_uid,0);
     491                  rtems_current_user_env->euid=passwd->pw_uid;                 
     492                  rtems_current_user_env->egid=passwd->pw_gid;                 
     493                  if (!strcmp(passwd->pw_passwd,"*")) {
     494                   /* /etc/shadow */
     495                   return 0;
     496                  } else {
     497                   /* crypt() */
     498                   return 0;
     499                  };
    422500                 };
    423501                };
    424502                if (out) fprintf(out,"Login incorrect\n");
     503                strcpy(name,"");
     504                strcpy(pass,"");
    425505        };
    426506        return -1;
     
    487567    fprintf(stderr,"shell:unable to open stdout.%s:%s\n",devname,strerror(errno));
    488568   };
     569   setvbuf(stdout,NULL,_IONBF,0); /* Not buffered*/
    489570   stderr=fopen(devname,"r+");
    490571   if (!stderr) {
     
    498579  shell_add_cmd(NULL,NULL,NULL,NULL); /* init the chain list*/
    499580  do {
     581   /* Set again root user and root filesystem, side effect of set_priv..*/       
     582  sc=rtems_libio_set_private_env();
     583  if (sc!=RTEMS_SUCCESSFUL) {
     584   rtems_error(sc,"rtems_libio_set_private_env():");     
     585   rtems_task_delete(RTEMS_SELF);
     586  };
    500587  if (!shell_login(stdin,stdout))  {
    501588   cat_file(stdout,"/etc/motd");
     
    503590   strcpy(cmd,"");
    504591   printf("\n"
    505           "RTEMS SHELL (Version 1.0-FRC):%s. "__DATE__". 'help' to list commands.\n",devname);
    506    chdir("/");
     592          "RTEMS SHELL (Ver.1.0-FRC):%s. "__DATE__". 'help' to list commands.\n",devname);
     593   chdir("/"); /* XXX: chdir to getpwent homedir */
    507594   shell_env->exit_shell=FALSE;
    508595   for (;;) {
     
    514601    if (!shell_scanline(cmd,sizeof(cmd),stdin,stdout)) break; /*EOF*/
    515602    /* evaluate cmd section */   
    516     if (!strcmp(cmd,"r")) {  /* repeat last command, forced, not automatic */
     603    if (!strcmp(cmd,"e")) {  /* edit last command */
     604     strcpy(cmd,last_cmd);
     605     continue;
     606    } else
     607    if (!strcmp(cmd,"r")) {  /* repeat last command */
    517608     strcpy(cmd,last_cmd);
    518609    } else
     
    537628    /* end exec cmd section */   
    538629    if (shell_env->exit_shell)  break;
     630    cmd[0]=0;
    539631   };
    540632   printf("\nGoodbye from RTEMS SHELL :-(\n");
     
    589681 return rtems_task_start(task_id,shell_shell,(rtems_task_argument) shell_env);
    590682}
    591 /* ----------------------------------------------- */
Note: See TracChangeset for help on using the changeset viewer.