File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / include / sudo_util.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jun 15 16:12:54 2014 UTC (10 years ago) by misho
Branches: sudo, MAIN
CVS tags: v1_8_10p3_0, v1_8_10p3, HEAD
sudo v 1.8.10p3

    1: /*
    2:  * Copyright (c) 2013-2014 Todd C. Miller <Todd.Miller@courtesan.com>
    3:  *
    4:  * Permission to use, copy, modify, and distribute this software for any
    5:  * purpose with or without fee is hereby granted, provided that the above
    6:  * copyright notice and this permission notice appear in all copies.
    7:  *
    8:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    9:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   10:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   11:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   12:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   13:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   14:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   15:  */
   16: 
   17: #ifndef _SUDO_UTIL_H
   18: #define _SUDO_UTIL_H
   19: 
   20: #ifdef HAVE_STDBOOL_H
   21: # include <stdbool.h>
   22: #else
   23: # include "compat/stdbool.h"
   24: #endif /* HAVE_STDBOOL_H */
   25: 
   26: /*
   27:  * Macros for operating on struct timeval.
   28:  */
   29: #define sudo_timevalclear(tv)	((tv)->tv_sec = (tv)->tv_usec = 0)
   30: 
   31: #define sudo_timevalisset(tv)	((tv)->tv_sec || (tv)->tv_usec)
   32: 
   33: #define sudo_timevalcmp(tv1, tv2, op)					       \
   34:     (((tv1)->tv_sec == (tv2)->tv_sec) ?					       \
   35: 	((tv1)->tv_usec op (tv2)->tv_usec) :				       \
   36: 	((tv1)->tv_sec op (tv2)->tv_sec))
   37: 
   38: #define sudo_timevaladd(tv1, tv2, tv3)					       \
   39:     do {								       \
   40: 	(tv3)->tv_sec = (tv1)->tv_sec + (tv2)->tv_sec;			       \
   41: 	(tv3)->tv_usec = (tv1)->tv_usec + (tv2)->tv_usec;		       \
   42: 	if ((tv3)->tv_usec >= 1000000) {				       \
   43: 	    (tv3)->tv_sec++;						       \
   44: 	    (tv3)->tv_usec -= 1000000;					       \
   45: 	}								       \
   46:     } while (0)
   47: 
   48: #define sudo_timevalsub(tv1, tv2, tv3)					       \
   49:     do {								       \
   50: 	(tv3)->tv_sec = (tv1)->tv_sec - (tv2)->tv_sec;			       \
   51: 	(tv3)->tv_usec = (tv1)->tv_usec - (tv2)->tv_usec;		       \
   52: 	if ((tv3)->tv_usec < 0) {					       \
   53: 	    (tv3)->tv_sec--;						       \
   54: 	    (tv3)->tv_usec += 1000000;					       \
   55: 	}								       \
   56:     } while (0)
   57: 
   58: #ifndef TIMEVAL_TO_TIMESPEC
   59: # define TIMEVAL_TO_TIMESPEC(tv, ts)					       \
   60:     do {								       \
   61: 	(ts)->tv_sec = (tv)->tv_sec;					       \
   62: 	(ts)->tv_nsec = (tv)->tv_usec * 1000;				       \
   63:     } while (0)
   64: #endif
   65: 
   66: /*
   67:  * Macros for operating on struct timespec.
   68:  */
   69: #define sudo_timespecclear(ts)	((ts)->tv_sec = (ts)->tv_nsec = 0)
   70: 
   71: #define sudo_timespecisset(ts)	((ts)->tv_sec || (ts)->tv_nsec)
   72: 
   73: #define sudo_timespeccmp(ts1, ts2, op)					       \
   74:     (((ts1)->tv_sec == (ts2)->tv_sec) ?					       \
   75: 	((ts1)->tv_nsec op (ts2)->tv_nsec) :				       \
   76: 	((ts1)->tv_sec op (ts2)->tv_sec))
   77: 
   78: #define sudo_timespecadd(ts1, ts2, ts3)					       \
   79:     do {								       \
   80: 	(ts3)->tv_sec = (ts1)->tv_sec + (ts2)->tv_sec;			       \
   81: 	(ts3)->tv_nsec = (ts1)->tv_nsec + (ts2)->tv_nsec;		       \
   82: 	while ((ts3)->tv_nsec >= 1000000000) {				       \
   83: 	    (ts3)->tv_sec++;						       \
   84: 	    (ts3)->tv_nsec -= 1000000000;				       \
   85: 	}								       \
   86:     } while (0)
   87: 
   88: #define sudo_timespecsub(ts1, ts2, ts3)					       \
   89:     do {								       \
   90: 	(ts3)->tv_sec = (ts1)->tv_sec - (ts2)->tv_sec;			       \
   91: 	(ts3)->tv_nsec = (ts1)->tv_nsec - (ts2)->tv_nsec;		       \
   92: 	while ((ts3)->tv_nsec < 0) {					       \
   93: 	    (ts3)->tv_sec--;						       \
   94: 	    (ts3)->tv_nsec += 1000000000;				       \
   95: 	}								       \
   96:     } while (0)
   97: 
   98: #ifndef TIMESPEC_TO_TIMEVAL
   99: # define TIMESPEC_TO_TIMEVAL(tv, ts)					       \
  100:     do {								       \
  101: 	(tv)->tv_sec = (ts)->tv_sec;					       \
  102: 	(tv)->tv_usec = (ts)->tv_nsec / 1000;				       \
  103:     } while (0)
  104: #endif
  105: 
  106: /*
  107:  * Macros to extract ctime and mtime as timevals.
  108:  */
  109: #ifdef HAVE_ST_MTIM
  110: # ifdef HAVE_ST__TIM
  111: #  define ctim_get(_x, _y)	TIMESPEC_TO_TIMEVAL((_y), &(_x)->st_ctim.st__tim)
  112: #  define mtim_get(_x, _y)	TIMESPEC_TO_TIMEVAL((_y), &(_x)->st_mtim.st__tim)
  113: # else
  114: #  define ctim_get(_x, _y)	TIMESPEC_TO_TIMEVAL((_y), &(_x)->st_ctim)
  115: #  define mtim_get(_x, _y)	TIMESPEC_TO_TIMEVAL((_y), &(_x)->st_mtim)
  116: # endif
  117: #else
  118: # ifdef HAVE_ST_MTIMESPEC
  119: #  define ctim_get(_x, _y)	TIMESPEC_TO_TIMEVAL((_y), &(_x)->st_ctimespec)
  120: #  define mtim_get(_x, _y)	TIMESPEC_TO_TIMEVAL((_y), &(_x)->st_mtimespec)
  121: # else
  122: #  define ctim_get(_x, _y)	do { (_y)->tv_sec = (_x)->st_ctime; (_y)->tv_usec = 0; } while (0)
  123: #  define mtim_get(_x, _y)	do { (_y)->tv_sec = (_x)->st_mtime; (_y)->tv_usec = 0; } while (0)
  124: # endif /* HAVE_ST_MTIMESPEC */
  125: #endif /* HAVE_ST_MTIM */
  126: 
  127: /*
  128:  * Macros to quiet gcc's warn_unused_result attribute.
  129:  */
  130: #ifdef __GNUC__
  131: # define ignore_result(x) do {						       \
  132:     __typeof__(x) y = (x);						       \
  133:     (void)y;								       \
  134: } while(0)
  135: #else
  136: # define ignore_result(x)	(void)(x)
  137: #endif
  138: 
  139: /* aix.c */
  140: void aix_prep_user(char *user, const char *tty);
  141: void aix_restoreauthdb(void);
  142: void aix_setauthdb(char *user);
  143: 
  144: /* atobool.c */
  145: int atobool(const char *str);
  146: 
  147: /* atoid.c */
  148: id_t atoid(const char *str, const char *sep, char **endp, const char **errstr);
  149: 
  150: /* atomode.c */
  151: int atomode(const char *cp, const char **errstr);
  152: 
  153: /* fmt_string.h */
  154: char *fmt_string(const char *var, const char *value);
  155: 
  156: /* gidlist.c */
  157: int parse_gid_list(const char *gidstr, const gid_t *basegid, GETGROUPS_T **gidsp);
  158: 
  159: /* progname.c */
  160: void initprogname(const char *);
  161: 
  162: /* setgroups.c */
  163: int sudo_setgroups(int ngids, const GETGROUPS_T *gids);
  164: 
  165: /* term.c */
  166: bool term_cbreak(int);
  167: bool term_copy(int, int);
  168: bool term_noecho(int);
  169: bool term_raw(int, int);
  170: bool term_restore(int, bool);
  171: 
  172: /* ttysize.c */
  173: void get_ttysize(int *rowp, int *colp);
  174: 
  175: #endif /* _SUDO_UTIL_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>