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
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/>.
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
)
38 prs_debug(ps
, depth
, desc
, "smb_io_time");
44 if (MARSHALLING(ps
)) {
45 low
= *nttime
& 0xFFFFFFFF;
49 if(!prs_uint32("low ", ps
, depth
, &low
)) /* low part */
51 if(!prs_uint32("high", ps
, depth
, &high
)) /* high part */
54 if (UNMARSHALLING(ps
)) {
55 *nttime
= (((uint64_t)high
<< 32) + low
);
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
))
68 if(!prs_uint16("month", ps
, depth
, &systime
->month
))
70 if(!prs_uint16("dayofweek", ps
, depth
, &systime
->dayofweek
))
72 if(!prs_uint16("day", ps
, depth
, &systime
->day
))
74 if(!prs_uint16("hour", ps
, depth
, &systime
->hour
))
76 if(!prs_uint16("minute", ps
, depth
, &systime
->minute
))
78 if(!prs_uint16("second", ps
, depth
, &systime
->second
))
80 if(!prs_uint16("milliseconds", ps
, depth
, &systime
->milliseconds
))
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;
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
)
113 prs_debug(ps
, depth
, desc
, "smb_io_uuid");
116 if(!prs_uint32 ("data ", ps
, depth
, &uuid
->time_low
))
118 if(!prs_uint16 ("data ", ps
, depth
, &uuid
->time_mid
))
120 if(!prs_uint16 ("data ", ps
, depth
, &uuid
->time_hi_and_version
))
123 if(!prs_uint8s (False
, "data ", ps
, depth
, uuid
->clock_seq
, sizeof(uuid
->clock_seq
)))
125 if(!prs_uint8s (False
, "data ", ps
, depth
, uuid
->node
, sizeof(uuid
->node
)))
131 /*******************************************************************
132 Inits a UNISTR2 structure.
133 ********************************************************************/
135 void init_unistr2(UNISTR2
*str
, const char *buf
, enum unistr2_term_codes flags
)
138 uint32 num_chars
= 0;
141 /* We always null terminate the copy. */
142 len
= strlen(buf
) + 1;
143 if ( flags
== UNI_STR_DBLTERMINATE
)
147 if (buf
== NULL
|| len
== 0) {
148 /* no buffer -- nothing to do */
149 str
->uni_max_len
= 0;
151 str
->uni_str_len
= 0;
157 str
->buffer
= TALLOC_ZERO_ARRAY(talloc_tos(), uint16
, len
);
158 if (str
->buffer
== NULL
) {
159 smb_panic("init_unistr2: malloc fail");
163 /* Ensure len is the length in *bytes* */
164 len
*= sizeof(uint16
);
167 * The UNISTR2 must be initialized !!!
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
) {
176 if ( flags
== UNI_STR_DBLTERMINATE
)
180 str
->uni_max_len
= num_chars
;
182 str
->uni_str_len
= num_chars
;
183 if ( num_chars
&& ((flags
== UNI_MAXLEN_TERMINATE
) || (flags
== UNI_BROKEN_NON_NULL
)) )