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>
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <err.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#include "private.h"
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic int smblib_initialized;
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
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossint
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rosssmb_getlocalname(char **namepp)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross char buf[SMBIOC_MAX_NAME], *cp;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (gethostname(buf, sizeof (buf)) != 0)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (errno);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross cp = strchr(buf, '.');
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (cp)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross *cp = '\0';
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross cp = strdup(buf);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (cp == NULL)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (ENOMEM);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross *namepp = cp;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (0);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross}
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
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
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
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross/*
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Number of seconds between 1970 and 1601 year
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * (134774 * 24 * 60 * 60)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossstatic const uint64_t DIFF1970TO1601 = 11644473600ULL;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossvoid
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rosssmb_time_local2server(struct timeval *tsp, int tzoff, long *seconds)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross *seconds = tsp->tv_sec - tzoff * 60;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross}
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossvoid
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rosssmb_time_server2local(ulong_t seconds, int tzoff, struct timeval *tsp)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross tsp->tv_sec = seconds + tzoff * 60;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross tsp->tv_usec = 0;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross}
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross/*
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Time from server comes as UTC, so no need to use tz
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross/*ARGSUSED*/
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossvoid
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rosssmb_time_NT2local(uint64_t nsec, int tzoff, struct timeval *tsp)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross smb_time_server2local(nsec / 10000000 - DIFF1970TO1601, 0, tsp);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross}
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross/*ARGSUSED*/
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossvoid
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rosssmb_time_local2NT(struct timeval *tsp, int tzoff, uint64_t *nsec)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross long seconds;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross smb_time_local2server(tsp, 0, &seconds);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross *nsec = (((uint64_t)(seconds) & ~1) + DIFF1970TO1601) *
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross (uint64_t)10000000;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross}
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossvoid
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rosssmb_hexdump(const void *buf, int len)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross const uchar_t *p = buf;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross int ofs = 0;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross while (len--) {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (ofs % 16 == 0)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross fprintf(stderr, "%02X: ", ofs);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross fprintf(stderr, "%02x ", *p++);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross ofs++;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (ofs % 16 == 0)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross fprintf(stderr, "\n");
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross }
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (ofs % 16 != 0)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross fprintf(stderr, "\n");
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross}
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossvoid
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossdprint(const char *fname, const char *fmt, ...)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross{
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross va_list ap;
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross va_start(ap, fmt);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross if (smb_debug) {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross fprintf(stderr, "%s: ", fname);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross vfprintf(stderr, fmt, ap);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross fprintf(stderr, "\n");
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross }
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross va_end(ap);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross}
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross
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}