home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / w00w00 / sectools / dsniff / missing / dirname.c next >
Encoding:
C/C++ Source or Header  |  2000-04-08  |  2.4 KB  |  75 lines

  1. /* $Id: dirname.c,v 1.1 2000/04/08 20:50:28 dugsong Exp $ */
  2. /*    $OpenBSD: dirname.c,v 1.4 1999/05/30 17:10:30 espie Exp $    */
  3.  
  4. /*
  5.  * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. The name of the author may not be used to endorse or promote products
  17.  *    derived from this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
  20.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  21.  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
  22.  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  23.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  24.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  25.  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  26.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  27.  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  28.  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.  */
  30.  
  31. #include <errno.h>
  32. #include <string.h>
  33. #include <sys/param.h>
  34.  
  35. char *
  36. dirname(path)
  37.     const char *path;
  38. {
  39.     static char bname[MAXPATHLEN];
  40.     register const char *endp;
  41.  
  42.     /* Empty or NULL string gets treated as "." */
  43.     if (path == NULL || *path == '\0') {
  44.         (void)strcpy(bname, ".");
  45.         return(bname);
  46.     }
  47.  
  48.     /* Strip trailing slashes */
  49.     endp = path + strlen(path) - 1;
  50.     while (endp > path && *endp == '/')
  51.         endp--;
  52.  
  53.     /* Find the start of the dir */
  54.     while (endp > path && *endp != '/')
  55.         endp--;
  56.  
  57.     /* Either the dir is "/" or there are no slashes */
  58.     if (endp == path) {
  59.         (void)strcpy(bname, *endp == '/' ? "/" : ".");
  60.         return(bname);
  61.     } else {
  62.         do {
  63.             endp--;
  64.         } while (endp > path && *endp == '/');
  65.     }
  66.  
  67.     if (endp - path + 1 > sizeof(bname)) {
  68.         errno = ENAMETOOLONG;
  69.         return(NULL);
  70.     }
  71.     (void)strncpy(bname, path, endp - path + 1);
  72.     bname[endp - path + 1] = '\0';
  73.     return(bname);
  74. }
  75.