diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c index fb72bb6cfe..6161df2790 100644 --- a/contrib/hstore/hstore_io.c +++ b/contrib/hstore/hstore_io.c @@ -1325,7 +1325,7 @@ hstore_to_json_loose(PG_FUNCTION_ARGS) } appendStringInfoChar(&dst, '}'); - PG_RETURN_TEXT_P(cstring_to_text(dst.data)); + PG_RETURN_TEXT_P(cstring_to_text_with_len(dst.data, dst.len)); } PG_FUNCTION_INFO_V1(hstore_to_json); @@ -1370,7 +1370,7 @@ hstore_to_json(PG_FUNCTION_ARGS) } appendStringInfoChar(&dst, '}'); - PG_RETURN_TEXT_P(cstring_to_text(dst.data)); + PG_RETURN_TEXT_P(cstring_to_text_with_len(dst.data, dst.len)); } PG_FUNCTION_INFO_V1(hstore_to_jsonb); diff --git a/contrib/sepgsql/schema.c b/contrib/sepgsql/schema.c index fecd02f07a..9e408cf571 100644 --- a/contrib/sepgsql/schema.c +++ b/contrib/sepgsql/schema.c @@ -84,7 +84,7 @@ sepgsql_schema_post_create(Oid namespaceId) * check db_schema:{create} */ initStringInfo(&audit_name); - appendStringInfo(&audit_name, "%s", quote_identifier(nsp_name)); + appendStringInfoString(&audit_name, quote_identifier(nsp_name)); sepgsql_avc_check_perms_label(ncontext, SEPG_CLASS_DB_SCHEMA, SEPG_DB_SCHEMA__CREATE, diff --git a/src/backend/access/rmgrdesc/xlogdesc.c b/src/backend/access/rmgrdesc/xlogdesc.c index 6fec4853f1..3fd7185f21 100644 --- a/src/backend/access/rmgrdesc/xlogdesc.c +++ b/src/backend/access/rmgrdesc/xlogdesc.c @@ -319,9 +319,9 @@ XLogRecGetBlockRefInfo(XLogReaderState *record, bool pretty, *fpi_len += XLogRecGetBlock(record, block_id)->bimg_len; if (XLogRecBlockImageApply(record, block_id)) - appendStringInfo(buf, " FPW"); + appendStringInfoString(buf, " FPW"); else - appendStringInfo(buf, " FPW for WAL verification"); + appendStringInfoString(buf, " FPW for WAL verification"); } } } diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index 635d05405e..6fa9a573f0 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -347,7 +347,7 @@ filter_list_to_array(List *filterlist) result = pstrdup(value); for (p = result; *p; p++) *p = pg_ascii_toupper((unsigned char) *p); - data[i++] = PointerGetDatum(cstring_to_text(result)); + data[i++] = PointerGetDatum(cstring_to_text_with_len(result, p - result)); pfree(result); } diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c index 6c72d43beb..fd3eecf27d 100644 --- a/src/backend/jit/llvm/llvmjit.c +++ b/src/backend/jit/llvm/llvmjit.c @@ -514,7 +514,7 @@ llvm_function_reference(LLVMJitContext *context, else if (basename != NULL) { /* internal function */ - funcname = psprintf("%s", basename); + funcname = pstrdup(basename); } else { diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 1664fcee2a..e75611fdd5 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -4457,7 +4457,7 @@ BackendInitialize(Port *port) appendStringInfo(&ps_data, "%s ", port->user_name); if (!am_walsender) appendStringInfo(&ps_data, "%s ", port->database_name); - appendStringInfo(&ps_data, "%s", port->remote_host); + appendStringInfoString(&ps_data, port->remote_host); if (port->remote_port[0] != '\0') appendStringInfo(&ps_data, "(%s)", port->remote_port); diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index 91ba49a14b..8514835ff4 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -769,7 +769,7 @@ fetch_remote_table_info(char *nspname, char *relname, foreach(lc, MySubscription->publications) { if (foreach_current_index(lc) > 0) - appendStringInfo(&pub_names, ", "); + appendStringInfoString(&pub_names, ", "); appendStringInfoString(&pub_names, quote_literal_cstr(strVal(lfirst(lc)))); } @@ -1062,7 +1062,7 @@ copy_table(Relation rel) appendStringInfoString(&cmd, quote_identifier(lrel.attnames[i])); } - appendStringInfo(&cmd, ") TO STDOUT"); + appendStringInfoString(&cmd, ") TO STDOUT"); } else { diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c index 495e449a9e..313947c4ec 100644 --- a/src/backend/utils/adt/arrayfuncs.c +++ b/src/backend/utils/adt/arrayfuncs.c @@ -1704,7 +1704,7 @@ array_dims(PG_FUNCTION_ARGS) p += strlen(p); } - PG_RETURN_TEXT_P(cstring_to_text(buf)); + PG_RETURN_TEXT_P(cstring_to_text_with_len(buf, p - buf)); } /* diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c index 081dfa2450..a2bdde0459 100644 --- a/src/backend/utils/adt/date.c +++ b/src/backend/utils/adt/date.c @@ -96,7 +96,7 @@ anytime_typmodout(bool istz, int32 typmod) if (typmod >= 0) return psprintf("(%d)%s", (int) typmod, tz); else - return psprintf("%s", tz); + return pstrdup(tz); } diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c index d35b5d1f4f..55c947df9f 100644 --- a/src/backend/utils/adt/misc.c +++ b/src/backend/utils/adt/misc.c @@ -219,7 +219,7 @@ pg_tablespace_databases(PG_FUNCTION_ARGS) } if (tablespaceOid == DEFAULTTABLESPACE_OID) - location = psprintf("base"); + location = pstrdup("base"); else location = psprintf("pg_tblspc/%u/%s", tablespaceOid, TABLESPACE_VERSION_DIRECTORY); diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 6594a9aac7..2b7b1b0c0f 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -1453,7 +1453,7 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, appendStringInfoChar(&buf, ')'); if (idxrec->indnullsnotdistinct) - appendStringInfo(&buf, " NULLS NOT DISTINCT"); + appendStringInfoString(&buf, " NULLS NOT DISTINCT"); /* * If it has options, append "WITH (options)" @@ -2332,9 +2332,9 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, Anum_pg_constraint_confdelsetcols, &isnull); if (!isnull) { - appendStringInfo(&buf, " ("); + appendStringInfoString(&buf, " ("); decompile_column_index_array(val, conForm->conrelid, &buf); - appendStringInfo(&buf, ")"); + appendStringInfoChar(&buf, ')'); } break; @@ -2363,7 +2363,7 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, ((Form_pg_index) GETSTRUCT(indtup))->indnullsnotdistinct) appendStringInfoString(&buf, "NULLS NOT DISTINCT "); - appendStringInfoString(&buf, "("); + appendStringInfoChar(&buf, '('); /* Fetch and build target column list */ val = SysCacheGetAttr(CONSTROID, tup, @@ -3583,7 +3583,7 @@ pg_get_function_sqlbody(PG_FUNCTION_ARGS) ReleaseSysCache(proctup); - PG_RETURN_TEXT_P(cstring_to_text(buf.data)); + PG_RETURN_TEXT_P(cstring_to_text_with_len(buf.data, buf.len)); } diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 49cdb290ac..021b760f4e 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -131,7 +131,7 @@ anytimestamp_typmodout(bool istz, int32 typmod) if (typmod >= 0) return psprintf("(%d)%s", (int) typmod, tz); else - return psprintf("%s", tz); + return pstrdup(tz); } diff --git a/src/bin/pg_amcheck/pg_amcheck.c b/src/bin/pg_amcheck/pg_amcheck.c index 3cff319f02..0356e132db 100644 --- a/src/bin/pg_amcheck/pg_amcheck.c +++ b/src/bin/pg_amcheck/pg_amcheck.c @@ -1509,7 +1509,7 @@ append_db_pattern_cte(PQExpBuffer buf, const PatternInfoArray *pia, have_values = true; appendPQExpBuffer(buf, "%s\n(%d, ", comma, pattern_id); appendStringLiteralConn(buf, info->db_regex, conn); - appendPQExpBufferStr(buf, ")"); + appendPQExpBufferChar(buf, ')'); comma = ","; } } @@ -1765,7 +1765,7 @@ append_rel_pattern_raw_cte(PQExpBuffer buf, const PatternInfoArray *pia, appendPQExpBufferStr(buf, ", true::BOOLEAN"); else appendPQExpBufferStr(buf, ", false::BOOLEAN"); - appendPQExpBufferStr(buf, ")"); + appendPQExpBufferChar(buf, ')'); comma = ","; } diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index d25709ad5f..e1e63cad91 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -2845,14 +2845,14 @@ dumpDatabase(Archive *fout) "datacl, acldefault('d', datdba) AS acldefault, " "datistemplate, datconnlimit, "); if (fout->remoteVersion >= 90300) - appendPQExpBuffer(dbQry, "datminmxid, "); + appendPQExpBufferStr(dbQry, "datminmxid, "); else - appendPQExpBuffer(dbQry, "0 AS datminmxid, "); + appendPQExpBufferStr(dbQry, "0 AS datminmxid, "); if (fout->remoteVersion >= 150000) - appendPQExpBuffer(dbQry, "datlocprovider, daticulocale, datcollversion, "); + appendPQExpBufferStr(dbQry, "datlocprovider, daticulocale, datcollversion, "); else - appendPQExpBuffer(dbQry, "'c' AS datlocprovider, NULL AS daticulocale, NULL AS datcollversion, "); - appendPQExpBuffer(dbQry, + appendPQExpBufferStr(dbQry, "'c' AS datlocprovider, NULL AS daticulocale, NULL AS datcollversion, "); + appendPQExpBufferStr(dbQry, "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, " "shobj_description(oid, 'pg_database') AS description " "FROM pg_database " @@ -3685,9 +3685,9 @@ getPolicies(Archive *fout, TableInfo tblinfo[], int numTables) printfPQExpBuffer(query, "SELECT pol.oid, pol.tableoid, pol.polrelid, pol.polname, pol.polcmd, "); if (fout->remoteVersion >= 100000) - appendPQExpBuffer(query, "pol.polpermissive, "); + appendPQExpBufferStr(query, "pol.polpermissive, "); else - appendPQExpBuffer(query, "'t' as polpermissive, "); + appendPQExpBufferStr(query, "'t' as polpermissive, "); appendPQExpBuffer(query, "CASE WHEN pol.polroles = '{0}' THEN NULL ELSE " " pg_catalog.array_to_string(ARRAY(SELECT pg_catalog.quote_ident(rolname) from pg_catalog.pg_roles WHERE oid = ANY(pol.polroles)), ', ') END AS polroles, " @@ -4045,7 +4045,7 @@ dumpPublication(Archive *fout, const PublicationInfo *pubinfo) first = false; } - appendPQExpBufferStr(query, "'"); + appendPQExpBufferChar(query, '\''); if (pubinfo->pubviaroot) appendPQExpBufferStr(query, ", publish_via_partition_root = true"); @@ -5477,7 +5477,7 @@ getCollations(Archive *fout, int *numCollations) * system-defined collations at dump-out time. */ - appendPQExpBuffer(query, "SELECT tableoid, oid, collname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, collname, " "collnamespace, " "collowner " "FROM pg_collation"); @@ -5545,7 +5545,7 @@ getConversions(Archive *fout, int *numConversions) * system-defined conversions at dump-out time. */ - appendPQExpBuffer(query, "SELECT tableoid, oid, conname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, conname, " "connamespace, " "conowner " "FROM pg_conversion"); @@ -5682,7 +5682,7 @@ getOpclasses(Archive *fout, int *numOpclasses) * system-defined opclasses at dump-out time. */ - appendPQExpBuffer(query, "SELECT tableoid, oid, opcname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, opcname, " "opcnamespace, " "opcowner " "FROM pg_opclass"); @@ -5750,7 +5750,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies) * system-defined opfamilies at dump-out time. */ - appendPQExpBuffer(query, "SELECT tableoid, oid, opfname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, opfname, " "opfnamespace, " "opfowner " "FROM pg_opfamily"); @@ -5856,7 +5856,7 @@ getAggregates(Archive *fout, int *numAggs) } else { - appendPQExpBuffer(query, "SELECT tableoid, oid, proname AS aggname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, proname AS aggname, " "pronamespace AS aggnamespace, " "pronargs, proargtypes, " "proowner, " @@ -6205,7 +6205,7 @@ getTables(Archive *fout, int *numTables) * wrong answers if any concurrent DDL is happening. */ - appendPQExpBuffer(query, + appendPQExpBufferStr(query, "SELECT c.tableoid, c.oid, c.relname, " "c.relnamespace, c.relkind, c.reltype, " "c.relowner, " @@ -6732,7 +6732,7 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) } appendPQExpBufferChar(tbloids, '}'); - appendPQExpBuffer(query, + appendPQExpBufferStr(query, "SELECT t.tableoid, t.oid, i.indrelid, " "t.relname AS indexname, " "pg_catalog.pg_get_indexdef(i.indexrelid) AS indexdef, " @@ -6747,14 +6747,14 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) if (fout->remoteVersion >= 90400) - appendPQExpBuffer(query, + appendPQExpBufferStr(query, "i.indisreplident, "); else - appendPQExpBuffer(query, + appendPQExpBufferStr(query, "false AS indisreplident, "); if (fout->remoteVersion >= 110000) - appendPQExpBuffer(query, + appendPQExpBufferStr(query, "inh.inhparent AS parentidx, " "i.indnkeyatts AS indnkeyatts, " "i.indnatts AS indnatts, " @@ -6767,7 +6767,7 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) " WHERE attrelid = i.indexrelid AND " " attstattarget >= 0) AS indstatvals, "); else - appendPQExpBuffer(query, + appendPQExpBufferStr(query, "0 AS parentidx, " "i.indnatts AS indnkeyatts, " "i.indnatts AS indnatts, " @@ -6775,10 +6775,10 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) "'' AS indstatvals, "); if (fout->remoteVersion >= 150000) - appendPQExpBuffer(query, + appendPQExpBufferStr(query, "i.indnullsnotdistinct "); else - appendPQExpBuffer(query, + appendPQExpBufferStr(query, "false AS indnullsnotdistinct "); /* @@ -7002,11 +7002,11 @@ getExtendedStatistics(Archive *fout) query = createPQExpBuffer(); if (fout->remoteVersion < 130000) - appendPQExpBuffer(query, "SELECT tableoid, oid, stxname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, stxname, " "stxnamespace, stxowner, (-1) AS stxstattarget " "FROM pg_catalog.pg_statistic_ext"); else - appendPQExpBuffer(query, "SELECT tableoid, oid, stxname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, stxname, " "stxnamespace, stxowner, stxstattarget " "FROM pg_catalog.pg_statistic_ext"); @@ -7729,7 +7729,7 @@ getEventTriggers(Archive *fout, int *numEventTriggers) query = createPQExpBuffer(); - appendPQExpBuffer(query, + appendPQExpBufferStr(query, "SELECT e.tableoid, e.oid, evtname, evtenabled, " "evtevent, evtowner, " "array_to_string(array(" @@ -7809,7 +7809,7 @@ getProcLangs(Archive *fout, int *numProcLangs) int i_acldefault; int i_lanowner; - appendPQExpBuffer(query, "SELECT tableoid, oid, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, " "lanname, lanpltrusted, lanplcallfoid, " "laninline, lanvalidator, " "lanacl, " @@ -8768,7 +8768,7 @@ getTSDictionaries(Archive *fout, int *numTSDicts) query = createPQExpBuffer(); - appendPQExpBuffer(query, "SELECT tableoid, oid, dictname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, dictname, " "dictnamespace, dictowner, " "dicttemplate, dictinitoption " "FROM pg_ts_dict"); @@ -8904,7 +8904,7 @@ getTSConfigurations(Archive *fout, int *numTSConfigs) query = createPQExpBuffer(); - appendPQExpBuffer(query, "SELECT tableoid, oid, cfgname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, cfgname, " "cfgnamespace, cfgowner, cfgparser " "FROM pg_ts_config"); @@ -8972,7 +8972,7 @@ getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers) query = createPQExpBuffer(); - appendPQExpBuffer(query, "SELECT tableoid, oid, fdwname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, fdwname, " "fdwowner, " "fdwhandler::pg_catalog.regproc, " "fdwvalidator::pg_catalog.regproc, " @@ -9063,7 +9063,7 @@ getForeignServers(Archive *fout, int *numForeignServers) query = createPQExpBuffer(); - appendPQExpBuffer(query, "SELECT tableoid, oid, srvname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, srvname, " "srvowner, " "srvfdw, srvtype, srvversion, srvacl, " "acldefault('S', srvowner) AS acldefault, " @@ -9167,7 +9167,7 @@ getDefaultACLs(Archive *fout, int *numDefaultACLs) * for the case of 'S' (DEFACLOBJ_SEQUENCE) which must be converted to * 's'. */ - appendPQExpBuffer(query, + appendPQExpBufferStr(query, "SELECT oid, tableoid, " "defaclrole, " "defaclnamespace, " @@ -15491,7 +15491,7 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo) appendStringLiteralAH(q, qualrelname, fout); appendPQExpBufferStr(q, "::pg_catalog.regclass,"); appendStringLiteralAH(q, tbinfo->attnames[j], fout); - appendPQExpBufferStr(q, ","); + appendPQExpBufferChar(q, ','); appendStringLiteralAH(q, tbinfo->attmissingval[j], fout); appendPQExpBufferStr(q, ");\n\n"); } @@ -16361,11 +16361,11 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo) } else { - appendPQExpBuffer(q, "%s", - coninfo->contype == 'p' ? "PRIMARY KEY" : "UNIQUE"); + appendPQExpBufferStr(q, + coninfo->contype == 'p' ? "PRIMARY KEY" : "UNIQUE"); if (indxinfo->indnullsnotdistinct) - appendPQExpBuffer(q, " NULLS NOT DISTINCT"); - appendPQExpBuffer(q, " ("); + appendPQExpBufferStr(q, " NULLS NOT DISTINCT"); + appendPQExpBufferStr(q, " ("); for (k = 0; k < indxinfo->indnkeyattrs; k++) { int indkey = (int) indxinfo->indkeys[k]; diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index d665b257c9..69ae027bd3 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -978,7 +978,7 @@ dumpRoleMembership(PGconn *conn) "ug.rolname AS grantor, " "a.admin_option"); if (dump_inherit_option) - appendPQExpBuffer(buf, ", a.inherit_option"); + appendPQExpBufferStr(buf, ", a.inherit_option"); appendPQExpBuffer(buf, " FROM pg_auth_members a " "LEFT JOIN %s ur on ur.oid = a.roleid " "LEFT JOIN %s um on um.oid = a.member " diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 9aadcaad71..c749349468 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -3512,8 +3512,7 @@ printVerboseErrorMessages(CState *st, pg_time_usec_t *now, bool is_retry) resetPQExpBuffer(buf); printfPQExpBuffer(buf, "client %d ", st->id); - appendPQExpBuffer(buf, "%s", - (is_retry ? + appendPQExpBufferStr(buf, (is_retry ? "repeats the transaction after the error" : "ends the failed transaction")); appendPQExpBuffer(buf, " (try %u", st->tries); diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 61188d96f2..a141146e70 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -4889,9 +4889,9 @@ pset_value_string(const char *param, printQueryOpt *popt) else if (strcmp(param, "footer") == 0) return pstrdup(pset_bool_string(popt->topt.default_footer)); else if (strcmp(param, "format") == 0) - return psprintf("%s", _align2string(popt->topt.format)); + return pstrdup(_align2string(popt->topt.format)); else if (strcmp(param, "linestyle") == 0) - return psprintf("%s", get_line_style(&popt->topt)->name); + return pstrdup(get_line_style(&popt->topt)->name); else if (strcmp(param, "null") == 0) return pset_quoted_string(popt->nullPrint ? popt->nullPrint diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 327a69487b..153b095e6b 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -2148,7 +2148,7 @@ describeOneTableDetails(const char *schemaname, "SELECT inhparent::pg_catalog.regclass,\n" " pg_catalog.pg_get_expr(c.relpartbound, c.oid),\n "); - appendPQExpBuffer(&buf, + appendPQExpBufferStr(&buf, pset.sversion >= 140000 ? "inhdetachpending" : "false as inhdetachpending"); @@ -2311,7 +2311,7 @@ describeOneTableDetails(const char *schemaname, printfPQExpBuffer(&tmpbuf, _("unique")); if (strcmp(indnullsnotdistinct, "t") == 0) appendPQExpBufferStr(&tmpbuf, _(" nulls not distinct")); - appendPQExpBuffer(&tmpbuf, _(", ")); + appendPQExpBufferStr(&tmpbuf, _(", ")); } else resetPQExpBuffer(&tmpbuf);