Skip to main content

glib/auto/
functions.rs

1// This file was generated by gir (https://github.com/gtk-rs/gir)
2// from gir-files (https://github.com/gtk-rs/gir-files)
3// DO NOT EDIT
4
5#[cfg(feature = "v2_66")]
6#[cfg_attr(docsrs, doc(cfg(feature = "v2_66")))]
7use crate::FileSetContentsFlags;
8use crate::{
9    Bytes, ChecksumType, Error, FileTest, FormatSizeFlags, Pid, Source, SpawnFlags, UserDirectory,
10    ffi, translate::*,
11};
12use std::boxed::Box as Box_;
13
14/// A wrapper for the POSIX access() function. This function is used to
15/// test a pathname for one or several of read, write or execute
16/// permissions, or just existence.
17///
18/// On Windows, the file protection mechanism is not at all POSIX-like,
19/// and the underlying function in the C library only checks the
20/// FAT-style READONLY attribute, and does not look at the ACL of a
21/// file at all. This function is this in practise almost useless on
22/// Windows. Software that needs to handle file permissions on Windows
23/// more exactly should use the Win32 API.
24///
25/// See your C library manual for more details about access().
26/// ## `filename`
27/// a pathname in the GLib file name encoding
28///     (UTF-8 on Windows)
29/// ## `mode`
30/// as in access()
31///
32/// # Returns
33///
34/// zero if the pathname refers to an existing file system
35///     object that has all the tested permissions, or -1 otherwise
36///     or on error.
37#[doc(alias = "g_access")]
38pub fn access(filename: impl AsRef<std::path::Path>, mode: i32) -> i32 {
39    unsafe { ffi::g_access(filename.as_ref().to_glib_none().0, mode) }
40}
41
42/// Decode a sequence of Base-64 encoded text into binary data.  Note
43/// that the returned binary data is not necessarily zero-terminated,
44/// so it should not be used as a character string.
45/// ## `text`
46/// zero-terminated string with base64 text to decode
47///
48/// # Returns
49///
50///
51///               newly allocated buffer containing the binary data
52///               that @text represents. The returned buffer must
53///               be freed with g_free().
54#[doc(alias = "g_base64_decode")]
55pub fn base64_decode(text: &str) -> Vec<u8> {
56    unsafe {
57        let mut out_len = std::mem::MaybeUninit::uninit();
58        let ret = FromGlibContainer::from_glib_full_num(
59            ffi::g_base64_decode(text.to_glib_none().0, out_len.as_mut_ptr()),
60            out_len.assume_init() as _,
61        );
62        ret
63    }
64}
65
66//#[doc(alias = "g_base64_decode_inplace")]
67//pub fn base64_decode_inplace(text: /*Unimplemented*/Vec<u8>) -> u8 {
68//    unsafe { TODO: call ffi:g_base64_decode_inplace() }
69//}
70
71//#[doc(alias = "g_base64_decode_step")]
72//pub fn base64_decode_step(in_: &[&str], out: Vec<u8>, state: &mut i32, save: &mut u32) -> usize {
73//    unsafe { TODO: call ffi:g_base64_decode_step() }
74//}
75
76/// Encode a sequence of binary data into its Base-64 stringified
77/// representation.
78/// ## `data`
79/// the binary data to encode
80///
81/// # Returns
82///
83/// a newly allocated, zero-terminated Base-64
84///               encoded string representing @data. The returned string must
85///               be freed with g_free().
86#[doc(alias = "g_base64_encode")]
87pub fn base64_encode(data: &[u8]) -> crate::GString {
88    let len = data.len() as _;
89    unsafe { from_glib_full(ffi::g_base64_encode(data.to_glib_none().0, len)) }
90}
91
92//#[doc(alias = "g_base64_encode_close")]
93//pub fn base64_encode_close(break_lines: bool, out: Vec<u8>, state: &mut i32, save: &mut i32) -> usize {
94//    unsafe { TODO: call ffi:g_base64_encode_close() }
95//}
96
97//#[doc(alias = "g_base64_encode_step")]
98//pub fn base64_encode_step(in_: &[u8], break_lines: bool, out: Vec<u8>, state: &mut i32, save: &mut i32) -> usize {
99//    unsafe { TODO: call ffi:g_base64_encode_step() }
100//}
101
102/// Checks that the GLib library in use is compatible with the
103/// given version.
104///
105/// Generally you would pass in the constants `GLIB_MAJOR_VERSION`,
106/// `GLIB_MINOR_VERSION`, `GLIB_MICRO_VERSION` as the three arguments
107/// to this function; that produces a check that the library in use
108/// is compatible with the version of GLib the application or module
109/// was compiled against.
110///
111/// Compatibility is defined by two things: first the version
112/// of the running library is newer than the version
113/// `@required_major.required_minor.@required_micro`. Second
114/// the running library must be binary compatible with the
115/// version `@required_major.@required_minor.@required_micro`
116/// (same major version.)
117/// ## `required_major`
118/// the required major version
119/// ## `required_minor`
120/// the required minor version
121/// ## `required_micro`
122/// the required micro version
123///
124/// # Returns
125///
126/// [`None`] if the GLib library is
127///   compatible with the given version, or a string describing the
128///   version mismatch. The returned string is owned by GLib and must
129///   not be modified or freed.
130#[doc(alias = "glib_check_version")]
131pub fn check_version(
132    required_major: u32,
133    required_minor: u32,
134    required_micro: u32,
135) -> Option<crate::GString> {
136    unsafe {
137        from_glib_none(ffi::glib_check_version(
138            required_major,
139            required_minor,
140            required_micro,
141        ))
142    }
143}
144
145/// Computes the checksum for a binary @data. This is a
146/// convenience wrapper for g_checksum_new(), g_checksum_get_string()
147/// and g_checksum_free().
148///
149/// The hexadecimal string returned will be in lower case.
150/// ## `checksum_type`
151/// a #GChecksumType
152/// ## `data`
153/// binary blob to compute the digest of
154///
155/// # Returns
156///
157/// the digest of the binary data as a
158///   string in hexadecimal, or [`None`] if g_checksum_new() fails for
159///   @checksum_type. The returned string should be freed with g_free() when
160///   done using it.
161#[doc(alias = "g_compute_checksum_for_bytes")]
162pub fn compute_checksum_for_bytes(
163    checksum_type: ChecksumType,
164    data: &Bytes,
165) -> Option<crate::GString> {
166    unsafe {
167        from_glib_full(ffi::g_compute_checksum_for_bytes(
168            checksum_type.into_glib(),
169            data.to_glib_none().0,
170        ))
171    }
172}
173
174/// Computes the checksum for a binary @data of @length. This is a
175/// convenience wrapper for g_checksum_new(), g_checksum_get_string()
176/// and g_checksum_free().
177///
178/// The hexadecimal string returned will be in lower case.
179/// ## `checksum_type`
180/// a #GChecksumType
181/// ## `data`
182/// binary blob to compute the digest of
183///
184/// # Returns
185///
186/// the digest of the binary data as a
187///   string in hexadecimal, or [`None`] if g_checksum_new() fails for
188///   @checksum_type. The returned string should be freed with g_free() when
189///   done using it.
190#[doc(alias = "g_compute_checksum_for_data")]
191pub fn compute_checksum_for_data(
192    checksum_type: ChecksumType,
193    data: &[u8],
194) -> Option<crate::GString> {
195    let length = data.len() as _;
196    unsafe {
197        from_glib_full(ffi::g_compute_checksum_for_data(
198            checksum_type.into_glib(),
199            data.to_glib_none().0,
200            length,
201        ))
202    }
203}
204
205/// Computes the HMAC for a binary @data. This is a
206/// convenience wrapper for g_hmac_new(), g_hmac_get_string()
207/// and g_hmac_unref().
208///
209/// The hexadecimal string returned will be in lower case.
210/// ## `digest_type`
211/// a #GChecksumType to use for the HMAC
212/// ## `key`
213/// the key to use in the HMAC
214/// ## `data`
215/// binary blob to compute the HMAC of
216///
217/// # Returns
218///
219/// the HMAC of the binary data as a string in hexadecimal.
220///   The returned string should be freed with g_free() when done using it.
221#[doc(alias = "g_compute_hmac_for_bytes")]
222pub fn compute_hmac_for_bytes(
223    digest_type: ChecksumType,
224    key: &Bytes,
225    data: &Bytes,
226) -> crate::GString {
227    unsafe {
228        from_glib_full(ffi::g_compute_hmac_for_bytes(
229            digest_type.into_glib(),
230            key.to_glib_none().0,
231            data.to_glib_none().0,
232        ))
233    }
234}
235
236/// Computes the HMAC for a binary @data of @length. This is a
237/// convenience wrapper for g_hmac_new(), g_hmac_get_string()
238/// and g_hmac_unref().
239///
240/// The hexadecimal string returned will be in lower case.
241/// ## `digest_type`
242/// a #GChecksumType to use for the HMAC
243/// ## `key`
244/// the key to use in the HMAC
245/// ## `data`
246/// binary blob to compute the HMAC of
247///
248/// # Returns
249///
250/// the HMAC of the binary data as a string in hexadecimal.
251///   The returned string should be freed with g_free() when done using it.
252#[doc(alias = "g_compute_hmac_for_data")]
253pub fn compute_hmac_for_data(digest_type: ChecksumType, key: &[u8], data: &[u8]) -> crate::GString {
254    let key_len = key.len() as _;
255    let length = data.len() as _;
256    unsafe {
257        from_glib_full(ffi::g_compute_hmac_for_data(
258            digest_type.into_glib(),
259            key.to_glib_none().0,
260            key_len,
261            data.to_glib_none().0,
262            length,
263        ))
264    }
265}
266
267/// This is a variant of g_dgettext() that allows specifying a locale
268/// category instead of always using `LC_MESSAGES`. See g_dgettext() for
269/// more information about how this functions differs from calling
270/// dcgettext() directly.
271/// ## `domain`
272/// the translation domain to use, or [`None`] to use
273///   the domain set with textdomain()
274/// ## `msgid`
275/// message to translate
276/// ## `category`
277/// a locale category
278///
279/// # Returns
280///
281/// the translated string for the given locale category
282#[doc(alias = "g_dcgettext")]
283pub fn dcgettext(domain: Option<&str>, msgid: &str, category: i32) -> crate::GString {
284    unsafe {
285        from_glib_none(ffi::g_dcgettext(
286            domain.to_glib_none().0,
287            msgid.to_glib_none().0,
288            category,
289        ))
290    }
291}
292
293/// This function is a wrapper of dgettext() which does not translate
294/// the message if the default domain as set with textdomain() has no
295/// translations for the current locale.
296///
297/// The advantage of using this function over dgettext() proper is that
298/// libraries using this function (like GTK) will not use translations
299/// if the application using the library does not have translations for
300/// the current locale.  This results in a consistent English-only
301/// interface instead of one having partial translations.  For this
302/// feature to work, the call to textdomain() and setlocale() should
303/// precede any g_dgettext() invocations.  For GTK, it means calling
304/// textdomain() before gtk_init or its variants.
305///
306/// This function disables translations if and only if upon its first
307/// call all the following conditions hold:
308///
309/// - @domain is not [`None`]
310///
311/// - textdomain() has been called to set a default text domain
312///
313/// - there is no translations available for the default text domain
314///   and the current locale
315///
316/// - current locale is not "C" or any English locales (those
317///   starting with "en_")
318///
319/// Note that this behavior may not be desired for example if an application
320/// has its untranslated messages in a language other than English. In those
321/// cases the application should call textdomain() after initializing GTK.
322///
323/// Applications should normally not use this function directly,
324/// but use the _() macro for translations.
325/// ## `domain`
326/// the translation domain to use, or [`None`] to use
327///   the domain set with textdomain()
328/// ## `msgid`
329/// message to translate
330///
331/// # Returns
332///
333/// The translated string
334#[doc(alias = "g_dgettext")]
335pub fn dgettext(domain: Option<&str>, msgid: &str) -> crate::GString {
336    unsafe {
337        from_glib_none(ffi::g_dgettext(
338            domain.to_glib_none().0,
339            msgid.to_glib_none().0,
340        ))
341    }
342}
343
344/// This function is a wrapper of dngettext() which does not translate
345/// the message if the default domain as set with textdomain() has no
346/// translations for the current locale.
347///
348/// See g_dgettext() for details of how this differs from dngettext()
349/// proper.
350/// ## `domain`
351/// the translation domain to use, or [`None`] to use
352///   the domain set with textdomain()
353/// ## `msgid`
354/// message to translate
355/// ## `msgid_plural`
356/// plural form of the message
357/// ## `n`
358/// the quantity for which translation is needed
359///
360/// # Returns
361///
362/// The translated string
363#[doc(alias = "g_dngettext")]
364pub fn dngettext(
365    domain: Option<&str>,
366    msgid: &str,
367    msgid_plural: &str,
368    n: libc::c_ulong,
369) -> crate::GString {
370    unsafe {
371        from_glib_none(ffi::g_dngettext(
372            domain.to_glib_none().0,
373            msgid.to_glib_none().0,
374            msgid_plural.to_glib_none().0,
375            n,
376        ))
377    }
378}
379
380/// This function is a variant of g_dgettext() which supports
381/// a disambiguating message context. GNU gettext uses the
382/// '\004' character to separate the message context and
383/// message id in @msgctxtid.
384/// If 0 is passed as @msgidoffset, this function will fall back to
385/// trying to use the deprecated convention of using "|" as a separation
386/// character.
387///
388/// This uses g_dgettext() internally. See that functions for differences
389/// with dgettext() proper.
390///
391/// Applications should normally not use this function directly,
392/// but use the C_() macro for translations with context.
393/// ## `domain`
394/// the translation domain to use, or [`None`] to use
395///   the domain set with textdomain()
396/// ## `msgctxtid`
397/// a combined message context and message id, separated
398///   by a \004 character
399/// ## `msgidoffset`
400/// the offset of the message id in @msgctxid
401///
402/// # Returns
403///
404/// The translated string
405#[doc(alias = "g_dpgettext")]
406pub fn dpgettext(domain: Option<&str>, msgctxtid: &str, msgidoffset: usize) -> crate::GString {
407    unsafe {
408        from_glib_none(ffi::g_dpgettext(
409            domain.to_glib_none().0,
410            msgctxtid.to_glib_none().0,
411            msgidoffset,
412        ))
413    }
414}
415
416/// This function is a variant of g_dgettext() which supports
417/// a disambiguating message context. GNU gettext uses the
418/// '\004' character to separate the message context and
419/// message id in @msgctxtid.
420///
421/// This uses g_dgettext() internally. See that functions for differences
422/// with dgettext() proper.
423///
424/// This function differs from C_() in that it is not a macro and
425/// thus you may use non-string-literals as context and msgid arguments.
426/// ## `domain`
427/// the translation domain to use, or [`None`] to use
428///   the domain set with textdomain()
429/// ## `context`
430/// the message context
431/// ## `msgid`
432/// the message
433///
434/// # Returns
435///
436/// The translated string
437#[doc(alias = "g_dpgettext2")]
438pub fn dpgettext2(domain: Option<&str>, context: &str, msgid: &str) -> crate::GString {
439    unsafe {
440        from_glib_none(ffi::g_dpgettext2(
441            domain.to_glib_none().0,
442            context.to_glib_none().0,
443            msgid.to_glib_none().0,
444        ))
445    }
446}
447
448/// Writes all of @contents to a file named @filename. This is a convenience
449/// wrapper around calling g_file_set_contents_full() with `flags` set to
450/// `G_FILE_SET_CONTENTS_CONSISTENT | G_FILE_SET_CONTENTS_ONLY_EXISTING` and
451/// `mode` set to `0666`.
452/// ## `filename`
453/// name of a file to write @contents to, in the GLib file name
454///   encoding
455/// ## `contents`
456/// string to write to the file
457///
458/// # Returns
459///
460/// [`true`] on success, [`false`] if an error occurred
461#[doc(alias = "g_file_set_contents")]
462pub fn file_set_contents(
463    filename: impl AsRef<std::path::Path>,
464    contents: &[u8],
465) -> Result<(), crate::Error> {
466    let length = contents.len() as _;
467    unsafe {
468        let mut error = std::ptr::null_mut();
469        let is_ok = ffi::g_file_set_contents(
470            filename.as_ref().to_glib_none().0,
471            contents.to_glib_none().0,
472            length,
473            &mut error,
474        );
475        debug_assert_eq!(is_ok == crate::ffi::GFALSE, !error.is_null());
476        if error.is_null() {
477            Ok(())
478        } else {
479            Err(from_glib_full(error))
480        }
481    }
482}
483
484/// Writes all of @contents to a file named @filename, with good error checking.
485/// If a file called @filename already exists it will be overwritten.
486///
487/// @flags control the properties of the write operation: whether it’s atomic,
488/// and what the tradeoff is between returning quickly or being resilient to
489/// system crashes.
490///
491/// As this function performs file I/O, it is recommended to not call it anywhere
492/// where blocking would cause problems, such as in the main loop of a graphical
493/// application. In particular, if @flags has any value other than
494/// [`FileSetContentsFlags::NONE`][crate::FileSetContentsFlags::NONE] then this function may call `fsync()`.
495///
496/// If [`FileSetContentsFlags::CONSISTENT`][crate::FileSetContentsFlags::CONSISTENT] is set in @flags, the operation is atomic
497/// in the sense that it is first written to a temporary file which is then
498/// renamed to the final name.
499///
500/// Notes:
501///
502/// - On UNIX, if @filename already exists hard links to @filename will break.
503///   Also since the file is recreated, existing permissions, access control
504///   lists, metadata etc. may be lost. If @filename is a symbolic link,
505///   the link itself will be replaced, not the linked file.
506///
507/// - On UNIX, if @filename already exists and is non-empty, and if the system
508///   supports it (via a journalling filesystem or equivalent), and if
509///   [`FileSetContentsFlags::CONSISTENT`][crate::FileSetContentsFlags::CONSISTENT] is set in @flags, the `fsync()` call (or
510///   equivalent) will be used to ensure atomic replacement: @filename
511///   will contain either its old contents or @contents, even in the face of
512///   system power loss, the disk being unsafely removed, etc.
513///
514/// - On UNIX, if @filename does not already exist or is empty, there is a
515///   possibility that system power loss etc. after calling this function will
516///   leave @filename empty or full of NUL bytes, depending on the underlying
517///   filesystem, unless [`FileSetContentsFlags::DURABLE`][crate::FileSetContentsFlags::DURABLE] and
518///   [`FileSetContentsFlags::CONSISTENT`][crate::FileSetContentsFlags::CONSISTENT] are set in @flags.
519///
520/// - On Windows renaming a file will not remove an existing file with the
521///   new name, so on Windows there is a race condition between the existing
522///   file being removed and the temporary file being renamed.
523///
524/// - On Windows there is no way to remove a file that is open to some
525///   process, or mapped into memory. Thus, this function will fail if
526///   @filename already exists and is open.
527///
528/// If the call was successful, it returns [`true`]. If the call was not successful,
529/// it returns [`false`] and sets @error. The error domain is `G_FILE_ERROR`.
530/// Possible error codes are those in the #GFileError enumeration.
531///
532/// Note that the name for the temporary file is constructed by appending up
533/// to 7 characters to @filename.
534///
535/// If the file didn’t exist before and is created, it will be given the
536/// permissions from @mode. Otherwise, the permissions of the existing file will
537/// remain unchanged.
538/// ## `filename`
539/// name of a file to write @contents to, in the GLib file name
540///   encoding
541/// ## `contents`
542/// string to write to the file
543/// ## `flags`
544/// flags controlling the safety vs speed of the operation
545/// ## `mode`
546/// file mode, as passed to `open()`; typically this will be `0666`
547///
548/// # Returns
549///
550/// [`true`] on success, [`false`] if an error occurred
551#[cfg(feature = "v2_66")]
552#[cfg_attr(docsrs, doc(cfg(feature = "v2_66")))]
553#[doc(alias = "g_file_set_contents_full")]
554pub fn file_set_contents_full(
555    filename: impl AsRef<std::path::Path>,
556    contents: &[u8],
557    flags: FileSetContentsFlags,
558    mode: i32,
559) -> Result<(), crate::Error> {
560    let length = contents.len() as _;
561    unsafe {
562        let mut error = std::ptr::null_mut();
563        let is_ok = ffi::g_file_set_contents_full(
564            filename.as_ref().to_glib_none().0,
565            contents.to_glib_none().0,
566            length,
567            flags.into_glib(),
568            mode,
569            &mut error,
570        );
571        debug_assert_eq!(is_ok == crate::ffi::GFALSE, !error.is_null());
572        if error.is_null() {
573            Ok(())
574        } else {
575            Err(from_glib_full(error))
576        }
577    }
578}
579
580/// Returns [`true`] if any of the tests in the bitfield @test are
581/// [`true`]. For example, `(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)`
582/// will return [`true`] if the file exists; the check whether it's a
583/// directory doesn't matter since the existence test is [`true`]. With
584/// the current set of available tests, there's no point passing in
585/// more than one test at a time.
586///
587/// Apart from [`FileTest::IS_SYMLINK`][crate::FileTest::IS_SYMLINK] all tests follow symbolic links,
588/// so for a symbolic link to a regular file g_file_test() will return
589/// [`true`] for both [`FileTest::IS_SYMLINK`][crate::FileTest::IS_SYMLINK] and [`FileTest::IS_REGULAR`][crate::FileTest::IS_REGULAR].
590///
591/// Note, that for a dangling symbolic link g_file_test() will return
592/// [`true`] for [`FileTest::IS_SYMLINK`][crate::FileTest::IS_SYMLINK] and [`false`] for all other flags.
593///
594/// You should never use g_file_test() to test whether it is safe
595/// to perform an operation, because there is always the possibility
596/// of the condition changing before you actually perform the operation,
597/// see [TOCTOU](https://en.wikipedia.org/wiki/Time-of-check_to_time-of-use).
598///
599/// For example, you might think you could use [`FileTest::IS_SYMLINK`][crate::FileTest::IS_SYMLINK]
600/// to know whether it is safe to write to a file without being
601/// tricked into writing into a different location. It doesn't work!
602///
603///
604///
605/// **⚠️ The following code is in C ⚠️**
606///
607/// ```C
608///  // DON'T DO THIS
609///  if (!g_file_test (filename, G_FILE_TEST_IS_SYMLINK))
610///    {
611///      fd = g_open (filename, O_WRONLY);
612///      // write to fd
613///    }
614///
615///  // DO THIS INSTEAD
616///  fd = g_open (filename, O_WRONLY | O_NOFOLLOW | O_CLOEXEC);
617///  if (fd == -1)
618///    {
619///      // check error
620///      if (errno == ELOOP)
621///        // file is a symlink and can be ignored
622///      else
623///        // handle errors as before
624///    }
625///  else
626///    {
627///      // write to fd
628///    }
629/// ```
630///
631/// Another thing to note is that [`FileTest::EXISTS`][crate::FileTest::EXISTS] and
632/// [`FileTest::IS_EXECUTABLE`][crate::FileTest::IS_EXECUTABLE] are implemented using the access()
633/// system call. This usually doesn't matter, but if your program
634/// is setuid or setgid it means that these tests will give you
635/// the answer for the real user ID and group ID, rather than the
636/// effective user ID and group ID.
637///
638/// On Windows, there are no symlinks, so testing for
639/// [`FileTest::IS_SYMLINK`][crate::FileTest::IS_SYMLINK] will always return [`false`]. Testing for
640/// [`FileTest::IS_EXECUTABLE`][crate::FileTest::IS_EXECUTABLE] will just check that the file exists and
641/// its name indicates that it is executable, checking for well-known
642/// extensions and those listed in the `PATHEXT` environment variable.
643/// ## `filename`
644/// a filename to test in the
645///     GLib file name encoding
646/// ## `test`
647/// bitfield of #GFileTest flags
648///
649/// # Returns
650///
651/// whether a test was [`true`]
652#[doc(alias = "g_file_test")]
653#[allow(dead_code)]
654pub(crate) fn file_test(filename: impl AsRef<std::path::Path>, test: FileTest) -> bool {
655    unsafe {
656        from_glib(ffi::g_file_test(
657            filename.as_ref().to_glib_none().0,
658            test.into_glib(),
659        ))
660    }
661}
662
663/// Returns the display basename for the particular filename, guaranteed
664/// to be valid UTF-8. The display name might not be identical to the filename,
665/// for instance there might be problems converting it to UTF-8, and some files
666/// can be translated in the display.
667///
668/// If GLib cannot make sense of the encoding of @filename, as a last resort it
669/// replaces unknown characters with U+FFFD, the Unicode replacement character.
670/// You can search the result for the UTF-8 encoding of this character (which is
671/// "\357\277\275" in octal notation) to find out if @filename was in an invalid
672/// encoding.
673///
674/// You must pass the whole absolute pathname to this functions so that
675/// translation of well known locations can be done.
676///
677/// This function is preferred over g_filename_display_name() if you know the
678/// whole path, as it allows translation.
679/// ## `filename`
680/// an absolute pathname in the
681///     GLib file name encoding
682///
683/// # Returns
684///
685/// a newly allocated string containing
686///   a rendition of the basename of the filename in valid UTF-8
687#[doc(alias = "g_filename_display_basename")]
688pub fn filename_display_basename(filename: impl AsRef<std::path::Path>) -> crate::GString {
689    unsafe {
690        from_glib_full(ffi::g_filename_display_basename(
691            filename.as_ref().to_glib_none().0,
692        ))
693    }
694}
695
696/// Converts a filename into a valid UTF-8 string. The conversion is
697/// not necessarily reversible, so you should keep the original around
698/// and use the return value of this function only for display purposes.
699/// Unlike g_filename_to_utf8(), the result is guaranteed to be non-[`None`]
700/// even if the filename actually isn't in the GLib file name encoding.
701///
702/// If GLib cannot make sense of the encoding of @filename, as a last resort it
703/// replaces unknown characters with U+FFFD, the Unicode replacement character.
704/// You can search the result for the UTF-8 encoding of this character (which is
705/// "\357\277\275" in octal notation) to find out if @filename was in an invalid
706/// encoding.
707///
708/// If you know the whole pathname of the file you should use
709/// g_filename_display_basename(), since that allows location-based
710/// translation of filenames.
711/// ## `filename`
712/// a pathname hopefully in the
713///     GLib file name encoding
714///
715/// # Returns
716///
717/// a newly allocated string containing
718///   a rendition of the filename in valid UTF-8
719#[doc(alias = "g_filename_display_name")]
720pub fn filename_display_name(filename: impl AsRef<std::path::Path>) -> crate::GString {
721    unsafe {
722        from_glib_full(ffi::g_filename_display_name(
723            filename.as_ref().to_glib_none().0,
724        ))
725    }
726}
727
728/// Converts an escaped ASCII-encoded URI to a local filename in the
729/// encoding used for filenames.
730///
731/// Since GLib 2.78, the query string and fragment can be present in the URI,
732/// but are not part of the resulting filename.
733/// We take inspiration from https://url.spec.whatwg.org/#file-state,
734/// but we don't support the entire standard.
735/// ## `uri`
736/// a uri describing a filename (escaped, encoded in ASCII).
737///
738/// # Returns
739///
740/// a newly-allocated string holding
741///               the resulting filename, or [`None`] on an error.
742///
743/// ## `hostname`
744/// Location to store hostname for the URI.
745///            If there is no hostname in the URI, [`None`] will be
746///            stored in this location.
747#[doc(alias = "g_filename_from_uri")]
748pub fn filename_from_uri(
749    uri: &str,
750) -> Result<(std::path::PathBuf, Option<crate::GString>), crate::Error> {
751    unsafe {
752        let mut hostname = std::ptr::null_mut();
753        let mut error = std::ptr::null_mut();
754        let ret = ffi::g_filename_from_uri(uri.to_glib_none().0, &mut hostname, &mut error);
755        if error.is_null() {
756            Ok((from_glib_full(ret), from_glib_full(hostname)))
757        } else {
758            Err(from_glib_full(error))
759        }
760    }
761}
762
763/// Converts an absolute filename to an escaped ASCII-encoded URI, with the path
764/// component following Section 3.3. of RFC 2396.
765/// ## `filename`
766/// an absolute filename specified in the GLib file
767///     name encoding, which is the on-disk file name bytes on Unix, and UTF-8
768///     on Windows
769/// ## `hostname`
770/// A UTF-8 encoded hostname, or [`None`] for none.
771///
772/// # Returns
773///
774/// a newly-allocated string holding the resulting
775///               URI, or [`None`] on an error.
776#[doc(alias = "g_filename_to_uri")]
777pub fn filename_to_uri(
778    filename: impl AsRef<std::path::Path>,
779    hostname: Option<&str>,
780) -> Result<crate::GString, crate::Error> {
781    unsafe {
782        let mut error = std::ptr::null_mut();
783        let ret = ffi::g_filename_to_uri(
784            filename.as_ref().to_glib_none().0,
785            hostname.to_glib_none().0,
786            &mut error,
787        );
788        if error.is_null() {
789            Ok(from_glib_full(ret))
790        } else {
791            Err(from_glib_full(error))
792        }
793    }
794}
795
796/// Locates the first executable named @program in the user's path, in the
797/// same way that execvp() would locate it. Returns an allocated string
798/// with the absolute path name, or [`None`] if the program is not found in
799/// the path. If @program is already an absolute path, returns a copy of
800/// @program if @program exists and is executable, and [`None`] otherwise.
801///
802/// On Windows, if @program does not have a file type suffix, tries
803/// with the suffixes .exe, .cmd, .bat and .com, and the suffixes in
804/// the `PATHEXT` environment variable.
805///
806/// On Windows, it looks for the file in the same way as CreateProcess()
807/// would. This means first in the directory where the executing
808/// program was loaded from, then in the current directory, then in the
809/// Windows 32-bit system directory, then in the Windows directory, and
810/// finally in the directories in the `PATH` environment variable. If
811/// the program is found, the return value contains the full name
812/// including the type suffix.
813/// ## `program`
814/// a program name in the GLib file name encoding
815///
816/// # Returns
817///
818/// a newly-allocated
819///   string with the absolute path, or [`None`]
820#[doc(alias = "g_find_program_in_path")]
821pub fn find_program_in_path(program: impl AsRef<std::path::Path>) -> Option<std::path::PathBuf> {
822    unsafe {
823        from_glib_full(ffi::g_find_program_in_path(
824            program.as_ref().to_glib_none().0,
825        ))
826    }
827}
828
829/// Formats a size (for example the size of a file) into a human readable
830/// string.  Sizes are rounded to the nearest size prefix (kB, MB, GB)
831/// and are displayed rounded to the nearest tenth. E.g. the file size
832/// 3292528 bytes will be converted into the string "3.2 MB". The returned string
833/// is UTF-8, and may use a non-breaking space to separate the number and units,
834/// to ensure they aren’t separated when line wrapped.
835///
836/// The prefix units base is 1000 (i.e. 1 kB is 1000 bytes).
837///
838/// This string should be freed with g_free() when not needed any longer.
839///
840/// See g_format_size_full() for more options about how the size might be
841/// formatted.
842/// ## `size`
843/// a size in bytes
844///
845/// # Returns
846///
847/// a newly-allocated formatted string containing
848///   a human readable file size
849#[doc(alias = "g_format_size")]
850pub fn format_size(size: u64) -> crate::GString {
851    unsafe { from_glib_full(ffi::g_format_size(size)) }
852}
853
854/// Formats a size.
855///
856/// This function is similar to g_format_size() but allows for flags
857/// that modify the output. See #GFormatSizeFlags.
858/// ## `size`
859/// a size in bytes
860/// ## `flags`
861/// #GFormatSizeFlags to modify the output
862///
863/// # Returns
864///
865/// a newly-allocated formatted string
866///   containing a human readable file size
867#[doc(alias = "g_format_size_full")]
868pub fn format_size_full(size: u64, flags: FormatSizeFlags) -> crate::GString {
869    unsafe { from_glib_full(ffi::g_format_size_full(size, flags.into_glib())) }
870}
871
872/// Gets a human-readable name for the application, as set by
873/// g_set_application_name(). This name should be localized if
874/// possible, and is intended for display to the user.  Contrast with
875/// g_get_prgname(), which gets a non-localized name. If
876/// g_set_application_name() has not been called, returns the result of
877/// g_get_prgname() (which may be [`None`] if g_set_prgname() has also not
878/// been called).
879///
880/// # Returns
881///
882/// human-readable application
883///   name. May return [`None`]
884#[doc(alias = "g_get_application_name")]
885#[doc(alias = "get_application_name")]
886pub fn application_name() -> Option<crate::GString> {
887    unsafe { from_glib_none(ffi::g_get_application_name()) }
888}
889
890/// Gets the character set for the current locale.
891///
892/// # Returns
893///
894/// a newly allocated string containing the name
895///     of the character set. This string must be freed with g_free().
896#[doc(alias = "g_get_codeset")]
897#[doc(alias = "get_codeset")]
898pub fn codeset() -> crate::GString {
899    unsafe { from_glib_full(ffi::g_get_codeset()) }
900}
901
902/// Obtains the character set used by the console attached to the process,
903/// which is suitable for printing output to the terminal.
904///
905/// Usually this matches the result returned by g_get_charset(), but in
906/// environments where the locale's character set does not match the encoding
907/// of the console this function tries to guess a more suitable value instead.
908///
909/// On Windows the character set returned by this function is the
910/// output code page used by the console associated with the calling process.
911/// If the codepage can't be determined (for example because there is no
912/// console attached) UTF-8 is assumed.
913///
914/// The return value is [`true`] if the locale's encoding is UTF-8, in that
915/// case you can perhaps avoid calling g_convert().
916///
917/// The string returned in @charset is not allocated, and should not be
918/// freed.
919///
920/// # Returns
921///
922/// [`true`] if the returned charset is UTF-8
923///
924/// ## `charset`
925/// return location for character set
926///   name, or [`None`].
927#[cfg(feature = "v2_62")]
928#[cfg_attr(docsrs, doc(cfg(feature = "v2_62")))]
929#[doc(alias = "g_get_console_charset")]
930#[doc(alias = "get_console_charset")]
931pub fn console_charset() -> Option<crate::GString> {
932    unsafe {
933        let mut charset = std::ptr::null();
934        let ret = from_glib(ffi::g_get_console_charset(&mut charset));
935        if ret {
936            Some(from_glib_none(charset))
937        } else {
938            None
939        }
940    }
941}
942
943/// Gets the current directory.
944///
945/// The returned string should be freed when no longer needed.
946/// The encoding of the returned string is system defined.
947/// On Windows, it is always UTF-8.
948///
949/// Since GLib 2.40, this function will return the value of the "PWD"
950/// environment variable if it is set and it happens to be the same as
951/// the current directory.  This can make a difference in the case that
952/// the current directory is the target of a symbolic link.
953///
954/// # Returns
955///
956/// the current directory
957#[doc(alias = "g_get_current_dir")]
958#[doc(alias = "get_current_dir")]
959pub fn current_dir() -> std::path::PathBuf {
960    unsafe { from_glib_full(ffi::g_get_current_dir()) }
961}
962
963/// Gets the list of environment variables for the current process.
964///
965/// The list is [`None`] terminated and each item in the list is of the
966/// form 'NAME=VALUE'.
967///
968/// This is equivalent to direct access to the 'environ' global variable,
969/// except portable.
970///
971/// The return value is freshly allocated and it should be freed with
972/// g_strfreev() when it is no longer needed.
973///
974/// # Returns
975///
976///
977///     the list of environment variables
978#[doc(alias = "g_get_environ")]
979#[doc(alias = "get_environ")]
980pub fn environ() -> Vec<std::ffi::OsString> {
981    unsafe { FromGlibPtrContainer::from_glib_full(ffi::g_get_environ()) }
982}
983
984/// Gets the current user's home directory.
985///
986/// As with most UNIX tools, this function will return the value of the
987/// `HOME` environment variable if it is set to an existing absolute path
988/// name, falling back to the `passwd` file in the case that it is unset.
989///
990/// If the path given in `HOME` is non-absolute, does not exist, or is
991/// not a directory, the result is undefined.
992///
993/// Before version 2.36 this function would ignore the `HOME` environment
994/// variable, taking the value from the `passwd` database instead. This was
995/// changed to increase the compatibility of GLib with other programs (and
996/// the XDG basedir specification) and to increase testability of programs
997/// based on GLib (by making it easier to run them from test frameworks).
998///
999/// If your program has a strong requirement for either the new or the
1000/// old behaviour (and if you don't wish to increase your GLib
1001/// dependency to ensure that the new behaviour is in effect) then you
1002/// should either directly check the `HOME` environment variable yourself
1003/// or unset it before calling any functions in GLib.
1004///
1005/// # Returns
1006///
1007/// the current user's home directory
1008#[doc(alias = "g_get_home_dir")]
1009#[doc(alias = "get_home_dir")]
1010pub fn home_dir() -> std::path::PathBuf {
1011    unsafe { from_glib_none(ffi::g_get_home_dir()) }
1012}
1013
1014/// Return a name for the machine.
1015///
1016/// The returned name is not necessarily a fully-qualified domain name,
1017/// or even present in DNS or some other name service at all. It need
1018/// not even be unique on your local network or site, but usually it
1019/// is. Callers should not rely on the return value having any specific
1020/// properties like uniqueness for security purposes. Even if the name
1021/// of the machine is changed while an application is running, the
1022/// return value from this function does not change. The returned
1023/// string is owned by GLib and should not be modified or freed. If no
1024/// name can be determined, a default fixed string "localhost" is
1025/// returned.
1026///
1027/// The encoding of the returned string is UTF-8.
1028///
1029/// # Returns
1030///
1031/// the host name of the machine.
1032#[doc(alias = "g_get_host_name")]
1033#[doc(alias = "get_host_name")]
1034pub fn host_name() -> crate::GString {
1035    unsafe { from_glib_none(ffi::g_get_host_name()) }
1036}
1037
1038/// Computes a list of applicable locale names, which can be used to
1039/// e.g. construct locale-dependent filenames or search paths. The returned
1040/// list is sorted from most desirable to least desirable and always contains
1041/// the default locale "C".
1042///
1043/// For example, if LANGUAGE=de:en_US, then the returned list is
1044/// "de", "en_US", "en", "C".
1045///
1046/// This function consults the environment variables `LANGUAGE`, `LC_ALL`,
1047/// `LC_MESSAGES` and `LANG` to find the list of locales specified by the
1048/// user.
1049///
1050/// # Returns
1051///
1052/// a [`None`]-terminated array of strings owned by GLib
1053///    that must not be modified or freed.
1054#[doc(alias = "g_get_language_names")]
1055#[doc(alias = "get_language_names")]
1056pub fn language_names() -> Vec<crate::GString> {
1057    unsafe { FromGlibPtrContainer::from_glib_none(ffi::g_get_language_names()) }
1058}
1059
1060/// Computes a list of applicable locale names with a locale category name,
1061/// which can be used to construct the fallback locale-dependent filenames
1062/// or search paths. The returned list is sorted from most desirable to
1063/// least desirable and always contains the default locale "C".
1064///
1065/// This function consults the environment variables `LANGUAGE`, `LC_ALL`,
1066/// @category_name, and `LANG` to find the list of locales specified by the
1067/// user.
1068///
1069/// g_get_language_names() returns g_get_language_names_with_category("LC_MESSAGES").
1070/// ## `category_name`
1071/// a locale category name
1072///
1073/// # Returns
1074///
1075/// a [`None`]-terminated array of strings owned by
1076///    the thread g_get_language_names_with_category was called from.
1077///    It must not be modified or freed. It must be copied if planned to be used in another thread.
1078#[cfg(feature = "v2_58")]
1079#[cfg_attr(docsrs, doc(cfg(feature = "v2_58")))]
1080#[doc(alias = "g_get_language_names_with_category")]
1081#[doc(alias = "get_language_names_with_category")]
1082pub fn language_names_with_category(category_name: &str) -> Vec<crate::GString> {
1083    unsafe {
1084        FromGlibPtrContainer::from_glib_none(ffi::g_get_language_names_with_category(
1085            category_name.to_glib_none().0,
1086        ))
1087    }
1088}
1089
1090/// Returns a list of derived variants of @locale, which can be used to
1091/// e.g. construct locale-dependent filenames or search paths. The returned
1092/// list is sorted from most desirable to least desirable.
1093/// This function handles territory, charset and extra locale modifiers. See
1094/// [`setlocale(3)`](man:setlocale) for information about locales and their format.
1095///
1096/// @locale itself is guaranteed to be returned in the output.
1097///
1098/// For example, if @locale is `fr_BE`, then the returned list
1099/// is `fr_BE`, `fr`. If @locale is `en_GB.UTF-8@euro`, then the returned list
1100/// is `en_GB.UTF-8@euro`, `en_GB.UTF-8`, `en_GB@euro`, `en_GB`, `en.UTF-8@euro`,
1101/// `en.UTF-8`, `en@euro`, `en`.
1102///
1103/// If you need the list of variants for the current locale,
1104/// use g_get_language_names().
1105/// ## `locale`
1106/// a locale identifier
1107///
1108/// # Returns
1109///
1110/// a newly
1111///   allocated array of newly allocated strings with the locale variants. Free with
1112///   g_strfreev().
1113#[doc(alias = "g_get_locale_variants")]
1114#[doc(alias = "get_locale_variants")]
1115pub fn locale_variants(locale: &str) -> Vec<crate::GString> {
1116    unsafe {
1117        FromGlibPtrContainer::from_glib_full(ffi::g_get_locale_variants(locale.to_glib_none().0))
1118    }
1119}
1120
1121/// Queries the system monotonic time in microseconds.
1122///
1123/// The monotonic clock will always increase and doesn’t suffer
1124/// discontinuities when the user (or NTP) changes the system time.  It
1125/// may or may not continue to tick during times where the machine is
1126/// suspended.
1127///
1128/// We try to use the clock that corresponds as closely as possible to
1129/// the passage of time as measured by system calls such as
1130/// [`poll()`](man:poll(2)) but it
1131/// may not always be possible to do this.
1132///
1133/// A more accurate version of this function exists.
1134/// [`monotonic_time_ns()`][crate::monotonic_time_ns()] returns the time in nanoseconds.
1135///
1136/// # Returns
1137///
1138/// the monotonic time, in microseconds
1139#[doc(alias = "g_get_monotonic_time")]
1140#[doc(alias = "get_monotonic_time")]
1141pub fn monotonic_time() -> i64 {
1142    unsafe { ffi::g_get_monotonic_time() }
1143}
1144
1145/// Queries the system monotonic time in nanoseconds.
1146///
1147/// The monotonic clock will always increase and doesn’t suffer
1148/// discontinuities when the user (or NTP) changes the system time.  It
1149/// may or may not continue to tick during times where the machine is
1150/// suspended.
1151///
1152/// We try to use the clock that corresponds as closely as possible to
1153/// the passage of time as measured by system calls such as
1154/// [`poll()`](man:poll(2)) but it
1155/// may not always be possible to do this.
1156///
1157/// Another version of this function exists.
1158/// [`monotonic_time()`][crate::monotonic_time()] returns the time in microseconds.
1159/// If you want to support older GLib versions, it is an alternative.
1160///
1161/// # Returns
1162///
1163/// the monotonic time, in nanoseconds
1164#[cfg(feature = "v2_88")]
1165#[cfg_attr(docsrs, doc(cfg(feature = "v2_88")))]
1166#[doc(alias = "g_get_monotonic_time_ns")]
1167#[doc(alias = "get_monotonic_time_ns")]
1168pub fn monotonic_time_ns() -> u64 {
1169    unsafe { ffi::g_get_monotonic_time_ns() }
1170}
1171
1172/// Determine the approximate number of threads that the system will
1173/// schedule simultaneously for this process.  This is intended to be
1174/// used as a parameter to g_thread_pool_new() for CPU bound tasks and
1175/// similar cases.
1176///
1177/// On platforms where enough information is known, this will be the number of
1178/// high performance cores and will not include low power ‘efficiency’ cores.
1179/// Use platform specific APIs to query for low power cores if needed.
1180///
1181/// # Returns
1182///
1183/// Number of schedulable threads, always greater than 0
1184#[doc(alias = "g_get_num_processors")]
1185#[doc(alias = "get_num_processors")]
1186pub fn num_processors() -> u32 {
1187    unsafe { ffi::g_get_num_processors() }
1188}
1189
1190/// Get information about the operating system.
1191///
1192/// On Linux this comes from the `/etc/os-release` file. On other systems, it may
1193/// come from a variety of sources. You can either use the standard key names
1194/// like `G_OS_INFO_KEY_NAME` or pass any UTF-8 string key name. For example,
1195/// `/etc/os-release` provides a number of other less commonly used values that may
1196/// be useful. No key is guaranteed to be provided, so the caller should always
1197/// check if the result is [`None`].
1198/// ## `key_name`
1199/// a key for the OS info being requested, for example `G_OS_INFO_KEY_NAME`.
1200///
1201/// # Returns
1202///
1203/// The associated value for the requested key or [`None`] if
1204///   this information is not provided.
1205#[cfg(feature = "v2_64")]
1206#[cfg_attr(docsrs, doc(cfg(feature = "v2_64")))]
1207#[doc(alias = "g_get_os_info")]
1208#[doc(alias = "get_os_info")]
1209pub fn os_info(key_name: &str) -> Option<crate::GString> {
1210    unsafe { from_glib_full(ffi::g_get_os_info(key_name.to_glib_none().0)) }
1211}
1212
1213/// Gets the real name of the user. This usually comes from the user's
1214/// entry in the `passwd` file. The encoding of the returned string is
1215/// system-defined. (On Windows, it is, however, always UTF-8.) If the
1216/// real user name cannot be determined, the string "Unknown" is
1217/// returned.
1218///
1219/// # Returns
1220///
1221/// the user's real name.
1222#[doc(alias = "g_get_real_name")]
1223#[doc(alias = "get_real_name")]
1224pub fn real_name() -> std::ffi::OsString {
1225    unsafe { from_glib_none(ffi::g_get_real_name()) }
1226}
1227
1228/// Queries the system wall-clock time.
1229///
1230/// This is equivalent to the UNIX [`gettimeofday()`](man:gettimeofday(2))
1231/// function, but portable.
1232///
1233/// You should only use this call if you are actually interested in the real
1234/// wall-clock time. [`monotonic_time()`][crate::monotonic_time()] is probably more useful for
1235/// measuring intervals.
1236///
1237/// # Returns
1238///
1239/// the number of microseconds since
1240///   [January 1, 1970 UTC](https://en.wikipedia.org/wiki/Unix_time)
1241#[doc(alias = "g_get_real_time")]
1242#[doc(alias = "get_real_time")]
1243pub fn real_time() -> i64 {
1244    unsafe { ffi::g_get_real_time() }
1245}
1246
1247/// Returns an ordered list of base directories in which to access
1248/// system-wide configuration information.
1249///
1250/// On UNIX platforms this is determined using the mechanisms described
1251/// in the
1252/// [XDG Base Directory Specification](http://www.freedesktop.org/Standards/basedir-spec).
1253/// In this case the list of directories retrieved will be `XDG_CONFIG_DIRS`.
1254///
1255/// On Windows it follows XDG Base Directory Specification if `XDG_CONFIG_DIRS` is defined.
1256/// If `XDG_CONFIG_DIRS` is undefined, the directory that contains application
1257/// data for all users is used instead. A typical path is
1258/// `C:\Documents and Settings\All Users\Application Data`.
1259/// This folder is used for application data
1260/// that is not user specific. For example, an application can store
1261/// a spell-check dictionary, a database of clip art, or a log file in the
1262/// FOLDERID_ProgramData folder. This information will not roam and is available
1263/// to anyone using the computer.
1264///
1265/// The return value is cached and modifying it at runtime is not supported, as
1266/// it’s not thread-safe to modify environment variables at runtime.
1267///
1268/// # Returns
1269///
1270///
1271///     a [`None`]-terminated array of strings owned by GLib that must not be
1272///     modified or freed.
1273#[doc(alias = "g_get_system_config_dirs")]
1274#[doc(alias = "get_system_config_dirs")]
1275pub fn system_config_dirs() -> Vec<std::path::PathBuf> {
1276    unsafe { FromGlibPtrContainer::from_glib_none(ffi::g_get_system_config_dirs()) }
1277}
1278
1279/// Returns an ordered list of base directories in which to access
1280/// system-wide application data.
1281///
1282/// On UNIX platforms this is determined using the mechanisms described
1283/// in the
1284/// [XDG Base Directory Specification](http://www.freedesktop.org/Standards/basedir-spec)
1285/// In this case the list of directories retrieved will be `XDG_DATA_DIRS`.
1286///
1287/// On Windows it follows XDG Base Directory Specification if `XDG_DATA_DIRS` is defined.
1288/// If `XDG_DATA_DIRS` is undefined,
1289/// the first elements in the list are the Application Data
1290/// and Documents folders for All Users. (These can be determined only
1291/// on Windows 2000 or later and are not present in the list on other
1292/// Windows versions.) See documentation for FOLDERID_ProgramData and
1293/// FOLDERID_PublicDocuments.
1294///
1295/// Then follows the "share" subfolder in the installation folder for
1296/// the package containing the DLL that calls this function, if it can
1297/// be determined.
1298///
1299/// Finally the list contains the "share" subfolder in the installation
1300/// folder for GLib, and in the installation folder for the package the
1301/// application's .exe file belongs to.
1302///
1303/// The installation folders above are determined by looking up the
1304/// folder where the module (DLL or EXE) in question is located. If the
1305/// folder's name is "bin", its parent is used, otherwise the folder
1306/// itself.
1307///
1308/// Note that on Windows the returned list can vary depending on where
1309/// this function is called.
1310///
1311/// The return value is cached and modifying it at runtime is not supported, as
1312/// it’s not thread-safe to modify environment variables at runtime.
1313///
1314/// # Returns
1315///
1316///
1317///     a [`None`]-terminated array of strings owned by GLib that must not be
1318///     modified or freed.
1319#[doc(alias = "g_get_system_data_dirs")]
1320#[doc(alias = "get_system_data_dirs")]
1321pub fn system_data_dirs() -> Vec<std::path::PathBuf> {
1322    unsafe { FromGlibPtrContainer::from_glib_none(ffi::g_get_system_data_dirs()) }
1323}
1324
1325/// Gets the directory to use for temporary files.
1326///
1327/// On UNIX, this is taken from the `TMPDIR` environment variable.
1328/// If the variable is not set, `P_tmpdir` is
1329/// used, as defined by the system C library. Failing that, a
1330/// hard-coded default of "/tmp" is returned.
1331///
1332/// On Windows, the `TEMP` environment variable is used, with the
1333/// root directory of the Windows installation (eg: "C:\") used
1334/// as a default.
1335///
1336/// The encoding of the returned string is system-defined. On Windows,
1337/// it is always UTF-8. The return value is never [`None`] or the empty
1338/// string.
1339///
1340/// # Returns
1341///
1342/// the directory to use for temporary files.
1343#[doc(alias = "g_get_tmp_dir")]
1344#[doc(alias = "get_tmp_dir")]
1345pub fn tmp_dir() -> std::path::PathBuf {
1346    unsafe { from_glib_none(ffi::g_get_tmp_dir()) }
1347}
1348
1349/// Returns a base directory in which to store non-essential, cached
1350/// data specific to particular user.
1351///
1352/// On UNIX platforms this is determined using the mechanisms described
1353/// in the
1354/// [XDG Base Directory Specification](http://www.freedesktop.org/Standards/basedir-spec).
1355/// In this case the directory retrieved will be `XDG_CACHE_HOME`.
1356///
1357/// On Windows it follows XDG Base Directory Specification if `XDG_CACHE_HOME` is defined.
1358/// If `XDG_CACHE_HOME` is undefined, the directory that serves as a common
1359/// repository for temporary Internet files is used instead. A typical path is
1360/// `C:\Documents and Settings\username\Local Settings\Temporary Internet Files`.
1361/// See the [documentation for `FOLDERID_InternetCache`](https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid).
1362///
1363/// The return value is cached and modifying it at runtime is not supported, as
1364/// it’s not thread-safe to modify environment variables at runtime.
1365///
1366/// # Returns
1367///
1368/// a string owned by GLib that
1369///   must not be modified or freed.
1370#[doc(alias = "g_get_user_cache_dir")]
1371#[doc(alias = "get_user_cache_dir")]
1372pub fn user_cache_dir() -> std::path::PathBuf {
1373    unsafe { from_glib_none(ffi::g_get_user_cache_dir()) }
1374}
1375
1376/// Returns a base directory in which to store user-specific application
1377/// configuration information such as user preferences and settings.
1378///
1379/// On UNIX platforms this is determined using the mechanisms described
1380/// in the
1381/// [XDG Base Directory Specification](http://www.freedesktop.org/Standards/basedir-spec).
1382/// In this case the directory retrieved will be `XDG_CONFIG_HOME`.
1383///
1384/// On Windows it follows XDG Base Directory Specification if `XDG_CONFIG_HOME` is defined.
1385/// If `XDG_CONFIG_HOME` is undefined, the folder to use for local (as opposed
1386/// to roaming) application data is used instead. See the
1387/// [documentation for `FOLDERID_LocalAppData`](https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid).
1388/// Note that in this case on Windows it will be  the same
1389/// as what g_get_user_data_dir() returns.
1390///
1391/// The return value is cached and modifying it at runtime is not supported, as
1392/// it’s not thread-safe to modify environment variables at runtime.
1393///
1394/// # Returns
1395///
1396/// a string owned by GLib that
1397///   must not be modified or freed.
1398#[doc(alias = "g_get_user_config_dir")]
1399#[doc(alias = "get_user_config_dir")]
1400pub fn user_config_dir() -> std::path::PathBuf {
1401    unsafe { from_glib_none(ffi::g_get_user_config_dir()) }
1402}
1403
1404/// Returns a base directory in which to access application data such
1405/// as icons that is customized for a particular user.
1406///
1407/// On UNIX platforms this is determined using the mechanisms described
1408/// in the
1409/// [XDG Base Directory Specification](http://www.freedesktop.org/Standards/basedir-spec).
1410/// In this case the directory retrieved will be `XDG_DATA_HOME`.
1411///
1412/// On Windows it follows XDG Base Directory Specification if `XDG_DATA_HOME`
1413/// is defined. If `XDG_DATA_HOME` is undefined, the folder to use for local (as
1414/// opposed to roaming) application data is used instead. See the
1415/// [documentation for `FOLDERID_LocalAppData`](https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid).
1416/// Note that in this case on Windows it will be the same
1417/// as what g_get_user_config_dir() returns.
1418///
1419/// The return value is cached and modifying it at runtime is not supported, as
1420/// it’s not thread-safe to modify environment variables at runtime.
1421///
1422/// # Returns
1423///
1424/// a string owned by GLib that must
1425///   not be modified or freed.
1426#[doc(alias = "g_get_user_data_dir")]
1427#[doc(alias = "get_user_data_dir")]
1428pub fn user_data_dir() -> std::path::PathBuf {
1429    unsafe { from_glib_none(ffi::g_get_user_data_dir()) }
1430}
1431
1432/// Gets the user name of the current user. The encoding of the returned
1433/// string is system-defined. On UNIX, it might be the preferred file name
1434/// encoding, or something else, and there is no guarantee that it is even
1435/// consistent on a machine. On Windows, it is always UTF-8.
1436///
1437/// # Returns
1438///
1439/// the user name of the current user.
1440#[doc(alias = "g_get_user_name")]
1441#[doc(alias = "get_user_name")]
1442pub fn user_name() -> std::ffi::OsString {
1443    unsafe { from_glib_none(ffi::g_get_user_name()) }
1444}
1445
1446/// Returns a directory that is unique to the current user on the local
1447/// system.
1448///
1449/// This is determined using the mechanisms described
1450/// in the
1451/// [XDG Base Directory Specification](http://www.freedesktop.org/Standards/basedir-spec).
1452/// This is the directory
1453/// specified in the `XDG_RUNTIME_DIR` environment variable.
1454/// In the case that this variable is not set, we return the value of
1455/// g_get_user_cache_dir(), after verifying that it exists.
1456///
1457/// The return value is cached and modifying it at runtime is not supported, as
1458/// it’s not thread-safe to modify environment variables at runtime.
1459///
1460/// # Returns
1461///
1462/// a string owned by GLib that must not be
1463///     modified or freed.
1464#[doc(alias = "g_get_user_runtime_dir")]
1465#[doc(alias = "get_user_runtime_dir")]
1466pub fn user_runtime_dir() -> std::path::PathBuf {
1467    unsafe { from_glib_none(ffi::g_get_user_runtime_dir()) }
1468}
1469
1470/// Returns the full path of a special directory using its logical id.
1471///
1472/// On UNIX this is done using the XDG special user directories.
1473/// For compatibility with existing practise, [`UserDirectory::DirectoryDesktop`][crate::UserDirectory::DirectoryDesktop]
1474/// falls back to `$HOME/Desktop` when XDG special user directories have
1475/// not been set up.
1476///
1477/// Depending on the platform, the user might be able to change the path
1478/// of the special directory without requiring the session to restart; GLib
1479/// will not reflect any change once the special directories are loaded.
1480/// ## `directory`
1481/// the logical id of special directory
1482///
1483/// # Returns
1484///
1485/// the path to the specified special
1486///   directory, or [`None`] if the logical id was not found. The returned string is
1487///   owned by GLib and should not be modified or freed.
1488#[doc(alias = "g_get_user_special_dir")]
1489#[doc(alias = "get_user_special_dir")]
1490pub fn user_special_dir(directory: UserDirectory) -> Option<std::path::PathBuf> {
1491    unsafe { from_glib_none(ffi::g_get_user_special_dir(directory.into_glib())) }
1492}
1493
1494/// Returns a base directory in which to store state files specific to
1495/// particular user.
1496///
1497/// On UNIX platforms this is determined using the mechanisms described
1498/// in the
1499/// [XDG Base Directory Specification](http://www.freedesktop.org/Standards/basedir-spec).
1500/// In this case the directory retrieved will be `XDG_STATE_HOME`.
1501///
1502/// On Windows it follows XDG Base Directory Specification if `XDG_STATE_HOME` is defined.
1503/// If `XDG_STATE_HOME` is undefined, the folder to use for local (as opposed
1504/// to roaming) application data is used instead. See the
1505/// [documentation for `FOLDERID_LocalAppData`](https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid).
1506/// Note that in this case on Windows it will be the same
1507/// as what g_get_user_data_dir() returns.
1508///
1509/// The return value is cached and modifying it at runtime is not supported, as
1510/// it’s not thread-safe to modify environment variables at runtime.
1511///
1512/// # Returns
1513///
1514/// a string owned by GLib that
1515///   must not be modified or freed.
1516#[cfg(feature = "v2_72")]
1517#[cfg_attr(docsrs, doc(cfg(feature = "v2_72")))]
1518#[doc(alias = "g_get_user_state_dir")]
1519#[doc(alias = "get_user_state_dir")]
1520pub fn user_state_dir() -> std::path::PathBuf {
1521    unsafe { from_glib_none(ffi::g_get_user_state_dir()) }
1522}
1523
1524/// Returns the value of an environment variable.
1525///
1526/// On UNIX, the name and value are byte strings which might or might not
1527/// be in some consistent character set and encoding. On Windows, they are
1528/// in UTF-8.
1529/// On Windows, in case the environment variable's value contains
1530/// references to other environment variables, they are expanded.
1531/// ## `variable`
1532/// the environment variable to get
1533///
1534/// # Returns
1535///
1536/// the value of the environment variable, or [`None`] if
1537///     the environment variable is not found. The returned string
1538///     may be overwritten by the next call to g_getenv(), g_setenv()
1539///     or g_unsetenv().
1540#[doc(alias = "g_getenv")]
1541pub fn getenv(variable: impl AsRef<std::ffi::OsStr>) -> Option<std::ffi::OsString> {
1542    unsafe { from_glib_none(ffi::g_getenv(variable.as_ref().to_glib_none().0)) }
1543}
1544
1545/// Tests if @hostname contains segments with an ASCII-compatible
1546/// encoding of an Internationalized Domain Name. If this returns
1547/// [`true`], you should decode the hostname with g_hostname_to_unicode()
1548/// before displaying it to the user.
1549///
1550/// Note that a hostname might contain a mix of encoded and unencoded
1551/// segments, and so it is possible for g_hostname_is_non_ascii() and
1552/// g_hostname_is_ascii_encoded() to both return [`true`] for a name.
1553/// ## `hostname`
1554/// a hostname
1555///
1556/// # Returns
1557///
1558/// [`true`] if @hostname contains any ASCII-encoded
1559/// segments.
1560#[doc(alias = "g_hostname_is_ascii_encoded")]
1561pub fn hostname_is_ascii_encoded(hostname: &str) -> bool {
1562    unsafe { from_glib(ffi::g_hostname_is_ascii_encoded(hostname.to_glib_none().0)) }
1563}
1564
1565/// Tests if @hostname is the string form of an IPv4 or IPv6 address.
1566/// (Eg, "192.168.0.1".)
1567///
1568/// Since 2.66, IPv6 addresses with a zone-id are accepted (RFC6874).
1569/// ## `hostname`
1570/// a hostname (or IP address in string form)
1571///
1572/// # Returns
1573///
1574/// [`true`] if @hostname is an IP address
1575#[doc(alias = "g_hostname_is_ip_address")]
1576pub fn hostname_is_ip_address(hostname: &str) -> bool {
1577    unsafe { from_glib(ffi::g_hostname_is_ip_address(hostname.to_glib_none().0)) }
1578}
1579
1580/// Tests if @hostname contains Unicode characters. If this returns
1581/// [`true`], you need to encode the hostname with g_hostname_to_ascii()
1582/// before using it in non-IDN-aware contexts.
1583///
1584/// Note that a hostname might contain a mix of encoded and unencoded
1585/// segments, and so it is possible for g_hostname_is_non_ascii() and
1586/// g_hostname_is_ascii_encoded() to both return [`true`] for a name.
1587/// ## `hostname`
1588/// a hostname
1589///
1590/// # Returns
1591///
1592/// [`true`] if @hostname contains any non-ASCII characters
1593#[doc(alias = "g_hostname_is_non_ascii")]
1594pub fn hostname_is_non_ascii(hostname: &str) -> bool {
1595    unsafe { from_glib(ffi::g_hostname_is_non_ascii(hostname.to_glib_none().0)) }
1596}
1597
1598/// Converts @hostname to its canonical ASCII form; an ASCII-only
1599/// string containing no uppercase letters and not ending with a
1600/// trailing dot.
1601/// ## `hostname`
1602/// a valid UTF-8 or ASCII hostname
1603///
1604/// # Returns
1605///
1606/// an ASCII hostname, which must be freed,
1607///    or [`None`] if @hostname is in some way invalid.
1608#[doc(alias = "g_hostname_to_ascii")]
1609pub fn hostname_to_ascii(hostname: &str) -> Option<crate::GString> {
1610    unsafe { from_glib_full(ffi::g_hostname_to_ascii(hostname.to_glib_none().0)) }
1611}
1612
1613/// Converts @hostname to its canonical presentation form; a UTF-8
1614/// string in Unicode normalization form C, containing no uppercase
1615/// letters, no forbidden characters, and no ASCII-encoded segments,
1616/// and not ending with a trailing dot.
1617///
1618/// Of course if @hostname is not an internationalized hostname, then
1619/// the canonical presentation form will be entirely ASCII.
1620/// ## `hostname`
1621/// a valid UTF-8 or ASCII hostname
1622///
1623/// # Returns
1624///
1625/// a UTF-8 hostname, which must be freed,
1626///    or [`None`] if @hostname is in some way invalid.
1627#[doc(alias = "g_hostname_to_unicode")]
1628pub fn hostname_to_unicode(hostname: &str) -> Option<crate::GString> {
1629    unsafe { from_glib_full(ffi::g_hostname_to_unicode(hostname.to_glib_none().0)) }
1630}
1631
1632/// Gets the names of all variables set in the environment.
1633///
1634/// Programs that want to be portable to Windows should typically use
1635/// this function and g_getenv() instead of using the environ array
1636/// from the C library directly. On Windows, the strings in the environ
1637/// array are in system codepage encoding, while in most of the typical
1638/// use cases for environment variables in GLib-using programs you want
1639/// the UTF-8 encoding that this function and g_getenv() provide.
1640///
1641/// # Returns
1642///
1643///
1644///     a [`None`]-terminated list of strings which must be freed with
1645///     g_strfreev().
1646#[doc(alias = "g_listenv")]
1647pub fn listenv() -> Vec<std::ffi::OsString> {
1648    unsafe { FromGlibPtrContainer::from_glib_full(ffi::g_listenv()) }
1649}
1650
1651/// Returns the currently firing source for this thread.
1652///
1653/// # Returns
1654///
1655/// the currently firing source, or `NULL`
1656///   if none is firing
1657#[doc(alias = "g_main_current_source")]
1658pub fn main_current_source() -> Option<Source> {
1659    unsafe { from_glib_none(ffi::g_main_current_source()) }
1660}
1661
1662/// Returns the depth of the stack of calls to
1663/// [`MainContext::dispatch()`][crate::MainContext::dispatch()] on any #GMainContext in the current thread.
1664///
1665/// That is, when called from the top level, it gives `0`. When
1666/// called from within a callback from [`MainContext::iteration()`][crate::MainContext::iteration()]
1667/// (or [`MainLoop::run()`][crate::MainLoop::run()], etc.) it returns `1`. When called from within
1668/// a callback to a recursive call to [`MainContext::iteration()`][crate::MainContext::iteration()],
1669/// it returns `2`. And so forth.
1670///
1671/// This function is useful in a situation like the following:
1672/// Imagine an extremely simple ‘garbage collected’ system.
1673///
1674/// **⚠️ The following code is in c ⚠️**
1675///
1676/// ```c
1677/// static GList *free_list;
1678///
1679/// gpointer
1680/// allocate_memory (gsize size)
1681/// {
1682///   gpointer result = g_malloc (size);
1683///   free_list = g_list_prepend (free_list, result);
1684///   return result;
1685/// }
1686///
1687/// void
1688/// free_allocated_memory (void)
1689/// {
1690///   GList *l;
1691///   for (l = free_list; l; l = l->next);
1692///     g_free (l->data);
1693///   g_list_free (free_list);
1694///   free_list = NULL;
1695///  }
1696///
1697/// [...]
1698///
1699/// while (TRUE);
1700///  {
1701///    g_main_context_iteration (NULL, TRUE);
1702///    free_allocated_memory();
1703///   }
1704/// ```
1705///
1706/// This works from an application, however, if you want to do the same
1707/// thing from a library, it gets more difficult, since you no longer
1708/// control the main loop. You might think you can simply use an idle
1709/// function to make the call to `free_allocated_memory()`, but that
1710/// doesn’t work, since the idle function could be called from a
1711/// recursive callback. This can be fixed by using [`main_depth()`][crate::main_depth()]
1712///
1713/// **⚠️ The following code is in c ⚠️**
1714///
1715/// ```c
1716/// gpointer
1717/// allocate_memory (gsize size)
1718/// {
1719///   FreeListBlock *block = g_new (FreeListBlock, 1);
1720///   block->mem = g_malloc (size);
1721///   block->depth = g_main_depth ();
1722///   free_list = g_list_prepend (free_list, block);
1723///   return block->mem;
1724/// }
1725///
1726/// void
1727/// free_allocated_memory (void)
1728/// {
1729///   GList *l;
1730///
1731///   int depth = g_main_depth ();
1732///   for (l = free_list; l; );
1733///     {
1734///       GList *next = l->next;
1735///       FreeListBlock *block = l->data;
1736///       if (block->depth > depth)
1737///         {
1738///           g_free (block->mem);
1739///           g_free (block);
1740///           free_list = g_list_delete_link (free_list, l);
1741///         }
1742///
1743///       l = next;
1744///     }
1745///   }
1746/// ```
1747///
1748/// There is a temptation to use [`main_depth()`][crate::main_depth()] to solve
1749/// problems with reentrancy. For instance, while waiting for data
1750/// to be received from the network in response to a menu item,
1751/// the menu item might be selected again. It might seem that
1752/// one could make the menu item’s callback return immediately
1753/// and do nothing if [`main_depth()`][crate::main_depth()] returns a value greater than 1.
1754/// However, this should be avoided since the user then sees selecting
1755/// the menu item do nothing. Furthermore, you’ll find yourself adding
1756/// these checks all over your code, since there are doubtless many,
1757/// many things that the user could do. Instead, you can use the
1758/// following techniques:
1759///
1760/// 1. Use `gtk_widget_set_sensitive()` or modal dialogs to prevent
1761///    the user from interacting with elements while the main
1762///    loop is recursing.
1763///
1764/// 2. Avoid main loop recursion in situations where you can’t handle
1765///    arbitrary  callbacks. Instead, structure your code so that you
1766///    simply return to the main loop and then get called again when
1767///    there is more work to do.
1768///
1769/// # Returns
1770///
1771/// the main loop recursion level in the current thread
1772#[doc(alias = "g_main_depth")]
1773pub fn main_depth() -> i32 {
1774    unsafe { ffi::g_main_depth() }
1775}
1776
1777/// Escapes text so that the markup parser will parse it verbatim.
1778/// Less than, greater than, ampersand, etc. are replaced with the
1779/// corresponding entities. This function would typically be used
1780/// when writing out a file to be parsed with the markup parser.
1781///
1782/// Note that this function doesn't protect whitespace and line endings
1783/// from being processed according to the XML rules for normalization
1784/// of line endings and attribute values.
1785///
1786/// Note also that this function will produce character references in
1787/// the range of &#x1; ... &#x1f; for all control sequences
1788/// except for tabstop, newline and carriage return.  The character
1789/// references in this range are not valid XML 1.0, but they are
1790/// valid XML 1.1 and will be accepted by the GMarkup parser.
1791/// ## `text`
1792/// some valid UTF-8 text
1793/// ## `length`
1794/// length of @text in bytes, or -1 if the text is nul-terminated
1795///
1796/// # Returns
1797///
1798/// a newly allocated string with the escaped text
1799#[doc(alias = "g_markup_escape_text")]
1800pub fn markup_escape_text(text: &str) -> crate::GString {
1801    let length = text.len() as _;
1802    unsafe { from_glib_full(ffi::g_markup_escape_text(text.to_glib_none().0, length)) }
1803}
1804
1805/// Create a directory if it doesn't already exist. Create intermediate
1806/// parent directories as needed, too.
1807/// ## `pathname`
1808/// a pathname in the GLib file name encoding
1809/// ## `mode`
1810/// permissions to use for newly created directories
1811///
1812/// # Returns
1813///
1814/// 0 if the directory already exists, or was successfully
1815/// created. Returns -1 if an error occurred, with errno set.
1816#[doc(alias = "g_mkdir_with_parents")]
1817pub fn mkdir_with_parents(pathname: impl AsRef<std::path::Path>, mode: i32) -> i32 {
1818    unsafe { ffi::g_mkdir_with_parents(pathname.as_ref().to_glib_none().0, mode) }
1819}
1820
1821/// Prompts the user with
1822/// `[E]xit, [H]alt, show [S]tack trace or [P]roceed`.
1823/// This function is intended to be used for debugging use only.
1824/// The following example shows how it can be used together with
1825/// the g_log() functions.
1826///
1827///
1828///
1829/// **⚠️ The following code is in C ⚠️**
1830///
1831/// ```C
1832/// #include <glib.h>
1833///
1834/// static void
1835/// log_handler (const gchar   *log_domain,
1836///              GLogLevelFlags log_level,
1837///              const gchar   *message,
1838///              gpointer       user_data)
1839/// {
1840///   g_log_default_handler (log_domain, log_level, message, user_data);
1841///
1842///   g_on_error_query (MY_PROGRAM_NAME);
1843/// }
1844///
1845/// int
1846/// main (int argc, char *argv[])
1847/// {
1848///   g_log_set_handler (MY_LOG_DOMAIN,
1849///                      G_LOG_LEVEL_WARNING |
1850///                      G_LOG_LEVEL_ERROR |
1851///                      G_LOG_LEVEL_CRITICAL,
1852///                      log_handler,
1853///                      NULL);
1854///   ...
1855/// ```
1856///
1857/// If "[E]xit" is selected, the application terminates with a call
1858/// to _exit(0).
1859///
1860/// If "[S]tack" trace is selected, g_on_error_stack_trace() is called.
1861/// This invokes gdb, which attaches to the current process and shows
1862/// a stack trace. The prompt is then shown again.
1863///
1864/// If "[P]roceed" is selected, the function returns.
1865///
1866/// This function may cause different actions on non-UNIX platforms.
1867///
1868/// On Windows consider using the `G_DEBUGGER` environment
1869/// variable (see [Running GLib Applications](running.html)) and
1870/// calling g_on_error_stack_trace() instead.
1871/// ## `prg_name`
1872/// the program name, needed by gdb for the "[S]tack trace"
1873///     option. If @prg_name is [`None`], g_get_prgname() is called to get
1874///     the program name (which will work correctly if gdk_init() or
1875///     gtk_init() has been called)
1876#[doc(alias = "g_on_error_query")]
1877pub fn on_error_query(prg_name: &str) {
1878    unsafe {
1879        ffi::g_on_error_query(prg_name.to_glib_none().0);
1880    }
1881}
1882
1883/// Invokes gdb, which attaches to the current process and shows a
1884/// stack trace. Called by g_on_error_query() when the "[S]tack trace"
1885/// option is selected. You can get the current process's program name
1886/// with g_get_prgname(), assuming that you have called gtk_init() or
1887/// gdk_init().
1888///
1889/// This function may cause different actions on non-UNIX platforms.
1890///
1891/// When running on Windows, this function is *not* called by
1892/// g_on_error_query(). If called directly, it will raise an
1893/// exception, which will crash the program. If the `G_DEBUGGER` environment
1894/// variable is set, a debugger will be invoked to attach and
1895/// handle that exception (see [Running GLib Applications](running.html)).
1896/// ## `prg_name`
1897/// the program name, needed by gdb for the
1898///   "[S]tack trace" option, or `NULL` to use a default string
1899#[doc(alias = "g_on_error_stack_trace")]
1900pub fn on_error_stack_trace(prg_name: Option<&str>) {
1901    unsafe {
1902        ffi::g_on_error_stack_trace(prg_name.to_glib_none().0);
1903    }
1904}
1905
1906/// Gets the last component of the filename.
1907///
1908/// If @file_name ends with a directory separator it gets the component
1909/// before the last slash. If @file_name consists only of directory
1910/// separators (and on Windows, possibly a drive letter), a single
1911/// separator is returned. If @file_name is empty, it gets ".".
1912/// ## `file_name`
1913/// the name of the file
1914///
1915/// # Returns
1916///
1917/// a newly allocated string
1918///   containing the last component of the filename
1919#[doc(alias = "g_path_get_basename")]
1920#[allow(dead_code)]
1921pub(crate) fn path_get_basename(file_name: impl AsRef<std::path::Path>) -> std::path::PathBuf {
1922    unsafe {
1923        from_glib_full(ffi::g_path_get_basename(
1924            file_name.as_ref().to_glib_none().0,
1925        ))
1926    }
1927}
1928
1929/// Gets the directory components of a file name. For example, the directory
1930/// component of `/usr/bin/test` is `/usr/bin`. The directory component of `/`
1931/// is `/`.
1932///
1933/// If the file name has no directory components "." is returned.
1934/// The returned string should be freed when no longer needed.
1935/// ## `file_name`
1936/// the name of the file
1937///
1938/// # Returns
1939///
1940/// the directory components of the file
1941#[doc(alias = "g_path_get_dirname")]
1942#[allow(dead_code)]
1943pub(crate) fn path_get_dirname(file_name: impl AsRef<std::path::Path>) -> std::path::PathBuf {
1944    unsafe { from_glib_full(ffi::g_path_get_dirname(file_name.as_ref().to_glib_none().0)) }
1945}
1946
1947//#[doc(alias = "g_poll")]
1948//pub fn poll(fds: /*Ignored*/&mut PollFD, nfds: u32, timeout: i32) -> i32 {
1949//    unsafe { TODO: call ffi:g_poll() }
1950//}
1951
1952/// Returns a random #gdouble equally distributed over the range [0..1).
1953///
1954/// # Returns
1955///
1956/// a random number
1957#[doc(alias = "g_random_double")]
1958pub fn random_double() -> f64 {
1959    unsafe { ffi::g_random_double() }
1960}
1961
1962/// Returns a random #gdouble equally distributed over the range
1963/// [@begin..@end).
1964/// ## `begin`
1965/// lower closed bound of the interval
1966/// ## `end`
1967/// upper open bound of the interval
1968///
1969/// # Returns
1970///
1971/// a random number
1972#[doc(alias = "g_random_double_range")]
1973pub fn random_double_range(begin: f64, end: f64) -> f64 {
1974    unsafe { ffi::g_random_double_range(begin, end) }
1975}
1976
1977/// Return a random #guint32 equally distributed over the range
1978/// [0..2^32-1].
1979///
1980/// # Returns
1981///
1982/// a random number
1983#[doc(alias = "g_random_int")]
1984pub fn random_int() -> u32 {
1985    unsafe { ffi::g_random_int() }
1986}
1987
1988/// Returns a random #gint32 equally distributed over the range
1989/// [@begin..@end-1].
1990/// ## `begin`
1991/// lower closed bound of the interval
1992/// ## `end`
1993/// upper open bound of the interval
1994///
1995/// # Returns
1996///
1997/// a random number
1998#[doc(alias = "g_random_int_range")]
1999pub fn random_int_range(begin: i32, end: i32) -> i32 {
2000    unsafe { ffi::g_random_int_range(begin, end) }
2001}
2002
2003/// Sets the seed for the global random number generator, which is used
2004/// by the g_random_* functions, to @seed.
2005/// ## `seed`
2006/// a value to reinitialize the global random number generator
2007#[doc(alias = "g_random_set_seed")]
2008pub fn random_set_seed(seed: u32) {
2009    unsafe {
2010        ffi::g_random_set_seed(seed);
2011    }
2012}
2013
2014/// Resets the cache used for g_get_user_special_dir(), so
2015/// that the latest on-disk version is used. Call this only
2016/// if you just changed the data on disk yourself.
2017///
2018/// Due to thread safety issues this may cause leaking of strings
2019/// that were previously returned from g_get_user_special_dir()
2020/// that can't be freed. We ensure to only leak the data for
2021/// the directories that actually changed value though.
2022#[doc(alias = "g_reload_user_special_dirs_cache")]
2023pub fn reload_user_special_dirs_cache() {
2024    unsafe {
2025        ffi::g_reload_user_special_dirs_cache();
2026    }
2027}
2028
2029/// Sets a human-readable name for the application. This name should be
2030/// localized if possible, and is intended for display to the user.
2031/// Contrast with g_set_prgname(), which sets a non-localized name.
2032/// g_set_prgname() will be called automatically by gtk_init(),
2033/// but g_set_application_name() will not.
2034///
2035/// Note that for thread safety reasons, this function can only
2036/// be called once.
2037///
2038/// The application name will be used in contexts such as error messages,
2039/// or when displaying an application's name in the task list.
2040/// ## `application_name`
2041/// localized name of the application
2042#[doc(alias = "g_set_application_name")]
2043pub fn set_application_name(application_name: &str) {
2044    unsafe {
2045        ffi::g_set_application_name(application_name.to_glib_none().0);
2046    }
2047}
2048
2049/// Sets an environment variable. On UNIX, both the variable's name and
2050/// value can be arbitrary byte strings, except that the variable's name
2051/// cannot contain '='. On Windows, they should be in UTF-8.
2052///
2053/// Note that on some systems, when variables are overwritten, the memory
2054/// used for the previous variables and its value isn't reclaimed.
2055///
2056/// You should be mindful of the fact that environment variable handling
2057/// in UNIX is not thread-safe, and your program may crash if one thread
2058/// calls g_setenv() while another thread is calling getenv(). (And note
2059/// that many functions, such as gettext(), call getenv() internally.)
2060/// This function is only safe to use at the very start of your program,
2061/// before creating any other threads (or creating objects that create
2062/// worker threads of their own).
2063///
2064/// If you need to set up the environment for a child process, you can
2065/// use g_get_environ() to get an environment array, modify that with
2066/// g_environ_setenv() and g_environ_unsetenv(), and then pass that
2067/// array directly to execvpe(), g_spawn_async(), or the like.
2068/// ## `variable`
2069/// the environment variable to set, must not
2070///     contain '='.
2071/// ## `value`
2072/// the value for to set the variable to.
2073/// ## `overwrite`
2074/// whether to change the variable if it already exists.
2075///
2076/// # Returns
2077///
2078/// [`false`] if the environment variable couldn't be set.
2079#[doc(alias = "g_setenv")]
2080pub unsafe fn setenv(
2081    variable: impl AsRef<std::ffi::OsStr>,
2082    value: impl AsRef<std::ffi::OsStr>,
2083    overwrite: bool,
2084) -> Result<(), crate::error::BoolError> {
2085    unsafe {
2086        crate::result_from_gboolean!(
2087            ffi::g_setenv(
2088                variable.as_ref().to_glib_none().0,
2089                value.as_ref().to_glib_none().0,
2090                overwrite.into_glib()
2091            ),
2092            "Failed to set environment variable"
2093        )
2094    }
2095}
2096
2097/// Parses a command line into an argument vector, in much the same way
2098/// the shell would, but without many of the expansions the shell would
2099/// perform (variable expansion, globs, operators, filename expansion,
2100/// etc. are not supported).
2101///
2102/// The results are defined to be the same as those you would get from
2103/// a UNIX98 `/bin/sh`, as long as the input contains none of the
2104/// unsupported shell expansions. If the input does contain such expansions,
2105/// they are passed through literally.
2106///
2107/// Possible errors are those from the `G_SHELL_ERROR` domain.
2108///
2109/// In particular, if @command_line is an empty string (or a string containing
2110/// only whitespace), `G_SHELL_ERROR_EMPTY_STRING` will be returned. It’s
2111/// guaranteed that @argvp will be a non-empty array if this function returns
2112/// successfully.
2113///
2114/// When constructing @command_line, quote any filenames or potentially
2115/// untrusted input using [`shell_quote()`][crate::shell_quote()].
2116///
2117/// Free the returned vector with g_strfreev().
2118/// ## `command_line`
2119/// command line to parse
2120///
2121/// # Returns
2122///
2123/// [`true`] on success, [`false`] if error set
2124///
2125/// ## `argvp`
2126///
2127///   return location for array of args
2128#[doc(alias = "g_shell_parse_argv")]
2129pub fn shell_parse_argv(
2130    command_line: impl AsRef<std::ffi::OsStr>,
2131) -> Result<Vec<std::ffi::OsString>, crate::Error> {
2132    unsafe {
2133        let mut argcp = std::mem::MaybeUninit::uninit();
2134        let mut argvp = std::ptr::null_mut();
2135        let mut error = std::ptr::null_mut();
2136        let is_ok = ffi::g_shell_parse_argv(
2137            command_line.as_ref().to_glib_none().0,
2138            argcp.as_mut_ptr(),
2139            &mut argvp,
2140            &mut error,
2141        );
2142        debug_assert_eq!(is_ok == crate::ffi::GFALSE, !error.is_null());
2143        if error.is_null() {
2144            Ok(FromGlibContainer::from_glib_full_num(
2145                argvp,
2146                argcp.assume_init() as _,
2147            ))
2148        } else {
2149            Err(from_glib_full(error))
2150        }
2151    }
2152}
2153
2154/// Quotes a string so that the shell (/bin/sh) will interpret the
2155/// quoted string to mean @unquoted_string.
2156///
2157/// If you pass a filename or other untrusted input to [`shell_parse_argv()`][crate::shell_parse_argv()],
2158/// you should first quote it with this function. This is sufficient to ensure
2159/// untrusted input cannot ‘break out’ of the quotes. Beware: this only works
2160/// because [`shell_parse_argv()`][crate::shell_parse_argv()] is not a real Unix shell. Quoting untrusted
2161/// input is not an adequate security mechanism when using a real shell.
2162///
2163/// The return value must be freed with g_free().
2164///
2165/// The quoting style used is undefined (single or double quotes may be
2166/// used).
2167/// ## `unquoted_string`
2168/// a literal string
2169///
2170/// # Returns
2171///
2172/// quoted string
2173#[doc(alias = "g_shell_quote")]
2174pub fn shell_quote(unquoted_string: impl AsRef<std::ffi::OsStr>) -> std::ffi::OsString {
2175    unsafe {
2176        from_glib_full(ffi::g_shell_quote(
2177            unquoted_string.as_ref().to_glib_none().0,
2178        ))
2179    }
2180}
2181
2182/// Unquotes a string as the shell (/bin/sh) would.
2183///
2184/// This function only handles quotes; if a string contains file globs,
2185/// arithmetic operators, variables, backticks, redirections, or other
2186/// special-to-the-shell features, the result will be different from the
2187/// result a real shell would produce (the variables, backticks, etc.
2188/// will be passed through literally instead of being expanded).
2189///
2190/// This function is guaranteed to succeed if applied to the result of
2191/// g_shell_quote(). If it fails, it returns [`None`] and sets the
2192/// error.
2193///
2194/// The @quoted_string need not actually contain quoted or escaped text;
2195/// g_shell_unquote() simply goes through the string and unquotes/unescapes
2196/// anything that the shell would. Both single and double quotes are
2197/// handled, as are escapes including escaped newlines.
2198///
2199/// The return value must be freed with g_free().
2200///
2201/// Possible errors are in the `G_SHELL_ERROR` domain.
2202///
2203/// Shell quoting rules are a bit strange. Single quotes preserve the
2204/// literal string exactly. escape sequences are not allowed; not even
2205/// `\'` - if you want a `'` in the quoted text, you have to do something
2206/// like `'foo'\''bar'`. Double quotes allow `$`, **⚠️ The following code is in , `"`, `\`, and ⚠️**
2207///
2208/// ```, `"`, `\`, and
2209/// newline to be escaped with backslash. Otherwise double quotes
2210/// preserve things literally.
2211/// ## `quoted_string`
2212/// shell-quoted string
2213///
2214/// # Returns
2215///
2216/// an unquoted string
2217#[doc(alias = "g_shell_unquote")]
2218pub fn shell_unquote(
2219    quoted_string: impl AsRef<std::ffi::OsStr>,
2220) -> Result<std::ffi::OsString, crate::Error> {
2221    unsafe {
2222        let mut error = std::ptr::null_mut();
2223        let ret = ffi::g_shell_unquote(quoted_string.as_ref().to_glib_none().0, &mut error);
2224        if error.is_null() {
2225            Ok(from_glib_full(ret))
2226        } else {
2227            Err(from_glib_full(error))
2228        }
2229    }
2230}
2231
2232//#[cfg(feature = "v2_82")]
2233//#[cfg_attr(docsrs, doc(cfg(feature = "v2_82")))]
2234//#[doc(alias = "g_sort_array")]
2235//pub fn sort_array(array: /*Unimplemented*/&[&Basic: Pointer], element_size: usize, compare_func: /*Unimplemented*/FnMut(/*Unimplemented*/Option<Basic: Pointer>, /*Unimplemented*/Option<Basic: Pointer>) -> i32, user_data: /*Unimplemented*/Option<Basic: Pointer>) {
2236//    unsafe { TODO: call ffi:g_sort_array() }
2237//}
2238
2239/// Gets the smallest prime number from a built-in array of primes which
2240/// is larger than @num. This is used within GLib to calculate the optimum
2241/// size of a #GHashTable.
2242///
2243/// The built-in array of primes ranges from 11 to 13845163 such that
2244/// each prime is approximately 1.5-2 times the previous prime.
2245/// ## `num`
2246/// a #guint
2247///
2248/// # Returns
2249///
2250/// the smallest prime number from a built-in array of primes
2251///     which is larger than @num
2252#[doc(alias = "g_spaced_primes_closest")]
2253pub fn spaced_primes_closest(num: u32) -> u32 {
2254    unsafe { ffi::g_spaced_primes_closest(num) }
2255}
2256
2257/// Executes a child program asynchronously.
2258///
2259/// See g_spawn_async_with_pipes_and_fds() for a full description; this function
2260/// simply calls the g_spawn_async_with_pipes() without any pipes, which in turn
2261/// calls g_spawn_async_with_pipes_and_fds().
2262///
2263/// You should call g_spawn_close_pid() on the returned child process
2264/// reference when you don't need it any more.
2265///
2266/// If you are writing a GTK application, and the program you are spawning is a
2267/// graphical application too, then to ensure that the spawned program opens its
2268/// windows on the right screen, you may want to use #GdkAppLaunchContext,
2269/// #GAppLaunchContext, or set the `DISPLAY` environment variable.
2270///
2271/// Note that the returned @child_pid on Windows is a handle to the child
2272/// process and not its identifier. Process handles and process identifiers
2273/// are different concepts on Windows.
2274/// ## `working_directory`
2275/// child's current working
2276///     directory, or [`None`] to inherit parent's
2277/// ## `argv`
2278///
2279///     child's argument vector
2280/// ## `envp`
2281///
2282///     child's environment, or [`None`] to inherit parent's
2283/// ## `flags`
2284/// flags from #GSpawnFlags
2285/// ## `child_setup`
2286/// function to run
2287///     in the child just before `exec()`
2288///
2289/// # Returns
2290///
2291/// [`true`] on success, [`false`] if error is set
2292///
2293/// ## `child_pid`
2294/// return location for child process reference, or [`None`]
2295#[doc(alias = "g_spawn_async")]
2296pub fn spawn_async(
2297    working_directory: Option<impl AsRef<std::path::Path>>,
2298    argv: &[&std::path::Path],
2299    envp: &[&std::path::Path],
2300    flags: SpawnFlags,
2301    child_setup: Option<Box_<dyn FnOnce() + 'static>>,
2302) -> Result<Pid, crate::Error> {
2303    let child_setup_data: Box_<Option<Box_<dyn FnOnce() + 'static>>> = Box_::new(child_setup);
2304    unsafe extern "C" fn child_setup_func(data: ffi::gpointer) {
2305        unsafe {
2306            let callback = Box_::from_raw(data as *mut Option<Box_<dyn FnOnce() + 'static>>);
2307            let callback = (*callback).expect("cannot get closure...");
2308            callback()
2309        }
2310    }
2311    let child_setup = if child_setup_data.is_some() {
2312        Some(child_setup_func as _)
2313    } else {
2314        None
2315    };
2316    let super_callback0: Box_<Option<Box_<dyn FnOnce() + 'static>>> = child_setup_data;
2317    unsafe {
2318        let mut child_pid = std::mem::MaybeUninit::uninit();
2319        let mut error = std::ptr::null_mut();
2320        let is_ok = ffi::g_spawn_async(
2321            working_directory
2322                .as_ref()
2323                .map(|p| p.as_ref())
2324                .to_glib_none()
2325                .0,
2326            argv.to_glib_none().0,
2327            envp.to_glib_none().0,
2328            flags.into_glib(),
2329            child_setup,
2330            Box_::into_raw(super_callback0) as *mut _,
2331            child_pid.as_mut_ptr(),
2332            &mut error,
2333        );
2334        debug_assert_eq!(is_ok == crate::ffi::GFALSE, !error.is_null());
2335        if error.is_null() {
2336            Ok(from_glib(child_pid.assume_init()))
2337        } else {
2338            Err(from_glib_full(error))
2339        }
2340    }
2341}
2342
2343//#[cfg(feature = "v2_68")]
2344//#[cfg_attr(docsrs, doc(cfg(feature = "v2_68")))]
2345//#[doc(alias = "g_spawn_async_with_pipes_and_fds")]
2346//pub fn spawn_async_with_pipes_and_fds(working_directory: Option<impl AsRef<std::path::Path>>, argv: &[&std::path::Path], envp: &[&std::path::Path], flags: SpawnFlags, child_setup: Option<Box_<dyn FnOnce() + 'static>>, stdin_fd: i32, stdout_fd: i32, stderr_fd: i32, source_fds: &[i32], target_fds: &[i32], n_fds: usize) -> Result<(Pid, i32, i32, i32), crate::Error> {
2347//    unsafe { TODO: call ffi:g_spawn_async_with_pipes_and_fds() }
2348//}
2349
2350/// An old name for g_spawn_check_wait_status(), deprecated because its
2351/// name is misleading.
2352///
2353/// Despite the name of the function, @wait_status must be the wait status
2354/// as returned by g_spawn_sync(), g_subprocess_get_status(), `waitpid()`,
2355/// etc. On Unix platforms, it is incorrect for it to be the exit status
2356/// as passed to `exit()` or returned by g_subprocess_get_exit_status() or
2357/// `WEXITSTATUS()`.
2358///
2359/// # Deprecated since 2.70
2360///
2361/// Use g_spawn_check_wait_status() instead, and check whether your code is conflating wait and exit statuses.
2362/// ## `wait_status`
2363/// A status as returned from g_spawn_sync()
2364///
2365/// # Returns
2366///
2367/// [`true`] if child exited successfully, [`false`] otherwise (and
2368///     @error will be set)
2369#[cfg_attr(feature = "v2_70", deprecated = "Since 2.70")]
2370#[allow(deprecated)]
2371#[doc(alias = "g_spawn_check_exit_status")]
2372pub fn spawn_check_exit_status(wait_status: i32) -> Result<(), crate::Error> {
2373    unsafe {
2374        let mut error = std::ptr::null_mut();
2375        let is_ok = ffi::g_spawn_check_exit_status(wait_status, &mut error);
2376        debug_assert_eq!(is_ok == crate::ffi::GFALSE, !error.is_null());
2377        if error.is_null() {
2378            Ok(())
2379        } else {
2380            Err(from_glib_full(error))
2381        }
2382    }
2383}
2384
2385/// Set @error if @wait_status indicates the child exited abnormally
2386/// (e.g. with a nonzero exit code, or via a fatal signal).
2387///
2388/// The g_spawn_sync() and g_child_watch_add() family of APIs return the
2389/// status of subprocesses encoded in a platform-specific way.
2390/// On Unix, this is guaranteed to be in the same format waitpid() returns,
2391/// and on Windows it is guaranteed to be the result of GetExitCodeProcess().
2392///
2393/// Prior to the introduction of this function in GLib 2.34, interpreting
2394/// @wait_status required use of platform-specific APIs, which is problematic
2395/// for software using GLib as a cross-platform layer.
2396///
2397/// Additionally, many programs simply want to determine whether or not
2398/// the child exited successfully, and either propagate a #GError or
2399/// print a message to standard error. In that common case, this function
2400/// can be used. Note that the error message in @error will contain
2401/// human-readable information about the wait status.
2402///
2403/// The @domain and @code of @error have special semantics in the case
2404/// where the process has an "exit code", as opposed to being killed by
2405/// a signal. On Unix, this happens if WIFEXITED() would be true of
2406/// @wait_status. On Windows, it is always the case.
2407///
2408/// The special semantics are that the actual exit code will be the
2409/// code set in @error, and the domain will be `G_SPAWN_EXIT_ERROR`.
2410/// This allows you to differentiate between different exit codes.
2411///
2412/// If the process was terminated by some means other than an exit
2413/// status (for example if it was killed by a signal), the domain will be
2414/// `G_SPAWN_ERROR` and the code will be `G_SPAWN_ERROR_FAILED`.
2415///
2416/// This function just offers convenience; you can of course also check
2417/// the available platform via a macro such as `G_OS_UNIX`, and use
2418/// WIFEXITED() and WEXITSTATUS() on @wait_status directly. Do not attempt
2419/// to scan or parse the error message string; it may be translated and/or
2420/// change in future versions of GLib.
2421///
2422/// Prior to version 2.70, g_spawn_check_exit_status() provides the same
2423/// functionality, although under a misleading name.
2424/// ## `wait_status`
2425/// A platform-specific wait status as returned from g_spawn_sync()
2426///
2427/// # Returns
2428///
2429/// [`true`] if child exited successfully, [`false`] otherwise (and
2430///   @error will be set)
2431#[cfg(feature = "v2_70")]
2432#[cfg_attr(docsrs, doc(cfg(feature = "v2_70")))]
2433#[doc(alias = "g_spawn_check_wait_status")]
2434pub fn spawn_check_wait_status(wait_status: i32) -> Result<(), crate::Error> {
2435    unsafe {
2436        let mut error = std::ptr::null_mut();
2437        let is_ok = ffi::g_spawn_check_wait_status(wait_status, &mut error);
2438        debug_assert_eq!(is_ok == crate::ffi::GFALSE, !error.is_null());
2439        if error.is_null() {
2440            Ok(())
2441        } else {
2442            Err(from_glib_full(error))
2443        }
2444    }
2445}
2446
2447/// A simple version of g_spawn_async() that parses a command line with
2448/// g_shell_parse_argv() and passes it to g_spawn_async().
2449///
2450/// Filenames and potentially untrusted input in @command_line should be quoted
2451/// using [`shell_quote()`][crate::shell_quote()].
2452///
2453/// Runs a command line in the background. Unlike g_spawn_async(), the
2454/// [`SpawnFlags::SEARCH_PATH`][crate::SpawnFlags::SEARCH_PATH] flag is enabled, other flags are not. Note
2455/// that [`SpawnFlags::SEARCH_PATH`][crate::SpawnFlags::SEARCH_PATH] can have security implications, so
2456/// consider using g_spawn_async() directly if appropriate. Possible
2457/// errors are those from g_shell_parse_argv() and g_spawn_async().
2458///
2459/// The same concerns on Windows apply as for g_spawn_command_line_sync().
2460/// ## `command_line`
2461/// a command line
2462///
2463/// # Returns
2464///
2465/// [`true`] on success, [`false`] if error is set
2466#[cfg(unix)]
2467#[cfg_attr(docsrs, doc(cfg(unix)))]
2468#[doc(alias = "g_spawn_command_line_async")]
2469pub fn spawn_command_line_async(
2470    command_line: impl AsRef<std::ffi::OsStr>,
2471) -> Result<(), crate::Error> {
2472    unsafe {
2473        let mut error = std::ptr::null_mut();
2474        let is_ok =
2475            ffi::g_spawn_command_line_async(command_line.as_ref().to_glib_none().0, &mut error);
2476        debug_assert_eq!(is_ok == crate::ffi::GFALSE, !error.is_null());
2477        if error.is_null() {
2478            Ok(())
2479        } else {
2480            Err(from_glib_full(error))
2481        }
2482    }
2483}
2484
2485//#[doc(alias = "g_spawn_command_line_sync")]
2486//pub fn spawn_command_line_sync(command_line: impl AsRef<std::path::Path>, standard_output: Vec<u8>, standard_error: Vec<u8>) -> Result<i32, crate::Error> {
2487//    unsafe { TODO: call ffi:g_spawn_command_line_sync() }
2488//}
2489
2490//#[doc(alias = "g_spawn_sync")]
2491//pub fn spawn_sync(working_directory: Option<impl AsRef<std::path::Path>>, argv: &[&std::path::Path], envp: &[&std::path::Path], flags: SpawnFlags, child_setup: Option<&mut dyn FnMut()>, standard_output: Vec<u8>, standard_error: Vec<u8>) -> Result<i32, crate::Error> {
2492//    unsafe { TODO: call ffi:g_spawn_sync() }
2493//}
2494
2495//#[doc(alias = "g_stat")]
2496//pub fn stat(filename: impl AsRef<std::path::Path>, buf: /*Ignored*/&mut StatBuf) -> i32 {
2497//    unsafe { TODO: call ffi:g_stat() }
2498//}
2499
2500/// A wrapper for the POSIX unlink() function. The unlink() function
2501/// deletes a name from the filesystem. If this was the last link to the
2502/// file and no processes have it opened, the diskspace occupied by the
2503/// file is freed.
2504///
2505/// See your C library manual for more details about unlink(). Note
2506/// that on Windows, it is in general not possible to delete files that
2507/// are open to some process, or mapped into memory.
2508/// ## `filename`
2509/// a pathname in the GLib file name encoding
2510///     (UTF-8 on Windows)
2511///
2512/// # Returns
2513///
2514/// 0 if the name was successfully deleted, -1 if an error
2515///    occurred
2516#[doc(alias = "g_unlink")]
2517pub fn unlink(filename: impl AsRef<std::path::Path>) -> i32 {
2518    unsafe { ffi::g_unlink(filename.as_ref().to_glib_none().0) }
2519}
2520
2521/// Removes an environment variable from the environment.
2522///
2523/// Note that on some systems, when variables are overwritten, the
2524/// memory used for the previous variables and its value isn't reclaimed.
2525///
2526/// You should be mindful of the fact that environment variable handling
2527/// in UNIX is not thread-safe, and your program may crash if one thread
2528/// calls g_unsetenv() while another thread is calling getenv(). (And note
2529/// that many functions, such as gettext(), call getenv() internally.) This
2530/// function is only safe to use at the very start of your program, before
2531/// creating any other threads (or creating objects that create worker
2532/// threads of their own).
2533///
2534/// If you need to set up the environment for a child process, you can
2535/// use g_get_environ() to get an environment array, modify that with
2536/// g_environ_setenv() and g_environ_unsetenv(), and then pass that
2537/// array directly to execvpe(), g_spawn_async(), or the like.
2538/// ## `variable`
2539/// the environment variable to remove, must
2540///     not contain '='
2541#[doc(alias = "g_unsetenv")]
2542pub unsafe fn unsetenv(variable: impl AsRef<std::ffi::OsStr>) {
2543    unsafe {
2544        ffi::g_unsetenv(variable.as_ref().to_glib_none().0);
2545    }
2546}
2547
2548/// Pauses the current thread for the given number of microseconds.
2549///
2550/// There are 1 million microseconds per second (represented by the
2551/// `G_USEC_PER_SEC` macro). g_usleep() may have limited precision,
2552/// depending on hardware and operating system; don't rely on the exact
2553/// length of the sleep.
2554/// ## `microseconds`
2555/// number of microseconds to pause
2556#[doc(alias = "g_usleep")]
2557pub fn usleep(microseconds: libc::c_ulong) {
2558    unsafe {
2559        ffi::g_usleep(microseconds);
2560    }
2561}
2562
2563/// Parses the string @str and verify if it is a UUID.
2564///
2565/// The function accepts the following syntax:
2566///
2567/// - simple forms (e.g. `f81d4fae-7dec-11d0-a765-00a0c91e6bf6`)
2568///
2569/// Note that hyphens are required within the UUID string itself,
2570/// as per the aforementioned RFC.
2571/// ## `str`
2572/// a string representing a UUID
2573///
2574/// # Returns
2575///
2576/// [`true`] if @str is a valid UUID, [`false`] otherwise.
2577#[doc(alias = "g_uuid_string_is_valid")]
2578pub fn uuid_string_is_valid(str: &str) -> bool {
2579    unsafe { from_glib(ffi::g_uuid_string_is_valid(str.to_glib_none().0)) }
2580}
2581
2582/// Generates a random UUID (RFC 4122 version 4) as a string. It has the same
2583/// randomness guarantees as #GRand, so must not be used for cryptographic
2584/// purposes such as key generation, nonces, salts or one-time pads.
2585///
2586/// # Returns
2587///
2588/// A string that should be freed with g_free().
2589#[doc(alias = "g_uuid_string_random")]
2590pub fn uuid_string_random() -> crate::GString {
2591    unsafe { from_glib_full(ffi::g_uuid_string_random()) }
2592}