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

网络编程

开发平台:

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 <ctype.h>
  13. #include "popper.h"
  14. /* 
  15.  *  parse:  Parse a raw input line from a POP client 
  16.  *  into null-delimited tokens
  17.  */
  18. pop_parse(p,buf)
  19. POP         *   p;
  20. char        *   buf;        /*  Pointer to a message containing 
  21.                                 the line from the client */
  22. {
  23.     char            *   mp;
  24.     register int        i;
  25.     
  26.     /*  Loop through the POP command array */
  27.     for (mp = buf, i = 0; ; i++) {
  28.     
  29.         /*  Skip leading spaces and tabs in the message */
  30.         while (isspace(*mp))mp++;
  31.         /*  Are we at the end of the message? */
  32.         if (*mp == 0) break;
  33.         /*  Have we already obtained the maximum allowable parameters? */
  34.         if (i >= MAXPARMCOUNT) {
  35.             pop_msg(p,POP_FAILURE,"Too many arguments supplied.");
  36.             return(-1);
  37.         }
  38.         /*  Point to the start of the token */
  39.         p->pop_parm[i] = mp;
  40.         /*  Search for the first space character (end of the token) */
  41.         while (!isspace(*mp) && *mp) mp++;
  42.         /*  Delimit the token with a null */
  43.         if (*mp) *mp++ = 0;
  44.   if (i == 0) {
  45.     /*  Convert the first token (POP command) to lower case */
  46.     pop_lower(p->pop_command);
  47.     /*
  48.      * This is kinda gross.  Passwords have to be parsed diffrently
  49.      * as they may contain spaces.  If you think of a cleaner way,
  50.      * do it.  The "p->pop_command[0] == 'p'" is so save a call to
  51.      * strcmp() on ever call to pop_parse();  This parsing keeps
  52.    * leading and trailing speces behind for the password command.
  53.      */
  54.     if(p->pop_command[0] == 'p' && strcmp(p->pop_command,"pass") == 0) {
  55.       if (*mp != 0) {
  56.         p->pop_parm[1] = mp;
  57.               if (strlen(mp) > 0) {
  58.                 mp = mp + strlen(mp) - 1;
  59.                 while (*mp == 0xa || *mp == 0xd) *mp-- = 0;
  60.               }
  61.         return(1);
  62.       } else
  63.         return (-1);
  64.     }
  65.   }
  66.     }
  67.     /*  Were any parameters passed at all? */
  68.     if (i == 0) return (-1);
  69.     /*  Return the number of tokens extracted minus the command itself */
  70.     return (i-1);
  71.     
  72. }