diff usr/src/cmd/cmd-inet/usr.sbin/in.ftpd/conversions.c @ 0:c9caec207d52 b86

Initial porting based on b86
author Koji Uno <koji.uno@sun.com>
date Tue, 02 Jun 2009 18:56:50 +0900
parents
children 1a15d5aaf794
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/cmd-inet/usr.sbin/in.ftpd/conversions.c	Tue Jun 02 18:56:50 2009 +0900
@@ -0,0 +1,198 @@
+#pragma ident	"@(#)conversions.c	1.1	01/06/26 SMI"
+
+/****************************************************************************  
+ 
+  Copyright (c) 1999,2000 WU-FTPD Development Group.  
+  All rights reserved.
+  
+  Portions Copyright (c) 1980, 1985, 1988, 1989, 1990, 1991, 1993, 1994
+    The Regents of the University of California.
+  Portions Copyright (c) 1993, 1994 Washington University in Saint Louis.
+  Portions Copyright (c) 1996, 1998 Berkeley Software Design, Inc.
+  Portions Copyright (c) 1989 Massachusetts Institute of Technology.
+  Portions Copyright (c) 1998 Sendmail, Inc.
+  Portions Copyright (c) 1983, 1995, 1996, 1997 Eric P.  Allman.
+  Portions Copyright (c) 1997 by Stan Barber.
+  Portions Copyright (c) 1997 by Kent Landfield.
+  Portions Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997
+    Free Software Foundation, Inc.  
+ 
+  Use and distribution of this software and its source code are governed 
+  by the terms and conditions of the WU-FTPD Software License ("LICENSE").
+ 
+  If you did not receive a copy of the license, it may be obtained online
+  at http://www.wu-ftpd.org/license.html.
+ 
+  $Id: conversions.c,v 1.10 2000/07/01 18:17:38 wuftpd Exp $
+ 
+****************************************************************************/
+#include "config.h"
+
+#include <stdio.h>
+#include <errno.h>
+#ifdef HAVE_SYS_SYSLOG_H
+#include <sys/syslog.h>
+#endif
+#if defined(HAVE_SYSLOG_H) || (!defined(AUTOCONF) && !defined(HAVE_SYS_SYSLOG_H))
+#include <syslog.h>
+#endif
+
+extern char *strsep(char **, const char *);
+
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "conversions.h"
+#include "extensions.h"
+#include "pathnames.h"
+#include "proto.h"
+
+/*************************************************************************/
+/* FUNCTION  : readconv                                                  */
+/* PURPOSE   : Read the conversions into memory                          */
+/* ARGUMENTS : The pathname of the conversion file                       */
+/* RETURNS   : 0 if error, 1 if no error                                 */
+/*************************************************************************/
+
+char *convbuf = NULL;
+struct convert *cvtptr;
+
+struct str2int {
+    char *string;
+    int value;
+};
+
+struct str2int c_list[] =
+{
+    {"T_REG", T_REG},
+    {"T_ASCII", T_ASCII},
+    {"T_DIR", T_DIR},
+    {"O_COMPRESS", O_COMPRESS},
+    {"O_UNCOMPRESS", O_UNCOMPRESS},
+    {"O_TAR", O_TAR},
+    {NULL, 0},
+};
+
+static int conv(char *str)
+{
+    int rc = 0;
+    int counter;
+
+    /* check for presence of ALL items in string... */
+
+    if (str)
+	for (counter = 0; c_list[counter].string; ++counter)
+	    if (strstr(str, c_list[counter].string))
+		rc = rc | c_list[counter].value;
+    return (rc);
+}
+
+static int readconv(char *convpath)
+{
+    FILE *convfile;
+    struct stat finfo;
+
+    if ((convfile = fopen(convpath, "r")) == NULL) {
+	if (errno != ENOENT)
+	    syslog(LOG_ERR, "cannot open conversion file %s: %s",
+		   convpath, strerror(errno));
+	return (0);
+    }
+    if (fstat(fileno(convfile), &finfo) != 0) {
+	syslog(LOG_ERR, "cannot fstat conversion file %s: %s", convpath,
+	       strerror(errno));
+	(void) fclose(convfile);
+	return (0);
+    }
+    if (finfo.st_size == 0) {
+	convbuf = (char *) calloc(1, 1);
+    }
+    else {
+	if (!(convbuf = (char *) malloc((size_t) finfo.st_size + 1))) {
+	    syslog(LOG_ERR, "could not malloc convbuf (%d bytes)", (size_t) finfo.st_size + 1);
+	    (void) fclose(convfile);
+	    return (0);
+	}
+	if (!fread(convbuf, (size_t) finfo.st_size, 1, convfile)) {
+	    syslog(LOG_ERR, "error reading conv file %s: %s", convpath,
+		   strerror(errno));
+	    convbuf = NULL;
+	    (void) fclose(convfile);
+	    return (0);
+	}
+	*(convbuf + finfo.st_size) = '\0';
+    }
+    (void) fclose(convfile);
+    return (1);
+}
+
+static void parseconv(void)
+{
+    char *ptr;
+    char *convptr = convbuf, *line;
+    char *argv[8], *p, *val;
+    struct convert *cptr, *cvttail = (struct convert *) NULL;
+    int n;
+
+    if (!convbuf || !(*convbuf))
+	return;
+
+    /* read through convbuf, stripping comments. */
+    while (*convptr != '\0') {
+	line = convptr;
+	while (*convptr && *convptr != '\n')
+	    convptr++;
+	*convptr++ = '\0';
+
+	/* deal with comments */
+	if ((ptr = strchr(line, '#')) != NULL)
+	    *ptr = '\0';
+
+	if (*line == '\0')
+	    continue;
+
+	/* parse the lines... */
+	for (n = 0, p = line; n < 8 && p != NULL; n++) {
+	    val = (char *) strsep(&p, ":\n");
+	    argv[n] = val;
+	    if ((argv[n][0] == ' ') || (argv[n][0] == '\0'))
+		argv[n] = NULL;
+	}
+	/* check their were 8 fields, if not skip the line... */
+	if (n != 8 || p != NULL)
+	    continue;
+
+	/* make sure the required elements are present */
+	if ((!argv[0] && !argv[1] && !argv[2] && !argv[3]) || !argv[4] || !argv[7])
+	    continue;
+
+	/* add element to end of list */
+	cptr = (struct convert *) calloc(1, sizeof(struct convert));
+
+	if (cptr == NULL) {
+	    syslog(LOG_ERR, "calloc error parsing ftpconversions");
+	    exit(0);
+	}
+	if (cvttail)
+	    cvttail->next = cptr;
+	cvttail = cptr;
+	if (!cvtptr)
+	    cvtptr = cptr;
+
+	cptr->stripprefix = (char *) argv[0];
+	cptr->stripfix = (char *) argv[1];
+	cptr->prefix = (char *) argv[2];
+	cptr->postfix = (char *) argv[3];
+	cptr->external_cmd = (char *) argv[4];
+	cptr->types = conv((char *) argv[5]);
+	cptr->options = conv((char *) argv[6]);
+	cptr->name = (char *) argv[7];
+    }
+}
+
+void conv_init(void)
+{
+    if ((readconv(_path_cvt)) <= 0)
+	return;
+    parseconv();
+}