File: common.h

package info (click to toggle)
userv 0.60.2
  • links: PTS
  • area: main
  • in suites: slink
  • size: 424 kB
  • ctags: 495
  • sloc: ansic: 3,866; makefile: 155; sh: 134
file content (135 lines) | stat: -rw-r--r-- 3,924 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
 * userv - common.h
 * definitions shared between client and daemon
 *
 * Copyright (C)1996-1997 Ian Jackson
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with userv; if not, write to the Free Software
 * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifndef COMMON_H
#define COMMON_H

#define PCSUMSIZE 16

static const unsigned char protocolchecksumversion[PCSUMSIZE]= {
#include "pcsum.h"
};

#ifndef VARDIR
# define VARDIR "/var/run/userv"
#endif

#ifndef RENDEZVOUS
# define RENDEZVOUS "socket"
#endif

#ifndef RENDEZVOUSPATH
# define RENDEZVOUSPATH VARDIR "/" RENDEZVOUS
#endif

#ifndef PIPEFORMAT
# define PIPEFORMAT "%lx.%lx.%x"
# define PIPEPATTERN "[0-9a-f]*.[0-9a-f]*.*[0-9a-f]"
# define PIPEFORMATEXTEND ((int)(sizeof(unsigned long)*2*2+(int)sizeof(int)*2+3))
# define PIPEMAXLEN ((int)(sizeof(PIPEFORMAT)+PIPEFORMATEXTEND))
#endif

#ifndef PIPEPATHFORMAT
# define PIPEPATHFORMAT VARDIR "/" PIPEFORMAT
# define PIPEPATHMAXLEN ((int)(sizeof(PIPEPATHFORMAT)+PIPEFORMATEXTEND))
#endif

#define MAX_ALLOW_FD 1024
#define MAX_GENERAL_STRING (1024*1024)
#define MAX_OVERRIDE_LEN MAX_GENERAL_STRING
#define MAX_ERRMSG_STRING 4096
#define MAX_ARGSDEFVAR 4096
#define MAX_GIDS 1024

#ifdef DEBUG
# define BASE_MAGIC 0x5deb7567UL /* "\x5d\xebug" */
#else
# define BASE_MAGIC 0x755e7276UL /* "u\x5erv" */
#endif

enum {
  OPENING_MAGIC= BASE_MAGIC+1,
  REQUEST_MAGIC,
  REQUEST_END_MAGIC,
  PROGRESS_MAGIC,
  PROGRESS_ERRMSG_END_MAGIC,
  EVENT_MAGIC
};

struct opening_msg {
  unsigned long magic;
  unsigned char protocolchecksumversion[PCSUMSIZE];
  pid_t overlordpid, serverpid;
};

struct request_msg {
  unsigned long magic;
  pid_t clientpid; /* or -1 if no service is required and this was a version check */
  int serviceuserlen;
  int servicelen;
  int lognamelen, spoofed; /* spoofed is 0 or 1 */
  int cwdlen, overridelen;
  uid_t callinguid;
  int ngids, nreadfds, nwritefds, nargs, nvars;
  /* Followed by:
   *   serviceuserlen bytes for the service user (unterminated)
   *   servicelen bytes for the service (unterminated)
   *   lognamelen bytes for the login name (unterminated)
   *   cwdlen bytes for the cwd (unterminated)
   *   overridelen bytes for the override data (with extra \n but unterminated),
   *    or nothing if overridelen==-1
   *   ngids gid_ts for the primary group and supplementary groups
   *   nreadfds and then nwritefds ints for the file descriptors
   *   for each of the nargs arguments
   *    an int for the string length
   *    that many characters (unterminated)
   *   for each for the nvars variable keys
   *    an int for the key length
   *    that many characters (unterminated)
   *    an int for the value length
   *    that many characters (unterminated)
   *   one unsigned long, endmagic;
   */
};

struct progress_msg {
  unsigned long magic;
  enum { pt_ok, pt_errmsg, pt_failed, pt_terminated } type;
  union {
    struct { int messagelen; } errmsg;
    struct { int status; } terminated;
  } data;
  /* follwed by variable-length part:
   *  for ok, failed, terminated: nothing
   *  for errmsg: messagelen bytes for the error message (unterminated, no \n)
   *              unsigned long PROGRESS_ERRMSG_END_MAGIC
   */
};

struct event_msg {
  unsigned long magic;
  enum { et_confirm, et_closereadfd, et_disconnect } type;
  union {
    struct { int fd; } closereadfd;
  } data;
};

#endif