components/visual-panels/time/src/cmd/rad/mod/time/mod_time.c
changeset 901 19b502ccabc8
parent 827 0944d8c0158b
child 1410 ca9946e5736c
equal deleted inserted replaced
900:63d3bf696d85 901:19b502ccabc8
    49 #define	ZONEINFO_DIR	"/usr/share/lib/zoneinfo/" /* trailing / essential */
    49 #define	ZONEINFO_DIR	"/usr/share/lib/zoneinfo/" /* trailing / essential */
    50 
    50 
    51 /*ARGSUSED*/
    51 /*ARGSUSED*/
    52 conerr_t
    52 conerr_t
    53 interface_Time_read_time(rad_instance_t *inst, adr_attribute_t *attr,
    53 interface_Time_read_time(rad_instance_t *inst, adr_attribute_t *attr,
    54     data_t **data, data_t **error)
    54     adr_data_t **data, adr_data_t **error)
    55 {
    55 {
    56 	*data = data_new_time_now();
    56 	*data = adr_data_new_time_now();
    57 	return (ce_ok);
    57 	return (ce_ok);
    58 }
    58 }
    59 
    59 
    60 #define	NSPERUS	(NANOSEC / MICROSEC)
    60 #define	NSPERUS	(NANOSEC / MICROSEC)
    61 
    61 
    62 /*ARGSUSED*/
    62 /*ARGSUSED*/
    63 conerr_t
    63 conerr_t
    64 interface_Time_write_time(rad_instance_t *inst, adr_attribute_t *attr,
    64 interface_Time_write_time(rad_instance_t *inst, adr_attribute_t *attr,
    65     data_t *data, data_t **error)
    65     adr_data_t *data, adr_data_t **error)
    66 {
    66 {
    67 	long long seconds = data_to_time_secs(data);
    67 	long long seconds = adr_data_to_time_secs(data);
    68 	int nanos = data_to_time_nsecs(data);
    68 	int nanos = adr_data_to_time_nsecs(data);
    69 	int micros = nanos / NSPERUS;
    69 	int micros = nanos / NSPERUS;
    70 	time_t newtime;
    70 	time_t newtime;
    71 	struct timeval adj;
    71 	struct timeval adj;
    72 
    72 
    73 	if (nanos - (micros * NSPERUS) >= NSPERUS / 2) {
    73 	if (nanos - (micros * NSPERUS) >= NSPERUS / 2) {
    95 }
    95 }
    96 
    96 
    97 /*ARGSUSED*/
    97 /*ARGSUSED*/
    98 conerr_t
    98 conerr_t
    99 interface_Time_read_defaultTimeZone(rad_instance_t *inst, adr_attribute_t *attr,
    99 interface_Time_read_defaultTimeZone(rad_instance_t *inst, adr_attribute_t *attr,
   100     data_t **data, data_t **error)
   100     adr_data_t **data, adr_data_t **error)
   101 {
   101 {
   102 	char zonefile[PATH_MAX];
   102 	char zonefile[PATH_MAX];
   103 	int n = snprintf(zonefile, PATH_MAX, "%s", ZONEINFO_DIR);
   103 	int n = snprintf(zonefile, PATH_MAX, "%s", ZONEINFO_DIR);
   104 	char *tz = zonefile + n;
   104 	char *tz = zonefile + n;
   105 	conerr_t err = smfu_get_property((char *)SCF_INSTANCE_ENV,
   105 	conerr_t err = smfu_get_property((char *)SCF_INSTANCE_ENV,
   114 		char resolved[PATH_MAX];
   114 		char resolved[PATH_MAX];
   115 		if (realpath(zonefile, resolved) != NULL &&
   115 		if (realpath(zonefile, resolved) != NULL &&
   116 		    strncmp(resolved, ZONEINFO_DIR, n) == 0) {
   116 		    strncmp(resolved, ZONEINFO_DIR, n) == 0) {
   117 			tz = resolved + n;
   117 			tz = resolved + n;
   118 		}
   118 		}
   119 		*data = data_new_string(tz, lt_copy);
   119 		*data = adr_data_new_string(tz, LT_COPY);
   120 	}
   120 	}
   121 
   121 
   122 	return (err);
   122 	return (err);
   123 }
   123 }
   124 
   124 
   125 /*ARGSUSED*/
   125 /*ARGSUSED*/
   126 conerr_t
   126 conerr_t
   127 interface_Time_write_defaultTimeZone(rad_instance_t *inst,
   127 interface_Time_write_defaultTimeZone(rad_instance_t *inst,
   128     adr_attribute_t *attr, data_t *data, data_t **error)
   128     adr_attribute_t *attr, adr_data_t *data, adr_data_t **error)
   129 {
   129 {
   130 	conerr_t err = smfu_set_property((char *)SCF_INSTANCE_ENV,
   130 	conerr_t err = smfu_set_property((char *)SCF_INSTANCE_ENV,
   131 	    SMF_TZ_PGNAME, SMF_TZ_PROPNAME, (char *)data_to_string(data));
   131 	    SMF_TZ_PGNAME, SMF_TZ_PROPNAME, (char *)adr_data_to_string(data));
   132 	return (err);
   132 	return (err);
   133 }
   133 }
   134 
   134 
   135 static void
   135 static void
   136 removenl(char *str)
   136 removenl(char *str)
   151 };
   151 };
   152 
   152 
   153 static const char * const si_server_path[] = { "server", NULL };
   153 static const char * const si_server_path[] = { "server", NULL };
   154 
   154 
   155 static void
   155 static void
   156 disable(data_t *array, const char *srv, int len)
   156 disable(adr_data_t *array, const char *srv, int len)
   157 {
   157 {
   158 	if (array_nsearch(array, srv, len, si_server_path) >= 0)
   158 	if (adr_array_nsearch(array, srv, len, si_server_path) >= 0)
   159 		return;
   159 		return;
   160 	data_t *entry = data_new_struct(&t__ServerInfo);
   160 	adr_data_t *entry = adr_data_new_struct(&t__ServerInfo);
   161 	struct_set(entry, "server", data_new_nstring(srv, len));
   161 	adr_struct_set(entry, "server", adr_data_new_nstring(srv, len));
   162 	struct_set(entry, "enabled", data_new_boolean(B_FALSE));
   162 	adr_struct_set(entry, "enabled", adr_data_new_boolean(B_FALSE));
   163 	(void) array_add(array, entry);
   163 	(void) adr_array_add(array, entry);
   164 }
   164 }
   165 
   165 
   166 static void
   166 static void
   167 enable(data_t *array, const char *srv, int len)
   167 enable(adr_data_t *array, const char *srv, int len)
   168 {
   168 {
   169 	int index = array_nsearch(array, srv, len, si_server_path);
   169 	int index = adr_array_nsearch(array, srv, len, si_server_path);
   170 	if (index >= 0) {
   170 	if (index >= 0) {
   171 		struct_set(array_get(array, index), "enabled",
   171 		adr_struct_set(adr_array_get(array, index), "enabled",
   172 		    data_new_boolean(B_TRUE));
   172 		    adr_data_new_boolean(B_TRUE));
   173 		return;
   173 		return;
   174 	}
   174 	}
   175 	data_t *entry = data_new_struct(&t__ServerInfo);
   175 	adr_data_t *entry = adr_data_new_struct(&t__ServerInfo);
   176 	struct_set(entry, "server", data_new_nstring(srv, len));
   176 	adr_struct_set(entry, "server", adr_data_new_nstring(srv, len));
   177 	struct_set(entry, "enabled", data_new_boolean(B_TRUE));
   177 	adr_struct_set(entry, "enabled", adr_data_new_boolean(B_TRUE));
   178 	(void) array_add(array, entry);
   178 	(void) adr_array_add(array, entry);
   179 }
   179 }
   180 
   180 
   181 /*ARGSUSED*/
   181 /*ARGSUSED*/
   182 conerr_t
   182 conerr_t
   183 interface_Time_read_ntpServers(rad_instance_t *inst, adr_attribute_t *attr,
   183 interface_Time_read_ntpServers(rad_instance_t *inst, adr_attribute_t *attr,
   184     data_t **data, data_t **error)
   184     adr_data_t **data, adr_data_t **error)
   185 {
   185 {
   186 	data_t *result = data_new_array(&t_array__ServerInfo, 4);
   186 	adr_data_t *result = adr_data_new_array(&t_array__ServerInfo, 4);
   187 	for (int i = 0; i < RAD_COUNT(ntpservers); i++) {
   187 	for (int i = 0; i < RAD_COUNT(ntpservers); i++) {
   188 		data_t *si = data_new_struct(&t__ServerInfo);
   188 		adr_data_t *si = adr_data_new_struct(&t__ServerInfo);
   189 		struct_set(si, "server",
   189 		adr_struct_set(si, "server",
   190 		    data_new_string(ntpservers[i], lt_copy));
   190 		    adr_data_new_string(ntpservers[i], LT_COPY));
   191 		struct_set(si, "enabled", data_new_boolean(B_FALSE));
   191 		adr_struct_set(si, "enabled", adr_data_new_boolean(B_FALSE));
   192 		(void) array_add(result, si);
   192 		(void) adr_array_add(result, si);
   193 	}
   193 	}
   194 
   194 
   195 	FILE *file = fopen(NTP_CONF, "r");
   195 	FILE *file = fopen(NTP_CONF, "r");
   196 	if (file != NULL) {
   196 	if (file != NULL) {
   197 		char buf[1024];
   197 		char buf[1024];
   227 }
   227 }
   228 
   228 
   229 /*ARGSUSED*/
   229 /*ARGSUSED*/
   230 conerr_t
   230 conerr_t
   231 interface_Time_read_sufficientlyPrivileged(rad_instance_t *inst,
   231 interface_Time_read_sufficientlyPrivileged(rad_instance_t *inst,
   232     adr_attribute_t *attr, data_t **data, data_t **error)
   232     adr_attribute_t *attr, adr_data_t **data, adr_data_t **error)
   233 {
   233 {
   234 	/* XXX: Crude */
   234 	/* XXX: Crude */
   235 	*data = data_new_boolean(getuid() == 0);
   235 	*data = adr_data_new_boolean(getuid() == 0);
   236 	return (ce_ok);
   236 	return (ce_ok);
   237 }
   237 }
   238 
   238 
   239 /*ARGSUSED*/
   239 /*ARGSUSED*/
   240 conerr_t
   240 conerr_t
   241 interface_Time_read_continents(rad_instance_t *inst, adr_attribute_t *attr,
   241 interface_Time_read_continents(rad_instance_t *inst, adr_attribute_t *attr,
   242     data_t **data, data_t **error)
   242     adr_data_t **data, adr_data_t **error)
   243 {
   243 {
   244 	FILE *file = fopen("/usr/share/lib/zoneinfo/tab/continent.tab", "r");
   244 	FILE *file = fopen("/usr/share/lib/zoneinfo/tab/continent.tab", "r");
   245 	char str[1024];
   245 	char str[1024];
   246 	data_t *result = data_new_array(&t_array__Continent, 5);
   246 	adr_data_t *result = adr_data_new_array(&t_array__Continent, 5);
   247 	while (fgets(str, sizeof (str), file) != NULL) {
   247 	while (fgets(str, sizeof (str), file) != NULL) {
   248 		if (str[0] == '#')
   248 		if (str[0] == '#')
   249 			continue;
   249 			continue;
   250 		removenl(str);
   250 		removenl(str);
   251 
   251 
   252 		char *eq = strchr(str, '\t');
   252 		char *eq = strchr(str, '\t');
   253 		if (eq == NULL)
   253 		if (eq == NULL)
   254 			continue;
   254 			continue;
   255 		data_t *name = data_new_nstring(str, eq - str);
   255 		adr_data_t *name = adr_data_new_nstring(str, eq - str);
   256 		data_t *desc = data_new_string(eq + 1, lt_copy);
   256 		adr_data_t *desc = adr_data_new_string(eq + 1, LT_COPY);
   257 		data_t *cont = data_new_struct(&t__Continent);
   257 		adr_data_t *cont = adr_data_new_struct(&t__Continent);
   258 		struct_set(cont, "name", name);
   258 		adr_struct_set(cont, "name", name);
   259 		struct_set(cont, "description", desc);
   259 		adr_struct_set(cont, "description", desc);
   260 		(void) array_add(result, cont);
   260 		(void) adr_array_add(result, cont);
   261 	}
   261 	}
   262 	(void) fclose(file);
   262 	(void) fclose(file);
   263 	*data = result;
   263 	*data = result;
   264 
   264 
   265 	return (ce_ok);
   265 	return (ce_ok);
   266 }
   266 }
   267 
   267 
   268 /*ARGSUSED*/
   268 /*ARGSUSED*/
   269 conerr_t
   269 conerr_t
   270 interface_Time_read_countries(rad_instance_t *inst, adr_attribute_t *attr,
   270 interface_Time_read_countries(rad_instance_t *inst, adr_attribute_t *attr,
   271     data_t **data, data_t **error)
   271     adr_data_t **data, adr_data_t **error)
   272 {
   272 {
   273 	FILE *file = fopen("/usr/share/lib/zoneinfo/tab/country.tab", "r");
   273 	FILE *file = fopen("/usr/share/lib/zoneinfo/tab/country.tab", "r");
   274 	char str[1024];
   274 	char str[1024];
   275 	data_t *result = data_new_array(&t_array__Country, 5);
   275 	adr_data_t *result = adr_data_new_array(&t_array__Country, 5);
   276 	while (fgets(str, sizeof (str), file) != NULL) {
   276 	while (fgets(str, sizeof (str), file) != NULL) {
   277 		if (str[0] == '#')
   277 		if (str[0] == '#')
   278 			continue;
   278 			continue;
   279 		removenl(str);
   279 		removenl(str);
   280 
   280 
   283 			continue;
   283 			continue;
   284 		if (rad_strccmp("ee", str, eq - str) == 0 ||
   284 		if (rad_strccmp("ee", str, eq - str) == 0 ||
   285 		    rad_strccmp("we", str, eq - str) == 0 ||
   285 		    rad_strccmp("we", str, eq - str) == 0 ||
   286 		    rad_strccmp("me", str, eq - str) == 0)
   286 		    rad_strccmp("me", str, eq - str) == 0)
   287 			continue;
   287 			continue;
   288 		data_t *code = data_new_nstring(str, eq - str);
   288 		adr_data_t *code = adr_data_new_nstring(str, eq - str);
   289 		data_t *desc = data_new_string(eq + 1, lt_copy);
   289 		adr_data_t *desc = adr_data_new_string(eq + 1, LT_COPY);
   290 		data_t *country = data_new_struct(&t__Country);
   290 		adr_data_t *country = adr_data_new_struct(&t__Country);
   291 		struct_set(country, "code", code);
   291 		adr_struct_set(country, "code", code);
   292 		struct_set(country, "description", desc);
   292 		adr_struct_set(country, "description", desc);
   293 		(void) array_add(result, country);
   293 		(void) adr_array_add(result, country);
   294 	}
   294 	}
   295 	(void) fclose(file);
   295 	(void) fclose(file);
   296 	*data = result;
   296 	*data = result;
   297 
   297 
   298 	return (ce_ok);
   298 	return (ce_ok);
   324 		const char *fmt = (len & 1) ? "%3u%2u" : "%2u%2u";
   324 		const char *fmt = (len & 1) ? "%3u%2u" : "%2u%2u";
   325 		return (sscanf(str, fmt, &c->deg, &c->min) == 2);
   325 		return (sscanf(str, fmt, &c->deg, &c->min) == 2);
   326 	}
   326 	}
   327 }
   327 }
   328 
   328 
   329 static data_t *
   329 static adr_data_t *
   330 parse_coords(const char *str, int len)
   330 parse_coords(const char *str, int len)
   331 {
   331 {
   332 	int isnorth, iseast;
   332 	int isnorth, iseast;
   333 
   333 
   334 	if (len > 0 && str[0] == '+')
   334 	if (len > 0 && str[0] == '+')
   352 
   352 
   353 	if (!parse_coord(str, eq - str, &north) ||
   353 	if (!parse_coord(str, eq - str, &north) ||
   354 	    !parse_coord(eq + 1, len - (eq - str + 1), &east))
   354 	    !parse_coord(eq + 1, len - (eq - str + 1), &east))
   355 		return (NULL);
   355 		return (NULL);
   356 
   356 
   357 	data_t *result = data_new_struct(&t__Coordinates);
   357 	adr_data_t *result = adr_data_new_struct(&t__Coordinates);
   358 	struct_set(result, "degreesE", data_new_integer(east.deg * iseast));
   358 	adr_struct_set(result, "degreesE",
   359 	struct_set(result, "minutesE", data_new_integer(east.min));
   359 	    adr_data_new_integer(east.deg * iseast));
   360 	struct_set(result, "secondsE", data_new_integer(east.sec));
   360 	adr_struct_set(result, "minutesE", adr_data_new_integer(east.min));
   361 	struct_set(result, "degreesN", data_new_integer(north.deg * isnorth));
   361 	adr_struct_set(result, "secondsE", adr_data_new_integer(east.sec));
   362 	struct_set(result, "minutesN", data_new_integer(north.min));
   362 	adr_struct_set(result, "degreesN",
   363 	struct_set(result, "secondsN", data_new_integer(north.sec));
   363 	    adr_data_new_integer(north.deg * isnorth));
       
   364 	adr_struct_set(result, "minutesN", adr_data_new_integer(north.min));
       
   365 	adr_struct_set(result, "secondsN", adr_data_new_integer(north.sec));
   364 	return (result);
   366 	return (result);
   365 }
   367 }
   366 
   368 
   367 /*ARGSUSED*/
   369 /*ARGSUSED*/
   368 conerr_t
   370 conerr_t
   369 interface_Time_read_timeZones(rad_instance_t *inst, adr_attribute_t *attr,
   371 interface_Time_read_timeZones(rad_instance_t *inst, adr_attribute_t *attr,
   370     data_t **data, data_t **error)
   372     adr_data_t **data, adr_data_t **error)
   371 {
   373 {
   372 	FILE *file = fopen("/usr/share/lib/zoneinfo/tab/zone_sun.tab", "r");
   374 	FILE *file = fopen("/usr/share/lib/zoneinfo/tab/zone_sun.tab", "r");
   373 	char buf[1024];
   375 	char buf[1024];
   374 	data_t *result = data_new_array(&t_array__TimeZoneInfo, 5);
   376 	adr_data_t *result = adr_data_new_array(&t_array__TimeZoneInfo, 5);
   375 	while (fgets(buf, sizeof (buf), file) != NULL) {
   377 	while (fgets(buf, sizeof (buf), file) != NULL) {
   376 		char *str = buf;
   378 		char *str = buf;
   377 		if (str[0] == '#')
   379 		if (str[0] == '#')
   378 			continue;
   380 			continue;
   379 		removenl(str);
   381 		removenl(str);
   383 			continue;
   385 			continue;
   384 		if (rad_strccmp("ee", str, eq - str) == 0 ||
   386 		if (rad_strccmp("ee", str, eq - str) == 0 ||
   385 		    rad_strccmp("we", str, eq - str) == 0 ||
   387 		    rad_strccmp("we", str, eq - str) == 0 ||
   386 		    rad_strccmp("me", str, eq - str) == 0)
   388 		    rad_strccmp("me", str, eq - str) == 0)
   387 			continue;
   389 			continue;
   388 		data_t *timezone = data_new_struct(&t__TimeZoneInfo);
   390 		adr_data_t *timezone = adr_data_new_struct(&t__TimeZoneInfo);
   389 		struct_set(timezone, "countryCode",
   391 		adr_struct_set(timezone, "countryCode",
   390 		    data_new_nstring(str, eq - str));
   392 		    adr_data_new_nstring(str, eq - str));
   391 
   393 
   392 		str = eq + 1;
   394 		str = eq + 1;
   393 		eq = strchr(str, '\t');
   395 		eq = strchr(str, '\t');
   394 		data_t *coords;
   396 		adr_data_t *coords;
   395 		if (eq == NULL ||
   397 		if (eq == NULL ||
   396 		    (coords = parse_coords(str, eq - str)) == NULL) {
   398 		    (coords = parse_coords(str, eq - str)) == NULL) {
   397 			data_free(timezone);
   399 			adr_data_free(timezone);
   398 			continue;
   400 			continue;
   399 		}
   401 		}
   400 		struct_set(timezone, "coordinates", coords);
   402 		adr_struct_set(timezone, "coordinates", coords);
   401 
   403 
   402 		str = eq + 1;
   404 		str = eq + 1;
   403 		eq = strchr(str, '\t');
   405 		eq = strchr(str, '\t');
   404 		data_t *tz = eq != NULL ? data_new_nstring(str, eq - str) :
   406 		adr_data_t *tz = eq != NULL ?
   405 		    data_new_string(str, lt_copy);
   407 		    adr_data_new_nstring(str, eq - str) :
   406 		struct_set(timezone, "name", tz);
   408 		    adr_data_new_string(str, LT_COPY);
       
   409 		adr_struct_set(timezone, "name", tz);
   407 		if (eq == NULL)
   410 		if (eq == NULL)
   408 			goto done;
   411 			goto done;
   409 
   412 
   410 		str = eq + 1;
   413 		str = eq + 1;
   411 		eq = strchr(str, '\t');
   414 		eq = strchr(str, '\t');
   412 		if (eq != NULL) {
   415 		if (eq != NULL) {
   413 			if (rad_strccmp("-", str, eq - str) != 0)
   416 			if (rad_strccmp("-", str, eq - str) != 0)
   414 				struct_set(timezone, "altName",
   417 				adr_struct_set(timezone, "altName",
   415 				    data_new_nstring(str, eq - str));
   418 				    adr_data_new_nstring(str, eq - str));
   416 		} else {
   419 		} else {
   417 			if (strcmp("-", str) != 0)
   420 			if (strcmp("-", str) != 0)
   418 				struct_set(timezone, "altName",
   421 				adr_struct_set(timezone, "altName",
   419 				    data_new_string(str, lt_copy));
   422 				    adr_data_new_string(str, LT_COPY));
   420 			goto done;
   423 			goto done;
   421 		}
   424 		}
   422 
   425 
   423 		str = eq + 1;
   426 		str = eq + 1;
   424 		if (*str != '\0' && strcmp(str, "-") != 0)
   427 		if (*str != '\0' && strcmp(str, "-") != 0)
   425 			struct_set(timezone, "comments",
   428 			adr_struct_set(timezone, "comments",
   426 			    data_new_string(str, lt_copy));
   429 			    adr_data_new_string(str, LT_COPY));
   427 
   430 
   428 done:
   431 done:
   429 		(void) array_add(result, timezone);
   432 		(void) adr_array_add(result, timezone);
   430 	}
   433 	}
   431 	(void) fclose(file);
   434 	(void) fclose(file);
   432 	*data = result;
   435 	*data = result;
   433 
   436 
   434 	return (ce_ok);
   437 	return (ce_ok);
   435 }
   438 }
   436 
   439 
   437 /*ARGSUSED*/
   440 /*ARGSUSED*/
   438 conerr_t
   441 conerr_t
   439 interface_Time_write_ntpServers(rad_instance_t *inst, adr_attribute_t *attr,
   442 interface_Time_write_ntpServers(rad_instance_t *inst, adr_attribute_t *attr,
   440     data_t *data, data_t **error)
   443     adr_data_t *data, adr_data_t **error)
   441 {
   444 {
   442 	FILE *from, *to, *tmp; /* Read, write, & temp files */
   445 	FILE *from, *to, *tmp; /* Read, write, & temp files */
   443 	int err = 0; /* Indicates an error */
   446 	int err = 0; /* Indicates an error */
   444 	int size = 256; /* Buffer size */
   447 	int size = 256; /* Buffer size */
   445 	char buffer[size]; /* Read buffer */
   448 	char buffer[size]; /* Read buffer */
   486 		err = errno;
   489 		err = errno;
   487 		(void) fclose(tmp);
   490 		(void) fclose(tmp);
   488 		goto errorout;
   491 		goto errorout;
   489 	}
   492 	}
   490 
   493 
   491 	for (int i = 0; i < array_size(data); i++) {
   494 	for (int i = 0; i < adr_array_size(data); i++) {
   492 		data_t *entry = array_get(data, i);
   495 		adr_data_t *entry = adr_array_get(data, i);
   493 		data_t *enabled = struct_get(entry, "enabled");
   496 		adr_data_t *enabled = adr_struct_get(entry, "enabled");
   494 		data_t *server = struct_get(entry, "server");
   497 		adr_data_t *server = adr_struct_get(entry, "server");
   495 		if (fprintf(tmp,
   498 		if (fprintf(tmp,
   496 		    data_to_boolean(enabled) ? "server %s\n" : "# server %s\n",
   499 		    adr_data_to_boolean(enabled) ? "server %s\n" :
   497 		    data_to_string(server)) < 0)
   500 		    "# server %s\n", adr_data_to_string(server)) < 0)
   498 			goto writefailed;
   501 			goto writefailed;
   499 	}
   502 	}
   500 	if (fclose(tmp) == EOF)
   503 	if (fclose(tmp) == EOF)
   501 		goto writefailed;
   504 		goto writefailed;
   502 
   505