diff options
Diffstat (limited to 'usr.bin/ncftp/util.c')
-rw-r--r-- | usr.bin/ncftp/util.c | 922 |
1 files changed, 0 insertions, 922 deletions
diff --git a/usr.bin/ncftp/util.c b/usr.bin/ncftp/util.c deleted file mode 100644 index ee2fba3..0000000 --- a/usr.bin/ncftp/util.c +++ /dev/null @@ -1,922 +0,0 @@ -/* Util.c */ - -/* $RCSfile: util.c,v $ - * $Revision: 14020.13 $ - * $Date: 93/05/23 09:38:13 $ - */ - -#include "sys.h" - -#include <errno.h> -#include <ctype.h> -#include <pwd.h> - -#ifndef NO_VARARGS -# ifdef NO_STDARGH -# include <varargs.h> -# else -# include <stdarg.h> -# endif -#endif - -#ifdef READLINE -# include <readline/readline.h> -#endif /* READLINE */ - -#ifdef GETLINE -# include <getline.h> -#endif - -#include "util.h" -#include "cmds.h" -#include "main.h" -#include "ftp.h" -#include "ftprc.h" -#include "defaults.h" -#include "copyright.h" - -/* Util.c globals */ -int Opterr = 1; /* if error message should be printed */ -int Optind = 1; /* index into parent argv vector */ -int Optopt; /* character checked for validity */ -char *Optarg; /* argument associated with option */ -char *Optplace = EMSG; /* saved position in an arg */ - -/* Util.c externs */ -extern int toatty, fromatty; -extern int verbose, doingInitMacro; -extern string prompt2; -extern char *line, *margv[]; -extern int margc; -extern int debug, mprompt, activemcmd; -extern string progname; -extern struct cmd cmdtab[]; -extern struct userinfo uinfo; - -#ifndef NO_VARARGS -/*VARARGS*/ -#ifdef NO_STDARGH -void dbprintf(va_alist) - va_dcl -#else -void dbprintf(char *fmt0, ...) -#endif -{ - va_list ap; - char *fmt; - -#ifdef NO_STDARGH - va_start(ap); - fmt = va_arg(ap, char *); -#else - va_start(ap, fmt0); - fmt = fmt0; -#endif - - if (debug) { - (void) fprintf(DB_STREAM, "#DB# "); - (void) vfprintf(DB_STREAM, fmt, ap); - (void) fflush(DB_STREAM); - } - va_end(ap); -} /* dbprintf */ - -#endif /* have varargs */ - - - - -/* - * Concatenate src on the end of dst. The resulting string will have at most - * n-1 characters, not counting the NUL terminator which is always appended - * unlike strncat. The other big difference is that strncpy uses n as the - * max number of characters _appended_, while this routine uses n to limit - * the overall length of dst. - */ -char *_Strncat(char *dst, char *src, register size_t n) -{ - register size_t i; - register char *d, *s; - - if (n != 0 && ((i = strlen(dst)) < (n - 1))) { - d = dst + i; - s = src; - /* If they specified a maximum of n characters, use n - 1 chars to - * hold the copy, and the last character in the array as a NUL. - * This is the difference between the regular strncpy routine. - * strncpy doesn't guarantee that your new string will have a - * NUL terminator, but this routine does. - */ - for (++i; i<n; i++) { - if ((*d++ = *s++) == 0) { - /* Pad with zeros. */ - for (; i<n; i++) - *d++ = 0; - return dst; - } - } - /* If we get here, then we have a full string, with n - 1 characters, - * so now we NUL terminate it and go home. - */ - *d = 0; - } - return (dst); -} /* _Strncat */ - - -/* - * Copy src to dst, truncating or null-padding to always copy n-1 bytes. - * Return dst. - */ -char *_Strncpy(char *dst, char *src, register size_t n) -{ - register char *d; - register char *s; - register size_t i; - - d = dst; - *d = 0; - if (n != 0) { - s = src; - /* If they specified a maximum of n characters, use n - 1 chars to - * hold the copy, and the last character in the array as a NUL. - * This is the difference between the regular strncpy routine. - * strncpy doesn't guarantee that your new string will have a - * NUL terminator, but this routine does. - */ - for (i=1; i<n; i++) { - if ((*d++ = *s++) == 0) { - /* Pad with zeros. */ - for (; i<n; i++) - *d++ = 0; - return dst; - } - } - /* If we get here, then we have a full string, with n - 1 characters, - * so now we NUL terminate it and go home. - */ - *d = 0; - } - return (dst); -} /* _Strncpy */ - - - -/* Converts any uppercase characters in the string to lowercase. - * Never would have guessed that, huh? - */ -void StrLCase(char *dst) -{ - register char *cp; - - for (cp=dst; *cp != '\0'; cp++) - if (isupper((int) *cp)) - *cp = (char) tolower(*cp); -} - - - - -char *Strpcpy(char *dst, char *src) -{ - while ((*dst++ = *src++) != '\0') - ; - return (--dst); /* return current value of dst, NOT original value! */ -} /* Strpcpy */ - - - -/* - * malloc's a copy of oldstr. - */ -char *NewString(char *oldstr) -{ - size_t howLong; - char *newstr; - - howLong = strlen(oldstr); - if ((newstr = malloc(howLong + 1)) != NULL) - (void) strcpy(newstr, oldstr); - return newstr; -} /* NewString */ - - - - - -void Getopt_Reset(void) -{ - Optind = 1; - Optplace = ""; -} /* Getopt_Reset */ - -static char *NextOption(char *ostr) -{ - if ((Optopt = (int) *Optplace++) == (int) ':') - return 0; - return index(ostr, Optopt); -} - -int Getopt(int nargc, char **nargv, char *ostr) -{ - register char *oli; /* Option letter list index */ - - if (!*Optplace) { /* update scanning pointer */ - if (Optind >= nargc || *(Optplace = nargv[Optind]) != '-') - return (EOF); - if (Optplace[1] && *++Optplace == '-') { /* found "--" */ - ++Optind; - return (EOF); - } - } /* Option letter okay? */ - oli = NextOption(ostr); - if (oli == NULL) { - if (!*Optplace) - ++Optind; - if (Opterr) { - (void) fprintf(stderr, "%s%s%c\n", *nargv, ": illegal option -- ", Optopt); - return(BADCH); - } - } - if (*++oli != ':') { /* don't need argument */ - Optarg = NULL; - if (!*Optplace) - ++Optind; - } else { /* need an argument */ - if (*Optplace) /* no white space */ - Optarg = Optplace; - else if (nargc <= ++Optind) { /* no arg */ - Optplace = EMSG; - if (Opterr) { - (void) fprintf(stderr, "%s%s%c\n", *nargv, ": option requires an argument -- ", Optopt); - return(BADCH); - } - } else /* white space */ - Optarg = nargv[Optind]; - Optplace = EMSG; - ++Optind; - } - return (Optopt); /* dump back Option letter */ -} /* Getopt */ - - - - - -/* - * Converts an ls date, in either the "Feb 4 1992" or "Jan 16 13:42" - * format to a time_t. - */ -unsigned long UnLSDate(char *dstr) -{ -#ifdef NO_MKTIME - return (MDTM_UNKNOWN); -#else - char *cp = dstr; - int mon, day, year, hr, min; - time_t now, mt; - unsigned long result = MDTM_UNKNOWN; - struct tm ut, *t; - - switch (*cp++) { - case 'A': - mon = (*cp == 'u') ? 7 : 3; - break; - case 'D': - mon = 11; - break; - case 'F': - mon = 1; - break; - default: /* shut up un-init warning */ - case 'J': - if (*cp++ == 'u') - mon = (*cp == 'l') ? 6 : 5; - else - mon = 0; - break; - case 'M': - mon = (*++cp == 'r') ? 2 : 4; - break; - case 'N': - mon = 10; - break; - case 'O': - mon = 9; - break; - case 'S': - mon = 8; - } - cp = dstr + 4; - day = 0; - if (*cp != ' ') - day = 10 * (*cp - '0'); - cp++; - day += *cp++ - '0'; - min = 0; - - (void) time(&now); - t = localtime(&now); - - if (*++cp != ' ') { - /* It's a time, XX:YY, not a year. */ - cp[2] = ' '; - (void) sscanf(cp, "%d %d", &hr, &min); - cp[2] = ':'; - year = t->tm_year; - if (mon > t->tm_mon) - --year; - } else { - hr = min = 0; - (void) sscanf(cp, "%d", &year); - year -= 1900; - } - /* Copy the whole structure of the 'tm' pointed to by t, so it will - * also set all fields we don't specify explicitly to be the same as - * they were in t. That way we copy non-standard fields such as - * tm_gmtoff, if it exists or not. - */ - ut = *t; - ut.tm_sec = 1; - ut.tm_min = min; - ut.tm_hour = hr; - ut.tm_mday = day; - ut.tm_mon = mon; - ut.tm_year = year; - ut.tm_wday = ut.tm_yday = 0; - mt = mktime(&ut); - if (mt != (time_t) -1) - result = (unsigned long) mt; - return (result); -#endif /* NO_MKTIME */ -} /* UnLSDate */ - - - -/* - * Converts a MDTM date, like "213 19930602204445\n" - * format to a time_t. - */ -unsigned long UnMDTMDate(char *dstr) -{ -#ifdef NO_MKTIME - return (MDTM_UNKNOWN); -#else - struct tm ut; - time_t mt; - unsigned long result = MDTM_UNKNOWN; - - /* Clear out the whole structure, along with any non-standard fields. */ - bzero((char *)&ut, sizeof (struct tm)); - - if (sscanf(dstr, "%*s %04d%02d%02d%02d%02d%02d", - &ut.tm_year, - &ut.tm_mon, - &ut.tm_mday, - &ut.tm_hour, - &ut.tm_min, - &ut.tm_sec) == 6) - { - --ut.tm_mon; - ut.tm_year -= 1900; - mt = mktime(&ut); - if (mt != (time_t) -1) - result = (unsigned long) mt; - } - return result; -#endif /* NO_MKTIME */ -} /* UnMDTMDate */ - - - -void Perror( -#ifdef DB_ERRS - char *fromProc - , -#ifdef __LINE__ - int lineNum, -#endif -#endif - char *msg - ) -{ - extern int errno; - - if (NOT_VQUIET) { -#ifdef sun - /* - * There is a problem in the SunOS headers when compiling with an ANSI - * compiler. The problem is that there are macros in the form of - * #define MAC(x) 'x', and this will always be the character x instead - * of whatever parameter was passed to MAC. If we get these errors, it - * usually means that you are trying to compile with gcc when you haven't - * run the 'fixincludes' script that fixes these macros. We will ignore - * the error, but it means that the echo() function won't work correctly, - * and you will see your password echo. - */ - if (errno == ENOTTY) - return; -#endif - (void) fprintf(stderr, "NcFTP"); -#ifdef DB_ERRS - if (fromProc != NULL) - (void) fprintf(stderr, "/%s", fromProc); -#ifdef __LINE__ - (void) fprintf(stderr, "/%d", lineNum); -#endif -#endif - (void) fprintf(stderr, ": "); - if (msg != NULL) - (void) fprintf(stderr, "%s (%d): ", msg, errno); - perror(NULL); - } -} /* Perror */ - - - - -size_t RemoveTrailingNewline(char *cp, int *stripped) -{ - size_t len; - int nBytesStripped = 0; - - if (cp != NULL) { - cp += (len = strlen(cp)) - 1; - if (*cp == '\n') { - *cp-- = 0; /* get rid of the newline. */ - nBytesStripped++; - } - if (*cp == '\r') { /* no returns either, please. */ - *cp = 0; - nBytesStripped++; - } - if (stripped != NULL) - *stripped = nBytesStripped; - return len; - } - return (size_t)0; -} /* RemoveTrailingNewline */ - - - -#ifdef GETLINE -extern size_t epromptlen; - -/* - * The Getline library doesn't detect the ANSI escape sequences, so the - * library would think that a string is longer than actually appears on - * screen. This function lets Getline work properly. This function is - * intended to fix that problem for the main command prompt only. If any - * other prompts want to use ANSI escapes, a (costly) function would have - * to scan the prompt for all escape sequences. - */ -/*ARGSUSED*/ -static size_t MainPromptLen(char *pr) -{ - return (int)epromptlen; -} -#endif - -static char *StdioGets(char *promptstr, char *sline, size_t size) -{ - char *cp; - - if (fromatty) { - /* It's okay to print a prompt if we are redirecting stdout, - * as long as stdin is still a tty. Otherwise, don't print - * a prompt at all if stdin is redirected. - */ -#ifdef CURSES - tcap_put(promptstr); -#else - (void) fputs(promptstr, stdout); -#endif - } - sline[0] = 0; - (void) fflush(stdout); /* for svr4 */ - cp = fgets(sline, (int)(size - 2), stdin); - (void) RemoveTrailingNewline(sline, NULL); - return cp; -} /* StdioGets */ - - -/* Given a prompt string, a destination string, and it's size, return feedback - * from the user in the destination string, with any trailing newlines - * stripped. Returns NULL if EOF encountered. - */ -char *Gets(char *promptstr, char *sline, size_t size) -{ - char *cp, ch; - string plines; -#ifdef GETLINE - int ismainprompt = (promptstr == prompt2); -#endif - - if (!fromatty || !toatty) { - /* Don't worry about a cmdline/history editor if you redirected a - * file at me. - */ - return (StdioGets(promptstr, sline, size)); - } - - sline[0] = 0; /* Clear it, in case of an error later. */ - - /* - * The prompt string may actually be several lines if the user put a - * newline in it with the @N option. In this case we only want to print - * the very last line, so the command-line editors won't screw up. So - * now we print all the lines except the last line. - */ - cp = rindex(promptstr, '\n'); - if (cp != NULL) { - ch = *++cp; - *cp = 0; - (void) Strncpy(plines, promptstr); - *cp = ch; - promptstr = cp; -#ifdef CURSES - tcap_put(plines); -#else - (void) fputs(plines, stdout); -#endif - } - -#ifdef READLINE - if ((cp = readline(promptstr)) != NULL) { - (void) _Strncpy(sline, cp, size); - free(cp); - (void) RemoveTrailingNewline(cp = sline, NULL); - if (*cp != 0) /* Don't add blank lines to history buffer. */ - add_history(cp); - } -#else /* READLINE */ - -#ifdef GETLINE - if (toatty) { - if (ismainprompt) - gl_strwidth(MainPromptLen); - if ((cp = getline(promptstr)) != NULL) { - if (*cp == '\0') /* You hit ^D. */ - return NULL; - cp = _Strncpy(sline, cp, size); - (void) RemoveTrailingNewline(cp, NULL); - if (*cp != '\0') { /* Don't add blank lines to history buffer. */ - gl_histadd(cp); - } - } - /* Hope your strlen is declared as returning a size_t. */ - gl_strwidth(strlen); - } else { - cp = StdioGets(promptstr, sline, size); - } -#else /* !GETLINE */ - cp = StdioGets(promptstr, sline, size); -#endif /* !GETLINE */ -#endif /* !READLINE */ - return cp; -} /* Gets */ - - - - -char **re_makeargv(char *promptstr, int *argc) -{ - size_t sz; - - (void) strcat(line, " "); - sz = strlen(line); - (void) Gets(promptstr, &line[sz], (size_t) (CMDLINELEN - sz)) ; - (void) makeargv(); - *argc = margc; - return (margv); -} /* re_makeargv */ - - - -#ifndef HAS_GETCWD -extern char *getwd(char *); -#endif - -char *get_cwd(char *buf, int size) -{ -#ifdef HAS_GETCWD -# ifdef NO_UNISTDH -# ifdef GETCWDSIZET - extern char *getcwd(char *, size_t); -# else - extern char *getcwd(char *, int); -# endif -# endif - return (getcwd(buf, size - 1)); -#else -#ifndef MAXPATHLEN -# define MAXPATHLEN (1024) -#endif - static char *cwdbuf = NULL; - - if (cwdbuf == NULL) { - cwdbuf = (char *)malloc((size_t) MAXPATHLEN); - if (cwdbuf == NULL) - fatal("out of memory for getwd buffer."); - } - getwd(cwdbuf); - return (_Strncpy(buf, cwdbuf, (size_t)size)); -#endif -} /* get_cwd */ - - - -int tmp_name(char *str) -{ - (void) strcpy(str, "/tmp/ncftpXXXXXX"); - return (!mktemp(str)); -} /* tmp_name */ - - - - -char *onoff(int boolf) -{ - return (boolf ? "on" : "off"); -} /* onoff */ - - - - -int StrToBool(char *s) -{ - int c; - int result; - - c = tolower(*s); - result = 0; - switch (c) { - case 'f': /* false */ - case 'n': /* no */ - break; - case 'o': /* test for "off" and "on" */ - c = tolower(s[1]); - if (c == 'f') - break; - /* fall through */ - case 't': /* true */ - case 'y': /* yes */ - result = 1; - break; - default: /* 1, 0, -1, other number? */ - if (atoi(s) != 0) - result = 1; - } - return result; -} /* StrToBool */ - - - - -int confirm(char *cmd, char *file) -{ - string str, pr; - - if (!fromatty || (activemcmd && !mprompt) || (doingInitMacro)) - return 1; - (void) sprintf(pr, "%s %s? ", cmd, file); - (void) Gets(pr, str, sizeof(str)); - return (*str != 'n' && *str != 'N'); -} /* confirm */ - - - -void fatal(char *msg) -{ - (void) fprintf(stderr, "%s: %s\n", progname, msg); - close_up_shop(); - exit(1); -} /* fatal */ - - - - -int UserLoggedIn(void) -{ - static int inited = 0; - static int parent_pid, stderr_was_tty; - - if (!inited) { - stderr_was_tty = isatty(2); - parent_pid = getppid(); - inited++; - } - if ((stderr_was_tty && !isatty(2)) || (getppid() != parent_pid)) - return 0; - return 1; -} /* UserLoggedIn */ - - - - -struct cmd *getcmd(char *name) -{ - struct cmd *c, *found; - int nmatches; - size_t len; - char *p; - - found = (struct cmd *)0; - if (name != NULL) { - len = strlen(name); - nmatches = 0; - for (c = cmdtab; (p = c->c_name) != NULL; c++) { - if (strcmp(name, p) == 0) { - /* Exact match. */ - found = c; - goto xx; - } - if (c->c_handler == unimpl) - continue; - if (strncmp(name, p, len) == 0) { - if (++nmatches > 1) { - found = ((struct cmd *) -1); - goto xx; - } - found = c; - } else if (found != NULL) - break; - } - } -xx: - return (found); -} /* getcmd */ - - - - -void cmd_help(struct cmd *c) -{ - (void) printf("%s: %s.\n", - c->c_name, - c->c_help - ); -} /* cmd_help */ - - - - -void cmd_usage(struct cmd *c) -{ - if (c->c_usage != NULL) - (void) printf("Usage: %s%s\n", - c->c_name, - c->c_usage - ); -} /* cmd_usage */ - - - - -/* - * A simple function that translates most pathnames with ~, ~user, or - * environment variables as the first item. It won't do paths with env vars - * or ~s in the middle of the path, but those are extremely rare. - */ -char *LocalPath(char *path) -{ - longstring orig; - struct passwd *pw; - char *firstent; - char *cp, *dp, *rest; - - (void) Strncpy(orig, path); - firstent = orig; - if ((cp = index(orig, '/')) != NULL) { - if (cp == orig) { - /* If we got here, the path is actually a full path name, - * with the first character as a slash, so just leave it - * alone. - */ - return (path); - } - /* Otherwise we can look at the first word of the path, and - * try to expand it, like $HOME/ or ~/, or it is a relative path, - * which is okay since we won't really do anything with it. - */ - *cp = 0; - rest = cp + 1; - /* 'firstent' now contains the first 'word' in the path. */ - } else { - /* Path was just a single word, or it is a full path, like: - * /usr/tmp/zz, so firstent is just the entire given "path." - */ - rest = NULL; - } - if (orig[0] == '~') { - if (orig[1] == 0) { - firstent = uinfo.homedir; - } else { - pw = getpwnam(orig + 1); - if (pw != NULL) - firstent = pw->pw_dir; - } - } else if (orig[0] == '$') { - cp = orig + 1; - dp = orig + strlen(orig) - 1; - if ((*cp == '(' && *dp == ')') || (*cp == '{' && *dp == '}')) { - cp++; - *dp = 0; - } - firstent = getenv(cp); - if (firstent == NULL) { - (void) fprintf(stderr, "%s: no such environment variable.\n", cp); - firstent = "badEnvVar"; - } - } - if (rest == NULL) - (void) strcpy(path, firstent); - else - (void) sprintf(path, "%s/%s", firstent, rest); - return (path); -} /* LocalPath */ - - - -/* - * A special case, where invisible dot-files that would normally appear in - * your home directory will appear instead as visible files in your $DOTDIR - * directory if you have one. - */ - -#define LCMP(b) (strncmp(path, (b), (o = sizeof(b) - 1)) == 0) - -char *LocalDotPath(char *path) -{ - size_t o; - longstring s, s2; - char *cp = getenv("DOTDIR"); - - if (cp == NULL) { - goto aa; - } else { - if (*cp != '/' && *cp != '~') { - /* then maybe they mean relative to $HOME. */ - (void) sprintf(s2, "%s/%s", uinfo.homedir, cp); - cp = s2; - } - if (LCMP("~/.") || - LCMP("$HOME/.") || - LCMP("$home/.") || - LCMP("$(HOME)/.") || - LCMP("${HOME}/.") - ) { - (void) Strncpy(s, path); - (void) sprintf(path, "%s/%s", cp, s + o); - cp = path; - } else { -aa: cp = LocalPath(path); - } - } - return cp; -} /* LocalDotPath */ - -#ifdef NO_STRSTR - -/* - * The Elm Mail System - $Revision: 5.1 $ $State: Exp $ - * - * Copyright (c) 1988-1992 USENET Community Trust - * Copyright (c) 1986,1987 Dave Taylor - */ - -char *strstr(s1, s2) -char *s1, *s2; -{ - int len; - char *ptr; - char *tmpptr; - - ptr = NULL; - len = strlen(s2); - - if ( len <= strlen(s1)) { - tmpptr = s1; - while ((ptr = index(tmpptr, (int)*s2)) != NULL) { - if (strncmp(ptr, s2, len) == 0) { - break; - } - tmpptr = ptr+1; - } - } - return (ptr); -} - -#endif - - -#ifdef NO_RENAME -int rename(oldname, newname) -const char *oldname, *newname; -{ - return (link(oldname, newname) == 0 ? unlink(oldname) : -1); -} -#endif /*NO_RENAME*/ - - -/* eof Util.c */ |