On Sun, 16 Jul 2006, Gustavo Rios wrote: > Ok, here you have it:
I'm sorry, but I'm not gonna go though this bit flag mess. Until you come up with a simple (let's say less than 10 lines) piece of code to demonstrate the porblem you're seeing, my conclusion is the bug is hiding in your code. -Otto > > Code for apx_setuid : > #include <unistd.h> > > long > apx_setsid(void) > { > return setsid(); > } > > Code for apx_setpgid : > > #include <unistd.h> > > int > apx_setpgid(const long p, const long g) > { > return setpgid((pid_t)p, (pid_t)g); > } > > > Code for sux (main.c) : (the relevant part is option -s and function do_sid) > > #include <sys/types.h> > #include <grp.h> > #include <pwd.h> > > #include "abf.h" > #include "amp.h" > #include "apx.h" > #include "msc.h" > #include "rsc.h" > #include "sdb.h" > > extern int r2e __P((int)); > extern void wrn __P((int)), > die __P((int)); > > static int > do_env(const xlong f, const char *e) > { > struct amp a; > xlong n, x; > int r = 0; > > if (f) *apx_environ = NULL; > if (e) { > amp_opn(&a); > r = env_h2b(&a, e, apx_strlen(e)); > if (!r) for (e = a.b, n = a.s.x; n; e += x, n -= x) { > if (!(x = chr(e, n, '+'))) break; > if (r = apx_putenv(e + x)) break; > } > amp_cls(&a); > } > return r; > } > > static int > do_dir(const char * const d) > { > return d ? apx_chdir(d) : 0; > } > > static long > do_fork(const xlong f) > { > return f ? apx_fork() : 0l; > } > > static int > do_sid(const xlong f) > { > int r; > > if (r = 0, f & 1) > if (f & 2) { if (apx_setsid() == -1) r = -1; } > else r = apx_setpgid(0l, apx_getpid()); > > return r; > } > > static int > do_prio(const char * const s) > { > xlong x; > int r; > > if (r = 0, s) { > if (!scn_u(&x, s)) r = 5; > if (!r) r = apx_setprio(prio_process, 0l, (int)x); > } > return r; > } > > static int > do_ioe(const char * const s) > { > xlong x; > int r; > > if (r = 0, s) { > if (!scn_x(&x, s)) r = 5; > if (!r) r = apx_setioe((int)x, NULL, NULL); > } > return r; > } > > static int > do_rsc(const char * const s) > { > struct sdb sd; > struct rsc rs; > xlong i; > int r; > > rsc_opn(&rs); > sdb_opn(&sd); > r = s ? getrsc(&rs, &sd, s) : 0; > if (!r) for (i = 0; i < rs.sze.x; i++) > (void)apx_setrlmt(rs.rds[i].idx, &rs.rds[i].val); > sdb_cls(&sd); > rsc_cls(&rs); > return r; > } > > static int > do_crd(const char * const u, const char * const g, const char * const G) > { > struct passwd *pwd = NULL; > struct group *grp = NULL; > struct amp a; > xlong v; > xadk32_t s[ngroups_max]; > int r = 0; > char *p; > > if (u) if (!(pwd = getpwnam(u))) r = 4; > if (!r) if (g) if (!(grp = getgrnam(g))) r = 4; > if (!r) { > v = grp ? grp->gr_gid : pwd ? pwd->pw_gid : -1ul; > if (v + 1) r = apx_setgid(v); > } > > if (!r) if (G) { > amp_opn(&a); > r = amp_mem(&a, G, apx_strlen(G)); > if (!r) r = amp_chr(&a, '\0'); > if (!r) { > for (p = a.b; *p; p++) if (*p == ',') *p = '\0'; > for (v = 0, p = a.b; p - a.b < a.s.x; v++, p++) { > if (v == ngroups_max) break; > if (!(grp = getgrnam(p))) break; > s[v] = grp->gr_gid; > while (*p) p++; > } > if (p - a.b < a.s.x) if (v < ngroups_max) r = 4; > } > amp_cls(&a); > if (!r) if (!v) r = 5; > if (!r) r = apx_setgrp(s, v); > } > > if (!r) if (pwd) r = apx_setuid(0ul+pwd->pw_uid); > > return r; > } > > static int > do_exec(char **a) > { > (void)apx_execve(*a, a + 1, apx_environ); > return 2; > } > > static long > __chk(char *s[8]) > { > xlong n; > > for (n = 8; n; n--) if (s[n - 1]) break; > return n; > } > > int > main(int argc, char **argv) > { > xlong i, f; > int r; > char *s[8], > o[] = "fspeu:g:G:d:n:E:x:r:"; > > apx_memset(s, 0, sizeof s); > apx_opterr = 0; > i = f = 0; > > while ((r = apx_getopt(argc, argv, o)) + 1) > switch (r) { > case 'f' : f |= 1; break; > case 's' : f |= 2, f |= 4; break; > case 'p' : f |= 2, f &= ~4; break; > case 'e' : f |= 8; break; > case 'u' : s[0] = apx_optarg; break; > case 'g' : s[1] = apx_optarg; break; > case 'G' : s[2] = apx_optarg; break; > case 'd' : s[3] = apx_optarg; break; > case 'n' : s[4] = apx_optarg; break; > case 'E' : s[5] = apx_optarg; break; > case 'x' : s[6] = apx_optarg; break; > case 'r' : s[7] = apx_optarg; break; > } > argc -= apx_optind, argv += apx_optind; > > r = f || __chk(s) ? 0 : argc < 3 ? 1 : (s[0] = *argv++, argc--, 0); > > if (!r) r = do_env(f & 8, s[5]); > if (!r) r = do_dir(s[3]); > if (!r) if ((i = do_fork(f & 1)) == -1) r = -1; > /* from now on, only in the child context if forked */ > if (!i) { > if (!r) r = do_sid(f & 6 >> 1); > if (!r) r = do_prio(s[4]); > if (!r) r = do_rsc(s[7]); > if (!r) r = do_crd(s[0], s[1], s[2]); > if (!r) r = do_ioe(s[6]); > if (!r) r = do_exec(argv); > } > > wrn(r); > if (abf_cmt()) if (!r || r == 4) r = -1; > return r2e(r); > } > > > On 7/16/06, Otto Moerbeek <[EMAIL PROTECTED]> wrote: > > > > On Sun, 16 Jul 2006, Gustavo Rios wrote: > > > > > Hey folks, > > > > > > i am trying to set a process as the session leader of its own. I wrote > > > a simple program that handles that. It is working when i call it from > > > my shell command line: > > > > > > $ sux -s -e -E \ > > > > > PATH==/home/grios/.bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:/usr/games:/asd/bin:/asd/sbin:/asd/thr=,ASDROOT==/asd= > > > /asd/sbin/algr algr argm ............ > > > > > > But when i write a simple shell script like in : > > > > > > #!/bin/sh > > > sux -s -e -E \ > > > > > PATH==/home/grios/.bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:/usr/games:/asd/bin:/asd/sbin:/asd/thr=,ASDROOT==/asd= > > > /asd/sbin/algr algr argm ............ > > > > > > The process is not put on its own session as a leader the (setsid) > > > returns no errors. > > > > > > Does anybody have any ideia what the behavior problem i am not seeing ? > > > > Please show the code. > > > > How do you check if the program has become session leader? > > > > Any other process group/session stuff being done in your program? > > > > -Otto