~ubuntu-branches/ubuntu/quantal/sudo/quantal

« back to all changes in this revision

Viewing changes to plugins/sudoers/boottime.c

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers
  • Date: 2011-11-20 12:07:45 UTC
  • mfrom: (1.3.17 sid)
  • Revision ID: package-import@ubuntu.com-20111120120745-o3qpklobmygytndc
Tags: 1.8.3p1-1ubuntu1
* Merge from debian/testing, remaining changes:
  - debian/patches/keep_home_by_default.patch:
    + Set HOME in initial_keepenv_table. (rebased for 1.8.3p1)
  - debian/patches/enable_badpass.patch: turn on "mail_badpass" by default:
    + attempting sudo without knowing a login password is as bad as not
      being listed in the sudoers file, especially if getting the password
      wrong means doing the access-check-email-notification never happens
      (rebased for 1.8.3p1)
  - debian/rules:
    + compile with --without-lecture --with-tty-tickets (Ubuntu specific)
    + install man/man8/sudo_root.8 (Ubuntu specific)
    + install apport hooks
    + The ubuntu-sudo-as-admin-successful.patch was taken upstream by
      Debian however it requires a --enable-admin-flag configure flag to
      actually enable it.
  - debian/sudoers: 
    + grant admin group sudo access
  - debian/sudo-ldap.dirs, debian/sudo.dirs: 
    + add usr/share/apport/package-hooks
  - debian/sudo.preinst:
    + avoid conffile prompt by checking for known default /etc/sudoers
      and if found installing the correct default /etc/sudoers file

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2009-2011 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
#include <config.h>
 
18
 
 
19
#include <sys/param.h>
 
20
#include <sys/types.h>
 
21
#include <sys/time.h>
 
22
 
 
23
#include <stdio.h>
 
24
#ifdef STDC_HEADERS
 
25
# include <stdlib.h>
 
26
# include <stddef.h>
 
27
#else
 
28
# ifdef HAVE_STDLIB_H
 
29
#  include <stdlib.h>
 
30
# endif
 
31
#endif /* STDC_HEADERS */
 
32
#ifdef HAVE_STRING_H
 
33
# if defined(HAVE_MEMORY_H) && !defined(STDC_HEADERS)
 
34
#  include <memory.h>
 
35
# endif
 
36
# include <string.h>
 
37
#endif /* HAVE_STRING_H */
 
38
#ifdef HAVE_STRINGS_H
 
39
# include <strings.h>
 
40
#endif /* HAVE_STRINGS_H */
 
41
#include <limits.h>
 
42
#if TIME_WITH_SYS_TIME
 
43
# include <time.h>
 
44
#endif
 
45
#ifndef __linux__
 
46
# if defined(HAVE_SYSCTL) && defined(KERN_BOOTTIME)
 
47
#  include <sys/sysctl.h>
 
48
# elif defined(HAVE_GETUTXID)
 
49
#  include <utmpx.h>
 
50
# elif defined(HAVE_GETUTID)
 
51
#  include <utmp.h>
 
52
# endif
 
53
#endif /* !__linux__ */
 
54
 
 
55
#include "missing.h"
 
56
 
 
57
/*
 
58
 * Fill in a struct timeval with the time the system booted.
 
59
 * Returns 1 on success and 0 on failure.
 
60
 */
 
61
 
 
62
#if defined(__linux__)
 
63
int
 
64
get_boottime(struct timeval *tv)
 
65
{
 
66
    char *line = NULL;
 
67
    size_t linesize = 0;
 
68
    ssize_t len;
 
69
    FILE * fp;
 
70
 
 
71
    /* read btime from /proc/stat */
 
72
    fp = fopen("/proc/stat", "r");
 
73
    if (fp != NULL) {
 
74
        while ((len = getline(&line, &linesize, fp)) != -1) {
 
75
            if (strncmp(line, "btime ", 6) == 0) {
 
76
                tv->tv_sec = atoi(line + 6);
 
77
                tv->tv_usec = 0;
 
78
                return 1;
 
79
            }
 
80
        }
 
81
        fclose(fp);
 
82
        free(line);
 
83
    }
 
84
 
 
85
    return 0;
 
86
}
 
87
 
 
88
#elif defined(HAVE_SYSCTL) && defined(KERN_BOOTTIME)
 
89
 
 
90
int
 
91
get_boottime(struct timeval *tv)
 
92
{
 
93
    size_t size;
 
94
    int mib[2];
 
95
 
 
96
    mib[0] = CTL_KERN;
 
97
    mib[1] = KERN_BOOTTIME;
 
98
    size = sizeof(*tv);
 
99
    if (sysctl(mib, 2, tv, &size, NULL, 0) != -1)
 
100
        return 1;
 
101
 
 
102
    return 0;
 
103
}
 
104
 
 
105
#elif defined(HAVE_GETUTXID)
 
106
 
 
107
int
 
108
get_boottime(struct timeval *tv)
 
109
{
 
110
    struct utmpx *ut, key;
 
111
 
 
112
    memset(&key, 0, sizeof(key));
 
113
    key.ut_type = BOOT_TIME;
 
114
    setutxent();
 
115
    if ((ut = getutxid(&key)) != NULL) {
 
116
        tv->tv_sec = ut->ut_tv.tv_sec;
 
117
        tv->tv_usec = ut->ut_tv.tv_usec;
 
118
    }
 
119
    endutxent();
 
120
    return ut != NULL;
 
121
}
 
122
 
 
123
#elif defined(HAVE_GETUTID)
 
124
 
 
125
int
 
126
get_boottime(struct timeval *tv)
 
127
{
 
128
    struct utmp *ut, key;
 
129
 
 
130
    memset(&key, 0, sizeof(key));
 
131
    key.ut_type = BOOT_TIME;
 
132
    setutent();
 
133
    if ((ut = getutid(&key)) != NULL) {
 
134
        tv->tv_sec = ut->ut_time;
 
135
        tv->tv_usec = 0;
 
136
    }
 
137
    endutent();
 
138
    return ut != NULL;
 
139
}
 
140
 
 
141
#else
 
142
 
 
143
int
 
144
get_boottime(struct timeval *tv)
 
145
{
 
146
    return 0;
 
147
}
 
148
#endif