Problem with getuid() -- same as geteuid()?!
Steven Winikoff
smw at maxwell.Concordia.CA
Thu Feb 8 06:15:29 AEST 1990
First, my apologies if this gets posted twice. The first one apparently
vanished into the bit bucket.
In article <5315 at star.cs.vu.nl> maart at cs.vu.nl (Maarten Litmaath) writes:
>In article <1837 at clyde.concordia.ca>,
> smw at maxwell.Concordia.CA ( Steven Winikoff ) writes:
>\My problem is that there are several people at our site who are legitimately
>\able to su root, working on different projects at the same time (perhaps
>\that's a bad idea, but it's not under my control). In any case, the idea
>\is to find some way to identify our printed output, [...]
>
>But that's precisely what UCB's lpr does! By means of getlogin()! :-(
True. But if I could use lpr in the first place, none of this would have
arisen... :-) Fact is that the printer I'm trying to reach is connected
to a CDC Cyber under NOS (CDC's proprietary OS, for those unfamiliar with
Control Data). The Cyber is connected to a VMS VAX 8550 via JNET, and my Unix
system is connected to the VAX via a MicroVAX running Ultrix! Are you now as
confused as I am? If not, all you have to do is reread the above paragraph a
couple of dozen times, and then your head will be spinning just like mine! :-)
No, there's no way I can get a printer closer than that. :-(
And no, there's no way (at least none that our Powers That Be will agree to
finance!) to bridge the gap between Unix and the Cyber directly. :-(
So I'm stuck with writing an application that wants to send a file to the VAX
via ftp, along with instructions re what to do with it when it gets there.
A client process on the VAX takes the file and automagically routes it over
the JNET link. (The VAX/Cyber link is maintained by our local VMS guru. My
personal VMS knowledge ranges between poor and non-existent.)
That's why I need some reliable way of determining who *really* sent a given
file, simply because I'd like to be able to recognize my own output when I
get it!
When I began all this, I naively thought that getuid would do it for me.
Now I know that it won't. Based on the suggestions of all the kind people
who have so far responded to me, it seems that the best I can do in the case
where getuid returns 0 is a tiered approach which begins with getlogin and
falls back on logname (== value of $USER) when getlogin fails.
>Anyway, you could always replace lpr by something like this:
>
> #include <pwd.h>
> #include <stdio.h>
>
> char My_lpr[] = "/path/of/my_lpr";
>
> main(argc, argv)
> int argc;
> char **argv;
> {
> char *getenv(), *lprname = getenv("LPRNAME");
> struct passwd *pw;
>
> if (lprname) {
> if (!(pw = getpwnam(lprname)))
> fprintf(stderr,
> "You don't exist. Go away.\n");
> else if (setuid(pw->pw_uid) != 0)
> perror("setuid");
> }
> argv[0] = My_lpr;
> execv(My_lpr, argv);
> perror(My_lpr);
> exit(1);
> }
>
>...where `my_lpr' is:
>
> #!/bin/sh
>
> exec 3>&1
>
> test -t 0 && exec < /dev/null
>
> (/usr/ucb/lpr ${1+"$@"} | cat >&3) 2>&1 | cat >&2
I'm not quite sure I understand your code. Who sets LPRNAME? In "my_lpr",
what gets exec'd in line 2? Please excuse my ignorance, I'm only a wizard
wanna-be!
>--
> The meek get the earth, Henry the moon, the rest of us have other plans. |
> Maarten Litmaath @ VU Amsterdam: maart at cs.vu.nl, uunet!mcsun!botter!maart
Love your .sig!
------------------------------------------------------------------------
Steven Winikoff smw at maxwell.concordia.ca
Software Analyst
Concordia University Computer Centre voice: (514) 848-7619
Montreal, Quebec, Canada (10:00-18:00 EST)
More information about the Comp.unix.questions
mailing list