subr.c revision 9c9af2590af49bb395bc8d2eace0f2d4ea16d165
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Copyright (c) 2000, Boris Popov
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * All rights reserved.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Redistribution and use in source and binary forms, with or without
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * modification, are permitted provided that the following conditions
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * are met:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 1. Redistributions of source code must retain the above copyright
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * notice, this list of conditions and the following disclaimer.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 2. Redistributions in binary form must reproduce the above copyright
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * notice, this list of conditions and the following disclaimer in the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * documentation and/or other materials provided with the distribution.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 3. All advertising materials mentioning features or use of this software
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * must display the following acknowledgement:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * This product includes software developed by Boris Popov.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 4. Neither the name of the author nor the names of any co-contributors
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * may be used to endorse or promote products derived from this software
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * without specific prior written permission.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * SUCH DAMAGE.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * $Id: subr.c,v 1.19 2005/02/09 00:23:45 lindak Exp $
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/types.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/errno.h>
9c9af2590af49bb395bc8d2eace0f2d4ea16d165Gordon Ross#include <sys/time.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <unistd.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <ctype.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <string.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <stdio.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <stdlib.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <stdarg.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <errno.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sysexits.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <libintl.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <netsmb/netbios.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <netsmb/smb_lib.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <netsmb/nb_lib.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <cflib.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <err.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowuid_t real_uid, eff_uid;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic int smblib_initialized;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstruct rcfile *smb_rc;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_lib_init(void)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int error;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (smblib_initialized)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if ((error = nls_setlocale("")) != 0) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fprintf(stdout, dgettext(TEXT_DOMAIN,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "%s: can't initialise locale\n"), __progname);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (error);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smblib_initialized++;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Private version of strerror(3C) that
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * knows our special error codes.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowchar *
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_strerror(int err)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *msg;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow switch (err) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow case EBADRPC:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow msg = dgettext(TEXT_DOMAIN,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "remote call failed");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow break;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow case EAUTH:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow msg = dgettext(TEXT_DOMAIN,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "authentication failed");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow break;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow default:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow msg = strerror(err);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow break;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (msg);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Print a (descriptive) error message
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * error values:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 0 - no specific error code available;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 1..32767 - system error
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowvoid
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_error(const char *fmt, int error, ...) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow va_list ap;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow const char *cp;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int errtype;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fprintf(stderr, "%s: ", __progname);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow va_start(ap, error);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow vfprintf(stderr, fmt, ap);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow va_end(ap);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (error == -1) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow error = errno;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow errtype = SMB_SYS_ERROR;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow } else {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow errtype = error & SMB_ERRTYPE_MASK;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow error &= ~SMB_ERRTYPE_MASK;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow switch (errtype) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow case SMB_SYS_ERROR:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (error)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fprintf(stderr, ": syserr = %s\n", smb_strerror(error));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow else
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fprintf(stderr, "\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow break;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow case SMB_RAP_ERROR:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fprintf(stderr, ": raperr = %d (0x%04x)\n", error, error);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow break;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow case SMB_NB_ERROR:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow cp = nb_strerror(error);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (cp == NULL)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fprintf(stderr, ": nberr = unknown (0x%04x)\n", error);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow else
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fprintf(stderr, ": nberr = %s\n", cp);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow break;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow default:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fprintf(stderr, "\n");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowchar *
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_printb(char *dest, int flags, const struct smb_bitname *bnp) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int first = 1;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow strcpy(dest, "<");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow for (; bnp->bn_bit; bnp++) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (flags & bnp->bn_bit) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow strcat(dest, bnp->bn_name);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow first = 0;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (!first && (flags & bnp[1].bn_bit))
4bff34e37def8a90f9194d81bc345c52ba20086athurlow strcat(dest, "|");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow strcat(dest, ">");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (dest);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowextern int home_nsmbrc;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#ifdef DEBUG
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include "queue.h"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include "rcfile_priv.h"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstruct rcsection *rc_findsect(struct rcfile *rcp, const char *sectname);
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstruct rckey *rc_sect_findkey(struct rcsection *rsp, const char *keyname);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowvoid
4bff34e37def8a90f9194d81bc345c52ba20086athurlowdump_props(char *where)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow struct rcsection *rsp = NULL;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow struct rckey *rkp = NULL;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow printf("Settings %s\n", where);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow SLIST_FOREACH(rsp, &smb_rc->rf_sect, rs_next) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow printf("section=%s\n", rsp->rs_name);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fflush(stdout);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow SLIST_FOREACH(rkp, &rsp->rs_keys, rk_next) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow printf(" key=%s, value=%s\n",
4bff34e37def8a90f9194d81bc345c52ba20086athurlow rkp->rk_name, rkp->rk_value);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fflush(stdout);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * first read ~/.smbrc, next try to merge SMB_CFG_FILE - if that fails
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * because SMB_CFG_FILE doesn't exist, try to merge OLD_SMB_CFG_FILE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_open_rcfile(struct smb_ctx *ctx)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *home, *fn;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int error, len;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smb_rc = NULL;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#ifdef DEPRECATED
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fn = SMB_CFG_FILE;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow error = rc_merge(fn, &smb_rc);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (error == ENOENT) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * OK, try to read a config file in the old location.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fn = OLD_SMB_CFG_FILE;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow error = rc_merge(fn, &smb_rc);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fn = "/usr/sbin/sharectl get smbfs";
4bff34e37def8a90f9194d81bc345c52ba20086athurlow error = rc_merge_pipe(fn, &smb_rc);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (error != 0 && error != ENOENT)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fprintf(stderr, dgettext(TEXT_DOMAIN,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "Can't open %s: %s\n"), fn, smb_strerror(errno));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#ifdef DEBUG
9c9af2590af49bb395bc8d2eace0f2d4ea16d165Gordon Ross if (smb_debug)
9c9af2590af49bb395bc8d2eace0f2d4ea16d165Gordon Ross dump_props("after reading global repository");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow home = getenv("HOME");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (home == NULL && ctx && ctx->ct_home)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow home = ctx->ct_home;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (home) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow len = strlen(home) + 20;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fn = malloc(len);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow snprintf(fn, len, "%s/.nsmbrc", home);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow home_nsmbrc = 1;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow error = rc_merge(fn, &smb_rc);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (error != 0 && error != ENOENT) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow fprintf(stderr, dgettext(TEXT_DOMAIN,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "Can't open %s: %s\n"), fn, smb_strerror(errno));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow free(fn);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow home_nsmbrc = 0;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#ifdef DEBUG
9c9af2590af49bb395bc8d2eace0f2d4ea16d165Gordon Ross if (smb_debug)
9c9af2590af49bb395bc8d2eace0f2d4ea16d165Gordon Ross dump_props("after reading user settings");
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (smb_rc == NULL) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (ENOENT);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowvoid
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_simplecrypt(char *dst, const char *src)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int ch, pos;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *dst++ = '$';
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *dst++ = '$';
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *dst++ = '1';
4bff34e37def8a90f9194d81bc345c52ba20086athurlow pos = 27;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow while (*src) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ch = *src++;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (isascii(ch))
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ch = (isupper(ch) ? ('A' + (ch - 'A' + 13) % 26) :
4bff34e37def8a90f9194d81bc345c52ba20086athurlow islower(ch) ? ('a' + (ch - 'a' + 13) % 26) : ch);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ch ^= pos;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow pos += 13;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow sprintf(dst, "%02x", ch);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow dst += 2;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *dst = 0;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowint
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_simpledecrypt(char *dst, const char *src)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *ep, hexval[3];
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int len, ch, pos;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (strncmp(src, "$$1", 3) != 0)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (EINVAL);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow src += 3;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow len = strlen(src);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (len & 1)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (EINVAL);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow len /= 2;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow hexval[2] = 0;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow pos = 27;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow while (len--) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow hexval[0] = *src++;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow hexval[1] = *src++;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ch = strtoul(hexval, &ep, 16);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (*ep != 0)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (EINVAL);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ch ^= pos;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow pos += 13;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (isascii(ch))
4bff34e37def8a90f9194d81bc345c52ba20086athurlow ch = (isupper(ch) ? ('A' + (ch - 'A' + 13) % 26) :
4bff34e37def8a90f9194d81bc345c52ba20086athurlow islower(ch) ? ('a' + (ch - 'a' + 13) % 26) : ch);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *dst++ = ch;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *dst = 0;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#undef __progname
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowchar *__progname = NULL;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowchar *
4bff34e37def8a90f9194d81bc345c52ba20086athurlowsmb_getprogname()
4bff34e37def8a90f9194d81bc345c52ba20086athurlow{
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *p;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (__progname == NULL) {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow __progname = (char *)getexecname();
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if ((p = strrchr(__progname, '/')) != 0)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow __progname = p + 1;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow }
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (__progname);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}