Fix the build of nfs4_acls.c
[Samba.git] / source3 / rpc_parse / parse_misc.c
blob1ea4ecf46f8eb5b53dc0376e9855cea8a70a9760
1 /*
2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6 * Copyright (C) Paul Ashton 1997.
7 * Copyright (C) Gerald (Jerry) Carter 2005
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, see <http://www.gnu.org/licenses/>.
23 #include "includes.h"
25 #undef DBGC_CLASS
26 #define DBGC_CLASS DBGC_RPC_PARSE
28 /*******************************************************************
29 Reads or writes an NTTIME structure.
30 ********************************************************************/
32 bool smb_io_time(const char *desc, NTTIME *nttime, prs_struct *ps, int depth)
34 uint32 low, high;
35 if (nttime == NULL)
36 return False;
38 prs_debug(ps, depth, desc, "smb_io_time");
39 depth++;
41 if(!prs_align(ps))
42 return False;
44 if (MARSHALLING(ps)) {
45 low = *nttime & 0xFFFFFFFF;
46 high = *nttime >> 32;
49 if(!prs_uint32("low ", ps, depth, &low)) /* low part */
50 return False;
51 if(!prs_uint32("high", ps, depth, &high)) /* high part */
52 return False;
54 if (UNMARSHALLING(ps)) {
55 *nttime = (((uint64_t)high << 32) + low);
58 return True;
61 /*******************************************************************
62 ********************************************************************/
64 bool smb_io_system_time(const char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
66 if(!prs_uint16("year", ps, depth, &systime->year))
67 return False;
68 if(!prs_uint16("month", ps, depth, &systime->month))
69 return False;
70 if(!prs_uint16("dayofweek", ps, depth, &systime->dayofweek))
71 return False;
72 if(!prs_uint16("day", ps, depth, &systime->day))
73 return False;
74 if(!prs_uint16("hour", ps, depth, &systime->hour))
75 return False;
76 if(!prs_uint16("minute", ps, depth, &systime->minute))
77 return False;
78 if(!prs_uint16("second", ps, depth, &systime->second))
79 return False;
80 if(!prs_uint16("milliseconds", ps, depth, &systime->milliseconds))
81 return False;
83 return True;
86 /*******************************************************************
87 ********************************************************************/
89 bool make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
91 systime->year=unixtime->tm_year+1900;
92 systime->month=unixtime->tm_mon+1;
93 systime->dayofweek=unixtime->tm_wday;
94 systime->day=unixtime->tm_mday;
95 systime->hour=unixtime->tm_hour;
96 systime->minute=unixtime->tm_min;
97 systime->second=unixtime->tm_sec;
98 systime->milliseconds=0;
100 return True;
103 /*******************************************************************
104 Reads or writes a struct GUID
105 ********************************************************************/
107 bool smb_io_uuid(const char *desc, struct GUID *uuid,
108 prs_struct *ps, int depth)
110 if (uuid == NULL)
111 return False;
113 prs_debug(ps, depth, desc, "smb_io_uuid");
114 depth++;
116 if(!prs_uint32 ("data ", ps, depth, &uuid->time_low))
117 return False;
118 if(!prs_uint16 ("data ", ps, depth, &uuid->time_mid))
119 return False;
120 if(!prs_uint16 ("data ", ps, depth, &uuid->time_hi_and_version))
121 return False;
123 if(!prs_uint8s (False, "data ", ps, depth, uuid->clock_seq, sizeof(uuid->clock_seq)))
124 return False;
125 if(!prs_uint8s (False, "data ", ps, depth, uuid->node, sizeof(uuid->node)))
126 return False;
128 return True;
131 /*******************************************************************
132 Inits a UNISTR2 structure.
133 ********************************************************************/
135 void init_unistr2(UNISTR2 *str, const char *buf, enum unistr2_term_codes flags)
137 size_t len = 0;
138 uint32 num_chars = 0;
140 if (buf) {
141 /* We always null terminate the copy. */
142 len = strlen(buf) + 1;
143 if ( flags == UNI_STR_DBLTERMINATE )
144 len++;
147 if (buf == NULL || len == 0) {
148 /* no buffer -- nothing to do */
149 str->uni_max_len = 0;
150 str->offset = 0;
151 str->uni_str_len = 0;
153 return;
157 str->buffer = TALLOC_ZERO_ARRAY(talloc_tos(), uint16, len);
158 if (str->buffer == NULL) {
159 smb_panic("init_unistr2: malloc fail");
160 return;
163 /* Ensure len is the length in *bytes* */
164 len *= sizeof(uint16);
167 * The UNISTR2 must be initialized !!!
168 * jfm, 7/7/2001.
170 if (buf) {
171 rpcstr_push((char *)str->buffer, buf, len, STR_TERMINATE);
172 num_chars = strlen_w(str->buffer);
173 if (flags == UNI_STR_TERMINATE || flags == UNI_MAXLEN_TERMINATE) {
174 num_chars++;
176 if ( flags == UNI_STR_DBLTERMINATE )
177 num_chars += 2;
180 str->uni_max_len = num_chars;
181 str->offset = 0;
182 str->uni_str_len = num_chars;
183 if ( num_chars && ((flags == UNI_MAXLEN_TERMINATE) || (flags == UNI_BROKEN_NON_NULL)) )
184 str->uni_max_len++;