getlogin(3)

الاسم
getlogin, getlogin_r, cuserid - الحصول على اسم المستخدم

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <unistd.h>

char *getlogin(void);
int getlogin_r(size_t bufsize;
               char buf[bufsize], size_t bufsize);

#include <stdio.h>

char *cuserid(char *string);

    متطلبات ماكروات اختبار الميزات لـ glibc (انظر feature_test_macros(7)):

getlogin_r():
    _POSIX_C_SOURCE >= 199506L

cuserid():
    منذ glibc 2.24:
        (_XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L)
            || _GNU_SOURCE
    حتى glibc 2.23:
        _XOPEN_SOURCE

الوصف
ترجع getlogin() مؤشرًا إلى سلسلة محارف تحتوي على اسم المستخدم المسجل الدخول على الطرفية المسيطرة للعملية، أو مؤشرًا فارغًا إذا تعذر تحديد هذه المعلومات. السلسلة مخصصة بشكل ثابت وقد تُستبدل في الاستدعاءات اللاحقة لهذه الدالة أو لدالة cuserid().

ترجع getlogin_r() اسم المستخدم نفسه في المصفوفة buf ذات الحجم bufsize.

ترجع cuserid() مؤشرًا إلى سلسلة محارف تحتوي على اسم مستخدم مرتبط بمعرف المستخدم الفعّال للعملية. إذا لم يكن string مؤشرًا فارغًا، فيجب أن يكون مصفوفة يمكنها استيعاب L_cuserid حرفًا على الأقل؛ تُرجع السلسلة في هذه المصفوفة. وإلا، يُرجع مؤشر إلى سلسلة في منطقة ثابتة. هذه السلسلة مخصصة بشكل ثابت وقد تُستبدل في الاستدعاءات اللاحقة لهذه الدالة أو لدالة getlogin().

الماكرو L_cuserid هو ثابت صحيح يشير إلى طول المصفوفة التي قد تحتاجها لتخزين اسم مستخدم. يُصرّح عن L_cuserid في <stdio.h>.

تسمح هذه الدوال لبرنامجك بتحديد المستخدم الذي يشغّل (cuserid()) أو المستخدم الذي سجل الدخول في هذه الجلسة (getlogin()). (يمكن أن يختلفا عند تضمين برامج set-user-ID.)

لأغراض معظمها، من الأكثر فائدة استخدام متغير البيئة LOGNAME لمعرفة من هو المستخدم. هذا أكثر مرونة تحديدًا لأن المستخدم يمكنه ضبط LOGNAME بشكل تعسفي.

قيمة الإرجاع
ترجع getlogin() مؤشرًا إلى اسم المستخدم عند النجاح، وNULL عند الفشل، مع ضبط errno للإشارة إلى الخطأ. ترجع getlogin_r() 0 عند النجاح، وقيمة غير صفرية عند الفشل.

الأخطاء
يحدد POSIX:

EMFILE
    وُصل إلى الحد الأقصى لواصفات الملفات المفتوحة لكل عملية.

ENFILE
    وُصل إلى الحد الأقصى لإجمالي عدد الملفات المفتوحة على مستوى النظام.

ENXIO
    لا تملك العملية المستدعية طرفية مسيطرة.

ERANGE
    (getlogin_r) طول اسم المستخدم، بما في ذلك البايت الفارغ الختامي ('\0')، أكبر من bufsize.

لدى Linux/glibc أيضًا:

ENOENT
    لم يوجد إدخال مقابل في ملف utmp.

ENOMEM
    ذاكرة غير كافية لتخصيص بنية passwd.

ENOTTY
    لم يُشر الإدخال المعياري إلى طرفية. (انظر الأخطاء.)

الملفات

/etc/passwd
    ملف قاعدة بيانات كلمات السر

/var/run/utmp
    (تقليديًا /etc/utmp؛ استخدمت بعض إصدارات libc /var/adm/utmp)

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
getlogin() | سلامة الخيوط | MT-Unsafe race:getlogin race:utent sig:ALRM timer locale
getlogin_r() | سلامة الخيوط | MT-Unsafe race:utent sig:ALRM timer locale
cuserid() | سلامة الخيوط | MT-Unsafe race:cuserid/!string locale

في الجدول أعلاه، يشير utent في race:utent إلى أنه إذا استُخدمت أي من الدوال setutent(3) أو getutent(3) أو endutent(3) بالتوازي في خيوط مختلفة من برنامج، فقد تحدث سباقات بيانات. تستدعي getlogin() و getlogin_r() تلك الدوال، لذا نستخدم race:utent لتذكير المستخدمين.

الإصدارات
لدى OpenBSD getlogin() و setlogin()، واسم مستخدم مرتبط بجلسة، حتى لو لم يكن لها طرفية تحكم.

المعايير

getlogin()
getlogin_r()
    POSIX.1-2008.

cuserid()
    لا شيء.

المعايير

getlogin()
getlogin_r():
    POSIX.1-2001. OpenBSD.

cuserid()
    System V, POSIX.1-1988. أُزيل في POSIX.1-1990. SUSv2. أُزيل في POSIX.1-2001.

    لدى System V دالة cuserid() تستخدم معرف المستخدم الحقيقي بدلاً من معرف المستخدم الفعّال.

العلل
لسوء الحظ، غالبًا ما يكون خداع getlogin() سهلاً. أحيانًا لا تعمل على الإطلاق، لأن بعض البرامج أفسدت ملف utmp. غالبًا، تُعطي فقط أول 8 محارف من اسم الدخول. المستخدم المسجل حاليًا على طرفية التحكم لبرنامجنا ليس بالضرورة المستخدم الذي بدأه. تجنب getlogin() للأغراض المتعلقة بالأمان.

لاحظ أن glibc لا تتبع مواصفات POSIX وتستخدم stdin بدلاً من /dev/tty. خطأ. (الأنظمة الحديثة الأخرى، مثل SunOS 5.8 و HP-UX 11.11 و FreeBSD 4.8، جميعها تُرجع اسم الدخول أيضًا عند إعادة توجيه stdin.)

لا أحد يعرف بالضبط ما تفعله cuserid()؛ تجنبها في البرامج المحمولة. أو تجنبها تمامًا: استخدم getpwuid(geteuid()) بدلاً من ذلك، إذا كان هذا ما قصدته. لا تستخدم cuserid().

انظر أيضًا
logname(1), geteuid(2), getuid(2), utmp(5)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.