pop_get_command.c
上传用户:dayuan858
上传日期:2007-01-04
资源大小:194k
文件大小:4k
源码类别:

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1989 Regents of the University of California.
  3.  * All rights reserved.  The Berkeley software License Agreement
  4.  * specifies the terms and conditions for redistribution.
  5.  */
  6. /*
  7.  * Copyright (c) 1997 by Qualcomm Incorporated.
  8.  */
  9. #include <config.h>
  10. #include <stdio.h>
  11. #include <sys/types.h>
  12. #include <string.h>
  13. #if HAVE_STRINGS_H
  14. #include <strings.h>
  15. #endif
  16. #include "popper.h"
  17. /* 
  18.  *  get_command:    Extract the command from an input line form a POP client
  19.  */
  20. static state_table states[] = {
  21.         auth1,  "user", 1,  1,  pop_user,   {auth1, auth2},
  22.         auth2,  "pass", 1,  1,  pop_pass,   {halt,  trans},
  23.         auth1,  "auth", 1,  2,  pop_auth,   {auth1, auth1},
  24. #ifdef RPOP
  25.         auth2,  "rpop", 1,  1,  pop_rpop,   {halt,  trans},
  26. #endif
  27. #ifdef APOP
  28.         auth1,  "apop", 2,  2,  pop_apop,   {halt,  trans},
  29. #endif
  30.         auth1,  "quit", 0,  0,  pop_quit,   {halt,  halt},
  31.         auth2,  "quit", 0,  0,  pop_quit,   {halt,  halt},
  32.         trans,  "stat", 0,  0,  pop_stat,   {trans, trans},
  33.         trans,  "list", 0,  1,  pop_list,   {trans, trans},
  34.         trans,  "retr", 1,  1,  pop_send,   {trans, trans},
  35.         trans,  "dele", 1,  1,  pop_dele,   {trans, trans},
  36.         trans,  "noop", 0,  0,  NULL,       {trans, trans},
  37.         trans,  "rset", 0,  0,  pop_rset,   {trans, trans},
  38.         trans,  "top",  2,  2,  pop_send,   {trans, trans},
  39.         trans,  "last", 0,  0,  pop_last,   {trans, trans},
  40.         trans,  "xtnd", 1,  99, pop_xtnd,   {trans, trans},
  41.         trans,  "uidl", 0,  1,  pop_uidl,   {trans, trans},
  42.         trans,  "euidl",0,  1,  pop_euidl,  {trans, trans},
  43.         trans,  "quit", 0,  0,  pop_updt,   {halt,  halt},
  44.         (state) 0,  NULL,   0,  0,  NULL,       {halt,  halt},
  45. };
  46. state_table *pop_get_command(p,mp)
  47. POP             *   p;
  48. register char   *   mp;         /*  Pointer to unparsed line 
  49.                                     received from the client */
  50. {
  51.     state_table     *   s;
  52.     char                buf[MAXMSGLINELEN];
  53.     /*  Save a copy of the original client line */
  54. #ifdef DEBUG
  55.     if(p->debug) strncpy(buf, mp, sizeof(buf));
  56. #endif
  57.     /*  Parse the message into the parameter array */
  58.     if ((p->parm_count = pop_parse(p,mp)) < 0) return(NULL);
  59.     /*  Do not log cleartext passwords */
  60. #ifdef DEBUG
  61.     if(p->debug){
  62.         if(strcmp(p->pop_command,"pass") == 0)
  63.             pop_log(p,POP_DEBUG,"Received: "%.128s xxxxxxxxx"",p->pop_command);
  64.         else {
  65.             /*  Remove trailing <LF> */
  66.             buf[strlen(buf)-2] = '';
  67.             pop_log(p,POP_DEBUG,"Received: "%.128s"",buf);
  68.         }
  69.     }
  70. #endif
  71.     /*  Search for the POP command in the command/state table */
  72.     for (s = states; s->command; s++) {
  73.         /*  Is this a valid command for the current operating state? */
  74.         if (strcmp(s->command,p->pop_command) == 0
  75.              && s->ValidCurrentState == p->CurrentState) {
  76.             /*  Were too few parameters passed to the command? */
  77.             if (p->parm_count < s->min_parms) {
  78.                 pop_msg(p,POP_FAILURE,
  79.                     "Too few arguments for the %.128s command.",p->pop_command);
  80.                 return((state_table *)0);
  81.             }
  82.             
  83.             /*  Were too many parameters passed to the command? */
  84.             if (p->parm_count > s->max_parms) {
  85.                 pop_msg(p,POP_FAILURE,
  86.                     "Too many arguments for the %.128s command.",p->pop_command);
  87.                 return((state_table *)0);
  88.             }
  89.             
  90.             /*  Return a pointer to the entry for this command in 
  91.                 the command/state table */
  92.             return (s);
  93.         }
  94.     }
  95.     /*  The client command was not located in the command/state table */
  96.     pop_msg(p,POP_FAILURE,"Unknown command: "%.128s".",p->pop_command);
  97.     return((state_table *)0);
  98. }