mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-10-31 16:32:18 +01:00 
			
		
		
		
	Check for mkstemp.
2000-10-30 Tor Lillqvist <tml@iki.fi> * configure.in: Check for mkstemp. * gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call it, otherwise use code lifted from glibc. * gutils.h: Declare it. * glib.def: Here, too.
This commit is contained in:
		
				
					committed by
					
						 Tor Lillqvist
						Tor Lillqvist
					
				
			
			
				
	
			
			
			
						parent
						
							3de6638d23
						
					
				
				
					commit
					6acee58bdf
				
			
							
								
								
									
										11
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								ChangeLog
									
									
									
									
									
								
							| @@ -1,3 +1,14 @@ | ||||
| 2000-10-30  Tor Lillqvist  <tml@iki.fi> | ||||
|  | ||||
| 	* configure.in: Check for mkstemp. | ||||
|  | ||||
| 	* gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call | ||||
| 	it, otherwise use code lifted from glibc. | ||||
|  | ||||
| 	* gutils.h: Declare it. | ||||
|  | ||||
| 	* glib.def: Here, too. | ||||
|  | ||||
| 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de> | ||||
|  | ||||
| 	* gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h: | ||||
|   | ||||
| @@ -1,3 +1,14 @@ | ||||
| 2000-10-30  Tor Lillqvist  <tml@iki.fi> | ||||
|  | ||||
| 	* configure.in: Check for mkstemp. | ||||
|  | ||||
| 	* gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call | ||||
| 	it, otherwise use code lifted from glibc. | ||||
|  | ||||
| 	* gutils.h: Declare it. | ||||
|  | ||||
| 	* glib.def: Here, too. | ||||
|  | ||||
| 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de> | ||||
|  | ||||
| 	* gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h: | ||||
|   | ||||
| @@ -1,3 +1,14 @@ | ||||
| 2000-10-30  Tor Lillqvist  <tml@iki.fi> | ||||
|  | ||||
| 	* configure.in: Check for mkstemp. | ||||
|  | ||||
| 	* gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call | ||||
| 	it, otherwise use code lifted from glibc. | ||||
|  | ||||
| 	* gutils.h: Declare it. | ||||
|  | ||||
| 	* glib.def: Here, too. | ||||
|  | ||||
| 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de> | ||||
|  | ||||
| 	* gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h: | ||||
|   | ||||
| @@ -1,3 +1,14 @@ | ||||
| 2000-10-30  Tor Lillqvist  <tml@iki.fi> | ||||
|  | ||||
| 	* configure.in: Check for mkstemp. | ||||
|  | ||||
| 	* gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call | ||||
| 	it, otherwise use code lifted from glibc. | ||||
|  | ||||
| 	* gutils.h: Declare it. | ||||
|  | ||||
| 	* glib.def: Here, too. | ||||
|  | ||||
| 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de> | ||||
|  | ||||
| 	* gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h: | ||||
|   | ||||
| @@ -1,3 +1,14 @@ | ||||
| 2000-10-30  Tor Lillqvist  <tml@iki.fi> | ||||
|  | ||||
| 	* configure.in: Check for mkstemp. | ||||
|  | ||||
| 	* gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call | ||||
| 	it, otherwise use code lifted from glibc. | ||||
|  | ||||
| 	* gutils.h: Declare it. | ||||
|  | ||||
| 	* glib.def: Here, too. | ||||
|  | ||||
| 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de> | ||||
|  | ||||
| 	* gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h: | ||||
|   | ||||
| @@ -1,3 +1,14 @@ | ||||
| 2000-10-30  Tor Lillqvist  <tml@iki.fi> | ||||
|  | ||||
| 	* configure.in: Check for mkstemp. | ||||
|  | ||||
| 	* gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call | ||||
| 	it, otherwise use code lifted from glibc. | ||||
|  | ||||
| 	* gutils.h: Declare it. | ||||
|  | ||||
| 	* glib.def: Here, too. | ||||
|  | ||||
| 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de> | ||||
|  | ||||
| 	* gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h: | ||||
|   | ||||
| @@ -1,3 +1,14 @@ | ||||
| 2000-10-30  Tor Lillqvist  <tml@iki.fi> | ||||
|  | ||||
| 	* configure.in: Check for mkstemp. | ||||
|  | ||||
| 	* gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call | ||||
| 	it, otherwise use code lifted from glibc. | ||||
|  | ||||
| 	* gutils.h: Declare it. | ||||
|  | ||||
| 	* glib.def: Here, too. | ||||
|  | ||||
| 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de> | ||||
|  | ||||
| 	* gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h: | ||||
|   | ||||
| @@ -1,3 +1,14 @@ | ||||
| 2000-10-30  Tor Lillqvist  <tml@iki.fi> | ||||
|  | ||||
| 	* configure.in: Check for mkstemp. | ||||
|  | ||||
| 	* gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call | ||||
| 	it, otherwise use code lifted from glibc. | ||||
|  | ||||
| 	* gutils.h: Declare it. | ||||
|  | ||||
| 	* glib.def: Here, too. | ||||
|  | ||||
| 2000-10-30  Sebastian Wilhelmi  <wilhelmi@ira.uka.de> | ||||
|  | ||||
| 	* gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h: | ||||
|   | ||||
| @@ -351,7 +351,7 @@ GLIB_SIZEOF([$size_includes], ptrdiff_t, ptrdiff_t) | ||||
| GLIB_SIZEOF([$size_includes], intmax_t, intmax_t) | ||||
|  | ||||
| # Check for some functions | ||||
| AC_CHECK_FUNCS(lstat strerror strsignal memmove vsnprintf strcasecmp strncasecmp poll getcwd) | ||||
| AC_CHECK_FUNCS(lstat strerror strsignal memmove mkstemp vsnprintf strcasecmp strncasecmp poll getcwd) | ||||
|  | ||||
| # Check if bcopy can be used for overlapping copies, if memmove isn't found. | ||||
| # The check is borrowed from the PERL Configure script. | ||||
|   | ||||
							
								
								
									
										1
									
								
								glib.def
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								glib.def
									
									
									
									
									
								
							| @@ -239,6 +239,7 @@ EXPORTS | ||||
| 	g_mem_profile | ||||
| 	g_memdup | ||||
| 	g_messages_init | ||||
| 	g_mkstemp | ||||
| 	g_mutex_init | ||||
| 	g_node_child_index | ||||
| 	g_node_child_position | ||||
|   | ||||
| @@ -239,6 +239,7 @@ EXPORTS | ||||
| 	g_mem_profile | ||||
| 	g_memdup | ||||
| 	g_messages_init | ||||
| 	g_mkstemp | ||||
| 	g_mutex_init | ||||
| 	g_node_child_index | ||||
| 	g_node_child_position | ||||
|   | ||||
| @@ -40,6 +40,7 @@ | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <errno.h> | ||||
| #include <fcntl.h> | ||||
| #ifdef HAVE_PWD_H | ||||
| #include <pwd.h> | ||||
| #endif | ||||
| @@ -76,6 +77,10 @@ | ||||
| #include <langinfo.h> | ||||
| #endif | ||||
|  | ||||
| #ifndef O_BINARY | ||||
| #define O_BINARY 0 | ||||
| #endif | ||||
|  | ||||
| const guint glib_major_version = GLIB_MAJOR_VERSION; | ||||
| const guint glib_minor_version = GLIB_MINOR_VERSION; | ||||
| const guint glib_micro_version = GLIB_MICRO_VERSION; | ||||
| @@ -964,3 +969,78 @@ g_get_codeset (void) | ||||
| #endif | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * g_mkstemp: | ||||
|  * | ||||
|  * Open a temporary file | ||||
|  * | ||||
|  * The parameter is a string that should match the rules for mktemp, i.e. | ||||
|  * end in "XXXXXX". The X string will be modified to form the name | ||||
|  * of a file that didn't exist. | ||||
|  * | ||||
|  * Return value: A file handle (as from open()) to the file file | ||||
|  * opened for reading and writing. The file is opened in binary mode | ||||
|  * on platforms where there is a difference. The file handle should be | ||||
|  * closed with close(). In case of errors, -1 is returned. | ||||
|  * | ||||
|  * From the GNU C library. | ||||
|  * Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc. | ||||
|  */ | ||||
| int | ||||
| g_mkstemp (char *tmpl) | ||||
| { | ||||
| #ifdef HAVE_MKSTEMP | ||||
|   return mkstemp (tmpl); | ||||
| #else | ||||
|   int len; | ||||
|   char *XXXXXX; | ||||
|   int count, fd; | ||||
|   static const char letters[] = | ||||
|     "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; | ||||
|   glong value; | ||||
|   GTimeVal tv; | ||||
|  | ||||
|   len = strlen (tmpl); | ||||
|   if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX")) | ||||
|     return -1; | ||||
|  | ||||
|   /* This is where the Xs start.  */ | ||||
|   XXXXXX = &tmpl[len - 6]; | ||||
|  | ||||
|   /* Get some more or less random data.  */ | ||||
|   g_get_current_time (&tv); | ||||
|   value = tv.tv_usec ^ tv.tv_sec; | ||||
|  | ||||
|   for (count = 0; count < 100; value += 7777, ++count) | ||||
|     { | ||||
|       glong v = value; | ||||
|  | ||||
|       /* Fill in the random bits.  */ | ||||
|       XXXXXX[0] = letters[v % 62]; | ||||
|       v /= 62; | ||||
|       XXXXXX[1] = letters[v % 62]; | ||||
|       v /= 62; | ||||
|       XXXXXX[2] = letters[v % 62]; | ||||
|       v /= 62; | ||||
|       XXXXXX[3] = letters[v % 62]; | ||||
|       v /= 62; | ||||
|       XXXXXX[4] = letters[v % 62]; | ||||
|       v /= 62; | ||||
|       XXXXXX[5] = letters[v % 62]; | ||||
|  | ||||
|       fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600); | ||||
|  | ||||
|       if (fd >= 0) | ||||
| 	return fd; | ||||
|       else if (errno != EEXIST) | ||||
| 	/* Any other error will apply also to other names we might | ||||
| 	 *  try, and there are 2^32 or so of them, so give up now. | ||||
| 	 */ | ||||
| 	return -1; | ||||
|     } | ||||
|  | ||||
|   /* We got out of the loop because we ran out of combinations to try.  */ | ||||
|   return -1; | ||||
| #endif | ||||
| } | ||||
|   | ||||
| @@ -161,6 +161,9 @@ gchar*	g_path_get_dirname	(const gchar *file_name); | ||||
| /* Get the codeset for the current locale */ | ||||
| /* gchar * g_get_codeset    (void); */ | ||||
|  | ||||
| /* Wrapper / workalike for mkstemp() */ | ||||
| int     g_mkstemp (char *tmpl); | ||||
|  | ||||
| /* return the environment string for the variable. The returned memory | ||||
|  * must not be freed. */ | ||||
| gchar*  g_getenv		(const gchar *variable); | ||||
|   | ||||
| @@ -96,6 +96,7 @@ glib-$(GLIB_VER).dll : $(glib_OBJECTS) glib.def | ||||
|  | ||||
| gspawn-win32-helper.exe : gspawn-win32.c glib-$(GLIB_VER).dll | ||||
| 	$(CC) $(CFLAGS) -Fe$@ -DGSPAWN_HELPER -DG_LOG_DOMAIN=\"gspawn-win32-helper\" gspawn-win32.c glib-$(GLIB_VER).lib $(LDFLAGS) /subsystem:windows user32.lib | ||||
| 	@erase gspawn-win32.obj | ||||
|  | ||||
| ################ subdirectories | ||||
|  | ||||
|   | ||||
							
								
								
									
										80
									
								
								gutils.c
									
									
									
									
									
								
							
							
						
						
									
										80
									
								
								gutils.c
									
									
									
									
									
								
							| @@ -40,6 +40,7 @@ | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <errno.h> | ||||
| #include <fcntl.h> | ||||
| #ifdef HAVE_PWD_H | ||||
| #include <pwd.h> | ||||
| #endif | ||||
| @@ -76,6 +77,10 @@ | ||||
| #include <langinfo.h> | ||||
| #endif | ||||
|  | ||||
| #ifndef O_BINARY | ||||
| #define O_BINARY 0 | ||||
| #endif | ||||
|  | ||||
| const guint glib_major_version = GLIB_MAJOR_VERSION; | ||||
| const guint glib_minor_version = GLIB_MINOR_VERSION; | ||||
| const guint glib_micro_version = GLIB_MICRO_VERSION; | ||||
| @@ -964,3 +969,78 @@ g_get_codeset (void) | ||||
| #endif | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * g_mkstemp: | ||||
|  * | ||||
|  * Open a temporary file | ||||
|  * | ||||
|  * The parameter is a string that should match the rules for mktemp, i.e. | ||||
|  * end in "XXXXXX". The X string will be modified to form the name | ||||
|  * of a file that didn't exist. | ||||
|  * | ||||
|  * Return value: A file handle (as from open()) to the file file | ||||
|  * opened for reading and writing. The file is opened in binary mode | ||||
|  * on platforms where there is a difference. The file handle should be | ||||
|  * closed with close(). In case of errors, -1 is returned. | ||||
|  * | ||||
|  * From the GNU C library. | ||||
|  * Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc. | ||||
|  */ | ||||
| int | ||||
| g_mkstemp (char *tmpl) | ||||
| { | ||||
| #ifdef HAVE_MKSTEMP | ||||
|   return mkstemp (tmpl); | ||||
| #else | ||||
|   int len; | ||||
|   char *XXXXXX; | ||||
|   int count, fd; | ||||
|   static const char letters[] = | ||||
|     "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; | ||||
|   glong value; | ||||
|   GTimeVal tv; | ||||
|  | ||||
|   len = strlen (tmpl); | ||||
|   if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX")) | ||||
|     return -1; | ||||
|  | ||||
|   /* This is where the Xs start.  */ | ||||
|   XXXXXX = &tmpl[len - 6]; | ||||
|  | ||||
|   /* Get some more or less random data.  */ | ||||
|   g_get_current_time (&tv); | ||||
|   value = tv.tv_usec ^ tv.tv_sec; | ||||
|  | ||||
|   for (count = 0; count < 100; value += 7777, ++count) | ||||
|     { | ||||
|       glong v = value; | ||||
|  | ||||
|       /* Fill in the random bits.  */ | ||||
|       XXXXXX[0] = letters[v % 62]; | ||||
|       v /= 62; | ||||
|       XXXXXX[1] = letters[v % 62]; | ||||
|       v /= 62; | ||||
|       XXXXXX[2] = letters[v % 62]; | ||||
|       v /= 62; | ||||
|       XXXXXX[3] = letters[v % 62]; | ||||
|       v /= 62; | ||||
|       XXXXXX[4] = letters[v % 62]; | ||||
|       v /= 62; | ||||
|       XXXXXX[5] = letters[v % 62]; | ||||
|  | ||||
|       fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600); | ||||
|  | ||||
|       if (fd >= 0) | ||||
| 	return fd; | ||||
|       else if (errno != EEXIST) | ||||
| 	/* Any other error will apply also to other names we might | ||||
| 	 *  try, and there are 2^32 or so of them, so give up now. | ||||
| 	 */ | ||||
| 	return -1; | ||||
|     } | ||||
|  | ||||
|   /* We got out of the loop because we ran out of combinations to try.  */ | ||||
|   return -1; | ||||
| #endif | ||||
| } | ||||
|   | ||||
							
								
								
									
										3
									
								
								gutils.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								gutils.h
									
									
									
									
									
								
							| @@ -161,6 +161,9 @@ gchar*	g_path_get_dirname	(const gchar *file_name); | ||||
| /* Get the codeset for the current locale */ | ||||
| /* gchar * g_get_codeset    (void); */ | ||||
|  | ||||
| /* Wrapper / workalike for mkstemp() */ | ||||
| int     g_mkstemp (char *tmpl); | ||||
|  | ||||
| /* return the environment string for the variable. The returned memory | ||||
|  * must not be freed. */ | ||||
| gchar*  g_getenv		(const gchar *variable); | ||||
|   | ||||
| @@ -96,6 +96,7 @@ glib-$(GLIB_VER).dll : $(glib_OBJECTS) glib.def | ||||
|  | ||||
| gspawn-win32-helper.exe : gspawn-win32.c glib-$(GLIB_VER).dll | ||||
| 	$(CC) $(CFLAGS) -Fe$@ -DGSPAWN_HELPER -DG_LOG_DOMAIN=\"gspawn-win32-helper\" gspawn-win32.c glib-$(GLIB_VER).lib $(LDFLAGS) /subsystem:windows user32.lib | ||||
| 	@erase gspawn-win32.obj | ||||
|  | ||||
| ################ subdirectories | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user