88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.54 2000/09/06 14:15:22 petere Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.55 2000/09/19 18:17:57 petere Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -272,50 +272,65 @@ convertstr(unsigned char *buff, int len, int dest)
272272
273273#endif
274274
275- /* ----------------
276- *GetPgUserName
277- * ----------------
278- */
279- char *
280- GetPgUserName (void )
281- {
282- HeapTuple tuple ;
283- Oid userid ;
284-
285- userid = GetUserId ();
286-
287- tuple = SearchSysCacheTuple (SHADOWSYSID ,ObjectIdGetDatum (userid ),0 ,0 ,0 );
288- if (!HeapTupleIsValid (tuple ))
289- elog (ERROR ,"invalid user id %u" , (unsigned )userid );
290-
291- return pstrdup (NameStr (((Form_pg_shadow )GETSTRUCT (tuple ))-> usename ) );
292- }
293275
294276
295277/* ----------------------------------------------------------------
296- *GetUserId and SetUserId
278+ * User ID things
279+ *
280+ * The session user is determined at connection start and never
281+ * changes. The current user may change when "setuid" functions
282+ * are implemented. Conceptually there is a stack, whose bottom
283+ * is the session user. You are yourself responsible to save and
284+ * restore the current user id if you need to change it.
297285 * ----------------------------------------------------------------
298286 */
299- static Oid UserId = InvalidOid ;
287+ static Oid CurrentUserId = InvalidOid ;
288+ static Oid SessionUserId = InvalidOid ;
300289
301290
291+ /*
292+ * This function is relevant for all privilege checks.
293+ */
302294Oid
303- GetUserId ()
295+ GetUserId (void )
304296{
305- AssertState (OidIsValid (UserId ));
306- return UserId ;
297+ AssertState (OidIsValid (CurrentUserId ));
298+ return CurrentUserId ;
307299}
308300
309301
310302void
311303SetUserId (Oid newid )
312304{
313- UserId = newid ;
305+ AssertArg (OidIsValid (newid ));
306+ CurrentUserId = newid ;
307+ }
308+
309+
310+ /*
311+ * This value is only relevant for informational purposes.
312+ */
313+ Oid
314+ GetSessionUserId (void )
315+ {
316+ AssertState (OidIsValid (SessionUserId ));
317+ return SessionUserId ;
318+ }
319+
320+
321+ void
322+ SetSessionUserId (Oid newid )
323+ {
324+ AssertArg (OidIsValid (newid ));
325+ SessionUserId = newid ;
326+ /* Current user defaults to session user. */
327+ if (!OidIsValid (CurrentUserId ))
328+ CurrentUserId = newid ;
314329}
315330
316331
317332void
318- SetUserIdFromUserName (const char * username )
333+ SetSessionUserIdFromUserName (const char * username )
319334{
320335HeapTuple userTup ;
321336
@@ -330,13 +345,30 @@ SetUserIdFromUserName(const char *username)
3303450 ,0 ,0 );
331346if (!HeapTupleIsValid (userTup ))
332347elog (FATAL ,"user \"%s\" does not exist" ,username );
333- SetUserId ( ((Form_pg_shadow )GETSTRUCT (userTup ))-> usesysid );
348+ SetSessionUserId ( ((Form_pg_shadow )GETSTRUCT (userTup ))-> usesysid );
334349}
335350
336351
352+ /*
353+ * Get user name from user id
354+ */
355+ char *
356+ GetUserName (Oid userid )
357+ {
358+ HeapTuple tuple ;
359+
360+ tuple = SearchSysCacheTuple (SHADOWSYSID ,ObjectIdGetDatum (userid ),0 ,0 ,0 );
361+ if (!HeapTupleIsValid (tuple ))
362+ elog (ERROR ,"invalid user id %u" , (unsigned )userid );
363+
364+ return pstrdup (NameStr (((Form_pg_shadow )GETSTRUCT (tuple ))-> usename ) );
365+ }
366+
367+
368+
337369/*-------------------------------------------------------------------------
338370 *
339- *posmaster pid file stuffs. $DATADIR/postmaster.pid is created when:
371+ *postmaster pid file stuffs. $DATADIR/postmaster.pid is created when:
340372 *
341373 *(1) postmaster starts. In this case pid > 0.
342374 *(2) postgres starts in standalone mode. In this case